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 001/810] 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 0fab8b3a..5d3dfc61 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -31,7 +31,8 @@ module Jekyll 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 @@ module Jekyll 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 @@ module Jekyll 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 002/810] 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 5d3dfc61..8da68956 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -95,13 +95,10 @@ module Jekyll 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 003/810] 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 8da68956..d238f0d1 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -66,9 +66,7 @@ module Jekyll 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 @@ module Jekyll 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 004/810] 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 00000000..a6a79f93 --- /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 00000000..21f679f3 --- /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 00000000..a6a79f93 --- /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 00000000..43fa602c --- /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 82bb18176fdae9c0370f0ba75b03fcde7a8cd549 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Mon, 25 May 2015 16:09:16 -0400 Subject: [PATCH 005/810] use jekyll-feed --- Gemfile | 1 + site/_config.yml | 7 ++++++ site/_includes/top.html | 2 +- site/feed.xml | 48 ----------------------------------------- 4 files changed, 9 insertions(+), 49 deletions(-) delete mode 100644 site/feed.xml diff --git a/Gemfile b/Gemfile index 1a594a9b..5f10b999 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,7 @@ gem 'toml', '~> 0.1.0' gem 'jekyll-paginate', '~> 1.0' gem 'jekyll-gist', '~> 1.0' gem 'jekyll-coffeescript', '~> 1.0' +gem 'jekyll-feed' platform :ruby, :mswin, :mingw do gem 'pygments.rb', '~> 0.6.0' diff --git a/site/_config.yml b/site/_config.yml index 46ba6f99..d1cd5367 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -12,3 +12,10 @@ help_url: https://github.com/jekyll/jekyll-help collections: docs: output: true + +name: Jekyll • Simple, blog-aware, static sites +description: Transform your plain text into static websites and blogs +url: http://jekyllrb.com + +gems: + - jekyll-feed diff --git a/site/_includes/top.html b/site/_includes/top.html index 35ba2f26..2d12d1bd 100644 --- a/site/_includes/top.html +++ b/site/_includes/top.html @@ -5,7 +5,7 @@ {{ page.title }} - + {% feed_meta %} diff --git a/site/feed.xml b/site/feed.xml deleted file mode 100644 index 1a683be1..00000000 --- a/site/feed.xml +++ /dev/null @@ -1,48 +0,0 @@ ---- -permalink: /feed.xml ---- - - - - - Jekyll • Simple, blog-aware, static sites - - http://jekyllrb.com/ - {{ site.time | date_to_rfc822 }} - {{ site.time | date_to_rfc822 }} - en-US - Jekyll v{{ jekyll.version }} - Transform your plain text into static websites and blogs. - - Transform your plain text into static websites and blogs. - http://jekyllrb.com/img/logo-rss.png - Jekyll • Simple, blog-aware, static sites - http://jekyllrb.com/ - 144 - 73 - - {% for post in site.posts %} - - {{ post.title | xml_escape}} - http://jekyllrb.com{{ post.url }} - {{ post.date | date_to_rfc822 }} - {{ post.author }} - {% for tag in post.tags %} - {{ tag | xml_escape }} - {% endfor %} - {% for cat in post.categories %} - {{ cat | xml_escape }} - {% endfor %} - http://jekyllrb.com{{ post.url }} - {{ post.content | xml_escape }} - - {% endfor %} - - From 872efb0bccf738415165794f316d854dd936052d Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Tue, 9 Jun 2015 12:07:56 -0400 Subject: [PATCH 006/810] Add Python to requirements for Jekyll 2 --- site/_docs/installation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/installation.md b/site/_docs/installation.md index aee4b594..b2926ccf 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -20,6 +20,7 @@ requirements you’ll need to make sure your system has before you start. - Linux, Unix, or Mac OS X - [NodeJS](http://nodejs.org), or another JavaScript runtime (for CoffeeScript support). +- Python (Jekyll 2 and earlier)
Running Jekyll on Windows
From 34438ed325423a75248cd6bd2927b69b39bfa217 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 9 Jun 2015 19:10:55 -0500 Subject: [PATCH 007/810] 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 30c7ef36..7633ccf7 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 @@ module Jekyll 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 008/810] 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 7633ccf7..e3c89934 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -91,7 +91,7 @@ module Jekyll 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 a14f08b2bf53d3de244c596baadf2c8e70c33610 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Thu, 18 Jun 2015 17:55:57 -0400 Subject: [PATCH 009/810] Clarify CoffeeScript requirement --- 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 b2926ccf..5ca2bb51 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -18,8 +18,8 @@ requirements you’ll need to make sure your system has before you start. headers) - [RubyGems](http://rubygems.org/pages/download) - Linux, Unix, or Mac OS X -- [NodeJS](http://nodejs.org), or another JavaScript runtime (for - CoffeeScript support). +- [NodeJS](http://nodejs.org), or another JavaScript runtime (Jekyll 2 and +earlier, for CoffeeScript support). - Python (Jekyll 2 and earlier)
From 4dd66e9448672b202a8cc60733a861d87cb31fc3 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Thu, 25 Jun 2015 09:54:42 -0400 Subject: [PATCH 010/810] Add missing flag to disable the watcher --- 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 f9ac4eaa..33f4b642 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -180,7 +180,7 @@ class="flag">flags (specified on the command-line) that control them.

Enable auto-regeneration of the site when files are modified.

-

-w, --watch

+

-w, --watch, --no-watch

From 5db3b5d7090f81e4c736f1c461dd6249b735cc55 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Thu, 25 Jun 2015 17:30:50 -0400 Subject: [PATCH 011/810] Use square brackets instead --- 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 33f4b642..ad7764b0 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -180,7 +180,7 @@ class="flag">flags (specified on the command-line) that control them.

Enable auto-regeneration of the site when files are modified.

-

-w, --watch, --no-watch

+

-w, --[no-]watch

From 6d196275fcfa25938a3f0ff8fcbee3f58939cb1a Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 30 Jun 2015 20:53:31 +0200 Subject: [PATCH 012/810] Add build options (fixes #3744) --- lib/jekyll/commands/clean.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/jekyll/commands/clean.rb b/lib/jekyll/commands/clean.rb index 7d787d30..bf05dbe0 100644 --- a/lib/jekyll/commands/clean.rb +++ b/lib/jekyll/commands/clean.rb @@ -8,6 +8,8 @@ module Jekyll c.syntax 'clean [subcommand]' c.description 'Clean the site (removes site output and metadata file) without building.' + add_build_options(c) + c.action do |args, _| Jekyll::Commands::Clean.process({}) end From b9f8fc1715d9d5413c33bb61d997d2e7a5d80719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnter=20Kits?= Date: Mon, 6 Jul 2015 21:02:56 +0300 Subject: [PATCH 013/810] Fixes #3836. Fix site template header menu iteration variables --- lib/site_template/_includes/header.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/site_template/_includes/header.html b/lib/site_template/_includes/header.html index cfe381f7..b3f86db8 100644 --- a/lib/site_template/_includes/header.html +++ b/lib/site_template/_includes/header.html @@ -14,9 +14,9 @@
- {% for page in site.pages %} - {% if page.title %} - {{ page.title }} + {% for my_page in site.pages %} + {% if my_page.title %} + {{ my_page.title }} {% endif %} {% endfor %}
From 8bdfdae0abd37a44985d33cab72e272f08ce5fa4 Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Thu, 9 Jul 2015 13:40:36 -0400 Subject: [PATCH 014/810] Fix reading of binary metadata file --- lib/jekyll/regenerator.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 18a54ae3..d5d74ec9 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -130,9 +130,7 @@ module Jekyll # # Returns nothing. def write_metadata - File.open(metadata_file, 'wb') do |f| - f.write(Marshal.dump(metadata)) - end + File.binwrite(metadata_file, Marshal.dump(metadata)) end # Produce the absolute path of the metadata file @@ -158,7 +156,7 @@ module Jekyll # Returns the read metadata. def read_metadata @metadata = if !disabled? && File.file?(metadata_file) - content = File.read(metadata_file) + content = File.binread(metadata_file) begin Marshal.load(content) From dba6df907fc0040c308a68f0930ef456b0a44cf4 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 16 Jul 2015 08:36:44 -0500 Subject: [PATCH 015/810] Update Kramdown. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 1d0caa3b..0a7358de 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,7 @@ gem 'cucumber', '~> 2.0' gem 'launchy', '~> 2.3' gem 'simplecov', '~> 0.9' gem 'mime-types', '~> 2.6' -gem 'kramdown', '~> 1.7.0' +gem 'kramdown', '~> 1.8.0' gem 'jekyll_test_plugin' gem 'jekyll_test_plugin_malicious' gem 'minitest-reporters' From 910cab5f84cc6c46d9135afdede878d8a2952e43 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 16 Jul 2015 08:39:57 -0500 Subject: [PATCH 016/810] Update history.markdown to reflect the merger of #3845. --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d0738c09..3b62234d 100644 --- a/History.markdown +++ b/History.markdown @@ -120,6 +120,7 @@ * 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) ### Development Fixes From 56622c7ab617741c765521e2aacfc59bfd8f7319 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 16 Jul 2015 14:16:47 -0500 Subject: [PATCH 017/810] Update history.markdown to reflect the merger of #3853. --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3b62234d..71dfe88b 100644 --- a/History.markdown +++ b/History.markdown @@ -152,6 +152,7 @@ * 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) ### Site Enhancements From 5af105ca71f133ab129df9fbfb92931bab0f353d Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 16 Jul 2015 08:23:35 -0500 Subject: [PATCH 018/810] Try to organize dependencies into dev and test groups. --- Gemfile | 85 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/Gemfile b/Gemfile index 0a7358de..7c374c7c 100644 --- a/Gemfile +++ b/Gemfile @@ -1,47 +1,54 @@ source 'https://rubygems.org' gemspec -gem 'pry' -gem 'toml', '~> 0.1.0' -gem 'jekyll-paginate', '~> 1.0' -gem 'jekyll-gist', '~> 1.0' -gem 'jekyll-coffeescript', '~> 1.0' - -platform :ruby, :mswin, :mingw do - gem 'pygments.rb', '~> 0.6.0' - gem 'rdiscount', '~> 2.0' - gem 'classifier-reborn', '~> 2.0' - gem 'redcarpet', '~> 3.2', '>= 3.2.3' - gem 'liquid-c', '~> 3.0' -end - -if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") - gem 'test-unit' -end - gem 'rake', '~> 10.1' -gem 'rdoc', '~> 4.2' -gem 'redgreen', '~> 1.2' -gem 'shoulda', '~> 3.5' -gem 'cucumber', '~> 2.0' -gem 'launchy', '~> 2.3' -gem 'simplecov', '~> 0.9' +group :development do + gem 'rdoc', '~> 4.2' + gem 'launchy', '~> 2.3' + gem 'toml', '~> 0.1.0' + gem 'pry' +end + +group :test do + gem 'redgreen', '~> 1.2' + gem 'shoulda', '~> 3.5' + gem 'cucumber', '~> 2.0' + gem 'simplecov', '~> 0.9' + gem 'jekyll_test_plugin' + gem 'jekyll_test_plugin_malicious' + gem 'minitest-reporters' + gem 'minitest-profile' + gem 'minitest' + gem 'rspec-mocks' + + if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") + gem 'test-unit' + end + + if ENV['PROOF'] + gem 'html-proofer', '~> 2.0' + end +end + +group :benchmark do + if ENV['BENCHMARK'] + gem 'ruby-prof' + gem 'rbtrace' + gem 'stackprof' + gem 'benchmark-ips' + end +end + +gem 'jekyll-paginate', '~> 1.0' +gem 'jekyll-coffeescript', '~> 1.0' +gem 'jekyll-gist', '~> 1.0' gem 'mime-types', '~> 2.6' gem 'kramdown', '~> 1.8.0' -gem 'jekyll_test_plugin' -gem 'jekyll_test_plugin_malicious' -gem 'minitest-reporters' -gem 'minitest-profile' -gem 'minitest' -gem 'rspec-mocks' -if ENV['BENCHMARK'] - gem 'ruby-prof' - gem 'rbtrace' - gem 'stackprof' - gem 'benchmark-ips' -end - -if ENV['PROOF'] - gem 'html-proofer', '~> 2.0' +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 b0fa2462a6bb0ebb1e9795cf7d0db70d6937bc3f Mon Sep 17 00:00:00 2001 From: AJ Acevedo Date: Sat, 18 Jul 2015 21:49:10 -0400 Subject: [PATCH 019/810] Updated the scripts shebang for portability - Updated all of the sh and bash shebangs for consistency and portability. - set -e to the test script for portability Resolves #3857 --- script/bootstrap | 2 +- script/branding | 2 +- script/cibuild | 2 +- script/cucumber | 2 +- script/proof | 2 +- script/rebund | 2 +- script/rubyprof | 1 + script/test | 3 ++- 8 files changed, 9 insertions(+), 7 deletions(-) diff --git a/script/bootstrap b/script/bootstrap index 99756046..054a2c24 100755 --- a/script/bootstrap +++ b/script/bootstrap @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash script/branding bundle install -j8 diff --git a/script/branding b/script/branding index 2df6c670..2708f4d1 100755 --- a/script/branding +++ b/script/branding @@ -1,4 +1,4 @@ -#! /bin/bash +#!/usr/bin/env bash echo " ---------------------------------------------------------- " echo " _ ______ _ __ __ __ _ _ " diff --git a/script/cibuild b/script/cibuild index dade701b..afafd7d0 100755 --- a/script/cibuild +++ b/script/cibuild @@ -1,4 +1,4 @@ -#! /bin/bash -e +#!/usr/bin/env bash script/branding diff --git a/script/cucumber b/script/cucumber index 31a9be63..13508c84 100755 --- a/script/cucumber +++ b/script/cucumber @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash if ruby --version | grep -q "jruby" then diff --git a/script/proof b/script/proof index 7c90b753..c8fff908 100755 --- a/script/proof +++ b/script/proof @@ -1,4 +1,4 @@ -#! /bin/bash +#!/usr/bin/env bash # # Usage: # script/proof diff --git a/script/rebund b/script/rebund index 2e8d3b1f..d2ff7901 100755 --- a/script/rebund +++ b/script/rebund @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # rebund(1) # diff --git a/script/rubyprof b/script/rubyprof index cac68ae7..520dc86e 100755 --- a/script/rubyprof +++ b/script/rubyprof @@ -1,4 +1,5 @@ #!/usr/bin/env bash + export BENCHMARK=1 TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site', 'full_rebuild' => true})" diff --git a/script/test b/script/test index e4e44f09..5aab2f06 100755 --- a/script/test +++ b/script/test @@ -1,4 +1,5 @@ -#! /bin/bash -e +#!/usr/bin/env bash +set -e # Usage: # script/test From fe363290045b0a8c5baf0549e95cf31e64b343ec Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 19 Jul 2015 20:26:11 -0700 Subject: [PATCH 020/810] Update history to reflect merge of #3858 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 71dfe88b..fa6b65ca 100644 --- a/History.markdown +++ b/History.markdown @@ -153,6 +153,7 @@ * Add `script/rubyprof` to generate cachegrind callgraphs (#3692) * Upgrade cucumber to 2.x (#3795) * Update Kramdown. (#3853) + * Updated the scripts shebang for portability (#3858) ### Site Enhancements From 8c485155ce846ce7835c3ef93b3f0eca6d680abf Mon Sep 17 00:00:00 2001 From: Max White Date: Fri, 24 Jul 2015 23:38:36 +0100 Subject: [PATCH 021/810] Added documentation for new Static Publisher tool --- site/_docs/deployment-methods.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index d9dd7ea2..5127af86 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -84,6 +84,10 @@ host your site directly on a CDN or file host like S3. Setup steps are fully documented [in the `jekyll-hook` repo](https://github.com/developmentseed/jekyll-hook). +### Static Publisher + +[Static Publisher](https://github.com/static-publisher/static-publisher) is another automated deployment option with a server listening for webhook posts, though it's not tied to GitHub specifically. It has a one-click deploy to Heroku, it can watch multiple projects from one server, it has an easy to user admin interface and can publish to either S3 or to a git repository (e.g. gh-pages). + ### Rake Another way to deploy your Jekyll site is to use [Rake](https://github.com/jimweirich/rake), [HighLine](https://github.com/JEG2/highline), and From 3ab386f1b096be25a24fe038fc70fd0fb08d545d Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 24 Jul 2015 23:43:55 -0500 Subject: [PATCH 022/810] Update to JRuby 9K Even though JRuby 9K on Travis still apparently points to pre1 we are updating so that when it finally points to stable release we can get those builds, once jruby-head diverges enough again we will re-add it to the list and start testing the next build and move JRuby 9K. Remember though, JRuby support is still experimental. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1b25cf93..3d40a501 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,10 +5,10 @@ rvm: - 2.2 - 2.1 - 2.0 -- jruby-head +- jruby-9.0.0.0 matrix: allow_failures: - - rvm: jruby-head + - rvm: jruby-9.0.0.0 env: matrix: - TEST_SUITE=test From 3e29aaf785a1a46142953a3a855a238c40e90ca5 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 24 Jul 2015 23:46:17 -0500 Subject: [PATCH 023/810] Update history.markdown to reflect the commit https://github.com/jekyll/jekyll/commit/3ab386f1b096be25a24fe038fc70fd0fb08d545d --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fa6b65ca..083e8415 100644 --- a/History.markdown +++ b/History.markdown @@ -154,6 +154,7 @@ * 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)) ### Site Enhancements From 7c4f319442b6b7a457d35cef2fc1b7a480b30850 Mon Sep 17 00:00:00 2001 From: Stephen Crosby Date: Mon, 27 Jul 2015 14:24:37 -0700 Subject: [PATCH 024/810] #3870 trigger hooks by owner symbol --- lib/jekyll/convertible.rb | 15 ++++++++++++--- lib/jekyll/document.rb | 2 +- lib/jekyll/hooks.rb | 20 +++++--------------- lib/jekyll/page.rb | 2 +- lib/jekyll/post.rb | 2 +- lib/jekyll/renderer.rb | 2 +- lib/jekyll/site.rb | 10 +++++----- 7 files changed, 26 insertions(+), 27 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 0cf8e1c1..49a77c54 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -144,6 +144,15 @@ module Jekyll end end + # returns the owner symbol for hook triggering + def hook_owner + if is_a?(Post) + :post + elsif is_a?(Page) + :page + end + end + # Determine whether the document is an asset file. # Asset files include CoffeeScript files and Sass/SCSS files. # @@ -236,7 +245,7 @@ module Jekyll # # Returns nothing. def do_layout(payload, layouts) - Jekyll::Hooks.trigger self, :pre_render, payload + 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) @@ -250,7 +259,7 @@ module Jekyll self.output = content render_all_layouts(layouts, payload, info) if place_in_layout? - Jekyll::Hooks.trigger self, :post_render + Jekyll::Hooks.trigger hook_owner, :post_render, self end # Write the generated page file to the destination directory. @@ -264,7 +273,7 @@ module Jekyll File.open(path, 'wb') do |f| f.write(output) end - Jekyll::Hooks.trigger self, :post_write + Jekyll::Hooks.trigger hook_owner, :post_write, self end # Accessor for data properties by Liquid. diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 045bdacb..da07a995 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -190,7 +190,7 @@ module Jekyll f.write(output) end - Jekyll::Hooks.trigger self, :post_write + Jekyll::Hooks.trigger :document, :post_write, self end # Returns merged option hash for File.read of self.site (if exists) diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index d01cae4c..98ea263f 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -1,13 +1,5 @@ module Jekyll module Hooks - # Helps look up hooks from the registry by owner's class - OWNER_MAP = { - Jekyll::Site => :site, - Jekyll::Page => :page, - Jekyll::Post => :post, - Jekyll::Document => :document, - }.freeze - DEFAULT_PRIORITY = 20 # compatibility layer for octopress-hooks users @@ -88,19 +80,17 @@ module Jekyll end # interface for Jekyll core components to trigger hooks - def self.trigger(instance, event, *args) - owner_symbol = OWNER_MAP[instance.class] - + def self.trigger(owner, event, *args) # proceed only if there are hooks to call - return unless @registry[owner_symbol] - return unless @registry[owner_symbol][event] + return unless @registry[owner] + return unless @registry[owner][event] # hooks to call for this owner and event - hooks = @registry[owner_symbol][event] + hooks = @registry[owner][event] # sort and call hooks according to priority and load order hooks.sort_by { |h| @hook_priority[h] }.each do |hook| - hook.call(instance, *args) + hook.call(*args) end end end diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index f9040da8..431878b2 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -36,7 +36,7 @@ module Jekyll site.frontmatter_defaults.find(File.join(dir, name), type, key) end - Jekyll::Hooks.trigger self, :post_init + Jekyll::Hooks.trigger :page, :post_init, self end # The generated directory into which the page will be placed diff --git a/lib/jekyll/post.rb b/lib/jekyll/post.rb index 252cca42..62973d1d 100644 --- a/lib/jekyll/post.rb +++ b/lib/jekyll/post.rb @@ -69,7 +69,7 @@ module Jekyll populate_categories populate_tags - Jekyll::Hooks.trigger self, :post_init + Jekyll::Hooks.trigger :post, :post_init, self end def published? diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index ca79e5a8..f03315ef 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -35,7 +35,7 @@ module Jekyll "page" => document.to_liquid }, site_payload || site.site_payload) - Jekyll::Hooks.trigger document, :pre_render, payload + Jekyll::Hooks.trigger :document, :pre_render, document, payload info = { filters: [Jekyll::Filters], diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index a1ea8644..78d4db8b 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -86,7 +86,7 @@ module Jekyll raise ArgumentError, "limit_posts must be a non-negative number" end - Jekyll::Hooks.trigger self, :after_reset + Jekyll::Hooks.trigger :site, :after_reset, self end # Load necessary libraries, plugins, converters, and generators. @@ -144,7 +144,7 @@ module Jekyll def read reader.read limit_posts! - Jekyll::Hooks.trigger self, :post_read + Jekyll::Hooks.trigger :site, :post_read, self end # Run each of the Generators. @@ -164,13 +164,13 @@ module Jekyll payload = site_payload - Jekyll::Hooks.trigger self, :pre_render, payload + Jekyll::Hooks.trigger :site, :pre_render, self, payload collections.each do |label, collection| collection.docs.each do |document| if regenerator.regenerate?(document) document.output = Jekyll::Renderer.new(self, document, payload).run - Jekyll::Hooks.trigger document, :post_render + Jekyll::Hooks.trigger :document, :post_render, document end end end @@ -199,7 +199,7 @@ module Jekyll item.write(dest) if regenerator.regenerate?(item) } regenerator.write_metadata - Jekyll::Hooks.trigger self, :post_write + Jekyll::Hooks.trigger :site, :post_write, self end # Construct a Hash of Posts indexed by the specified Post attribute. From 611489aae1a076de6b00670201babeb74d9eef0b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 28 Jul 2015 11:29:42 -0700 Subject: [PATCH 025/810] Update history to reflect merge of #3838 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 083e8415..466a7fa6 100644 --- a/History.markdown +++ b/History.markdown @@ -121,6 +121,7 @@ * 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) ### Development Fixes From 498ad6e83ae0b7a32ecdb3c4c8daef6edc071c21 Mon Sep 17 00:00:00 2001 From: Vitaly Repin Date: Mon, 13 Jul 2015 16:20:12 +0300 Subject: [PATCH 026/810] Detailed instructions for rsync deployment method Extended documentation on rsync-approach. It also mentions rrsync wrapper script which restricts access for rsync to the server. Based on my blog post here: http://vrepin.org/vr/JekyllDeploy/ Restored previous version of 'Rsync' section and renamed it to 'scp' to reflect the content Misspelling corrected: authorized_keys, not auhorized_key --- site/_docs/deployment-methods.md | 66 +++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index d9dd7ea2..8affad7a 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -89,11 +89,73 @@ Setup steps are fully documented Another way to deploy your Jekyll site is to use [Rake](https://github.com/jimweirich/rake), [HighLine](https://github.com/JEG2/highline), and [Net::SSH](https://github.com/net-ssh/net-ssh). A more complex example of deploying Jekyll with Rake that deals with multiple branches can be found in [Git Ready](https://github.com/gitready/gitready/blob/cdfbc4ec5321ff8d18c3ce936e9c749dbbc4f190/Rakefile). + +### scp + +Once you’ve generated the `_site` directory, you can easily scp it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/henrik/henrik.nyh.se/blob/master/script/deploy). You’d obviously need to change the values to reflect your site’s details. There is even [a matching TextMate command](http://gist.github.com/214959) that will help you run this script from within Textmate. + ### rsync -Once 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/henrik/henrik.nyh.se/blob/master/script/deploy). You’d obviously need to change the values to reflect your site’s details. There is even [a matching TextMate command](http://gist.github.com/214959) that will help you run -this script from within Textmate. +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) + +We will use certificate-based authorization to simplify the publishing process. It makes sense to restrict rsync access only to the directory which it is supposed to sync. + +That's why rrsync wrapper shall be installed. If it is not already installed by your hoster you can do it yourself: + +- [download rrsync](http://ftp.samba.org/pub/unpacked/rsync/support/rrsync) +- Put it to the bin subdirectory of your home folder (```~/bin```) +- Make it executable (```chmod +x```) + +#### Step 2: Setup certificate-based ssh access (server side) + +[This process is described in a lot of places in the net](https://wiki.gentoo.org/wiki/SSH#Passwordless_Authentication). We will not cover it here. What is different from usual approach is to put the restriction to certificate-based authorization in ```~/.ssh/authorized_keys```). We will launch ```rrsync``` utility and supply it with the folder it shall have read-write access to: + +``` +command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa +``` + +`````` is the path to your site. E.g., ```~/public_html/you.org/blog-html/```. + +#### Step 3: Rsync! (client-side) + +Add the script ```deploy``` to the web site source folder: + +{% highlight shell %} +#!/bin/sh + +rsync -avr --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 + +Example command line is: + +{% highlight shell %} +rsync -avr --rsh='ssh -p2222' --delete-after --delete-excluded _site/ hostuser@vrepin.org: +{% endhighlight %} + +Don't forget column ':' after server name! + +#### Optional step 4: exclude transfer.sh from being copied to the output folder by Jekyll + +This step is recommended if you use this how-to to deploy Jekyll-based web site. If you put ```deploy``` script to the root folder of your project, Jekyll copies it to the output folder. +This behavior can be changed in ```_config.yml```. Just add the following line there: + +{% highlight yaml %} +# Do not copy these file to the output directory +exclude: ["deploy"] +{% endhighlight %} + +#### We are done! + +Now it's possible to publish your web site by launching ```deploy``` script. If your ssh certificate is [passphrase-protected](https://martin.kleppmann.com/2013/05/24/improving-security-of-ssh-private-keys.html), you are asked to enter the password. ## Rack-Jekyll From 0b790593105febec8dea46e790f893b3a69cf7de Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Jul 2015 10:33:05 -0700 Subject: [PATCH 027/810] Update history to reflect merge of #3848 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 466a7fa6..584ba12b 100644 --- a/History.markdown +++ b/History.markdown @@ -222,6 +222,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 432ff579d9df4febb0641a298cce19f183d1f813 Mon Sep 17 00:00:00 2001 From: Shannon Date: Sat, 1 Aug 2015 13:47:45 -0500 Subject: [PATCH 028/810] Add Jekyll Portfolio Generator to 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 023bc572..c8d3e288 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -711,6 +711,7 @@ LESS.js files during generation. - [Jekyll::GitMetadata by Ivan Tse](https://github.com/ivantsepp/jekyll-git_metadata): Expose Git metadata for your templates. - [Jekyll Http Basic Auth Plugin](https://gist.github.com/snrbrnjna/422a4b7e017192c284b3): Plugin to manage http basic auth for jekyll generated pages and directories. - [Jekyll Auto Image by Merlos](https://github.com/merlos/jekyll-auto-image): Gets the first image of a post. Useful to list your posts with images or to add [twitter cards](https://dev.twitter.com/cards/overview) to your site. +- [Jekyll Portfolio Generator by Shannon Babincsak](https://github.com/codeinpink/jekyll-portfolio-generator): Generates project pages and computes related projects out of project data files. #### Converters From 5cfef073a5db532c163ce053dce91500c0764c7e Mon Sep 17 00:00:00 2001 From: Peter Robins Date: Sat, 1 Aug 2015 11:54:59 +0100 Subject: [PATCH 029/810] Add site.html_files to variables docs and improve site.html_pages --- site/_docs/variables.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/site/_docs/variables.md b/site/_docs/variables.md index d3c5d946..d4fb5293 100644 --- a/site/_docs/variables.md +++ b/site/_docs/variables.md @@ -125,7 +125,15 @@ following is a reference of the available data.

site.html_pages

- A list of all HTML Pages. + A subset of `site.pages` listing those which end in `.html`. + +

+ + +

site.html_files

+

+ + A subset of `site.static_files` listing those which end in `.html`.

From 371ca58e69a378ab4cb8134f8f6dc507945c2732 Mon Sep 17 00:00:00 2001 From: Robert Papp Date: Mon, 15 Jun 2015 00:15:15 +0200 Subject: [PATCH 030/810] Fixes #3776 by changing to the correct name for whitelisting. --- lib/jekyll/tags/highlight.rb | 2 +- test/test_tags.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index e644146f..de8a7393 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -64,7 +64,7 @@ eos if is_safe Hash[[ [:startinline, opts.fetch(:startinline, nil)], - [:hl_linenos, opts.fetch(:hl_linenos, nil)], + [:hl_lines, opts.fetch(:hl_lines, nil)], [:linenos, opts.fetch(:linenos, nil)], [:encoding, opts.fetch(:encoding, 'utf-8')], [:cssclass, opts.fetch(:cssclass, nil)] diff --git a/test/test_tags.rb b/test/test_tags.rb index ef919ede..0da6d7b6 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -114,9 +114,9 @@ CONTENT assert_equal true, sanitized[:linenos] end - should "allow hl_linenos" do - sanitized = @tag.sanitized_opts({:hl_linenos => %w[1 2 3 4]}, true) - assert_equal %w[1 2 3 4], sanitized[:hl_linenos] + should "allow hl_lines" do + sanitized = @tag.sanitized_opts({:hl_lines => %w[1 2 3 4]}, true) + assert_equal %w[1 2 3 4], sanitized[:hl_lines] end should "allow cssclass" do From 90586d229cb491a680a9db5e75e6148886f65787 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 4 Aug 2015 16:11:51 -0700 Subject: [PATCH 031/810] Update history to reflect merge of #3787 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 584ba12b..575b8782 100644 --- a/History.markdown +++ b/History.markdown @@ -122,6 +122,7 @@ * 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) ### Development Fixes From 76c96fc7ac04fdb7c0d3323344c964ce839edbf5 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 4 Aug 2015 16:12:19 -0700 Subject: [PATCH 032/810] Update history to reflect merge of #3883 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 575b8782..5e1a17b7 100644 --- a/History.markdown +++ b/History.markdown @@ -224,6 +224,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 84ca5780dff58593d02bc590a67914e20741a3e3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 4 Aug 2015 16:12:56 -0700 Subject: [PATCH 033/810] Update history to reflect merge of #3880 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5e1a17b7..4ecf96f9 100644 --- a/History.markdown +++ b/History.markdown @@ -225,6 +225,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 775645e31c7db569f406019bd8df134db178dfa6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 4 Aug 2015 16:14:28 -0700 Subject: [PATCH 034/810] Update history to reflect merge of #3865 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4ecf96f9..81485294 100644 --- a/History.markdown +++ b/History.markdown @@ -226,6 +226,7 @@ * 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) ## 2.5.3 / 2014-12-22 From e9b1f6db3d15c2553b417fda2f5a2f16a223634a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 4 Aug 2015 16:15:24 -0700 Subject: [PATCH 035/810] Update history to reflect merge of #3852 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 81485294..58074685 100644 --- a/History.markdown +++ b/History.markdown @@ -157,6 +157,7 @@ * 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) ### Site Enhancements From a849674f7d19b5d3d411c33aa121201cb332443e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 4 Aug 2015 16:16:15 -0700 Subject: [PATCH 036/810] Update history to reflect merge of #3820 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 58074685..bec3cca6 100644 --- a/History.markdown +++ b/History.markdown @@ -123,6 +123,7 @@ * 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) ### Development Fixes From d3c327e1847c52f5fe7fdb434f2c1b8e802cd2a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Bov=C3=A9?= Date: Wed, 5 Aug 2015 08:52:01 +0200 Subject: [PATCH 037/810] Further flesh out Continuous Integration guide More information added after having some trouble getting Travis to execute with the existing explanation. --- site/_docs/continuous-integration.md | 45 ++++++++++++++++++++++++---- site/_docs/deployment-methods.md | 4 +-- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/site/_docs/continuous-integration.md b/site/_docs/continuous-integration.md index 18506077..b98de42c 100644 --- a/site/_docs/continuous-integration.md +++ b/site/_docs/continuous-integration.md @@ -34,6 +34,8 @@ This tool checks your resulting site to ensure all links and images exist. Utilize it either with the convenient `htmlproof` command-line executable, or write a Ruby script which utilizes the gem. +Save the commands you want to run and succeed in a file: `./script/cibuild` + ### The HTML Proofer Executable {% highlight bash %} @@ -48,6 +50,12 @@ Some options can be specified via command-line switches. Check out the `html-proofer` README for more information about these switches, or run `htmlproof --help` locally. +For example to avoid testing external sites, use this command: + +{% highlight bash %} +$ bundle exec htmlproof ./_site --disable-external +{% endhighlight %} + ### The HTML Proofer Library You can also invoke `html-proofer` in Ruby scripts (e.g. in a Rakefile): @@ -81,15 +89,21 @@ gem "jekyll" gem "html-proofer" {% endhighlight %} +Your `.travis.yml` file should look like this: {% highlight yaml %} language: ruby rvm: - 2.1 -# Assume bundler is being used, install step will run `bundle install`. + +before_script: + - chmod +x ./script/cibuild # or do this locally and commit + +# Assume bundler is being used, therefore +# the `install` step will run `bundle install` by default. script: ./script/cibuild -# branch whitelist +# branch whitelist, only for GitHub Pages branches: only: - gh-pages # test the gh-pages branch @@ -118,6 +132,16 @@ RVM is a popular Ruby Version Manager (like rbenv, chruby, etc). This directive tells Travis the Ruby version to use when running your test script. +{% highlight yaml %} +before_script: + - chmod +x ./script/cibuild +{% endhighlight %} + +The build script file needs to have the *executable* attribute set or +Travis will fail with a permission denied error. You can also run this +locally and commit the permissions directly, thus rendering this step +irrelevant. + {% highlight yaml %} script: ./script/cibuild {% endhighlight %} @@ -136,7 +160,7 @@ script: jekyll build && htmlproof ./_site The `script` directive can be absolutely any valid shell command. {% highlight yaml %} -# branch whitelist +# branch whitelist, only for GitHub Pages branches: only: - gh-pages # test the gh-pages branch @@ -152,7 +176,8 @@ a pull request flow for proposing changes, you may wish to enforce a convention for your builds such that all branches containing edits are prefixed, exemplified above with the `/pages-(.*)/` regular expression. -The `branches` directive is completely optional. +The `branches` directive is completely optional. Travis will build from every +push to any branch of your repo if leave it out. {% highlight yaml %} env: @@ -177,10 +202,20 @@ environment variable `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true`. exclude: [vendor] {% endhighlight %} +### Troubleshooting + +**Travis error:** *"You are trying to install in deployment mode after changing +your Gemfile. Run bundle install elsewhere and add the updated Gemfile.lock +to version control."* + +**Workaround:** Either run `bundle install` locally and commit your changes to +`Gemfile.lock`, or remove the `Gemfile.lock` file from your repository and add +an entry in the `.gitignore` file to avoid it from being checked in again. + ### Questions? This entire guide is open-source. Go ahead and [edit it][3] if you have a fix or [ask for help][4] if you run into trouble and need some help. [3]: https://github.com/jekyll/jekyll/edit/master/site/_docs/continuous-integration.md -[4]: https://github.com/jekyll/jekyll-help#how-do-i-ask-a-question +[4]: http://jekyllrb.com/help/ diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index 8d78cf31..c1040b2b 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -126,7 +126,7 @@ command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pt Add the script ```deploy``` to the web site source folder: -{% highlight shell %} +{% highlight bash %} #!/bin/sh rsync -avr --rsh='ssh -p2222' --delete-after --delete-excluded @: @@ -141,7 +141,7 @@ Command line parameters are: Example command line is: -{% highlight shell %} +{% highlight bash %} rsync -avr --rsh='ssh -p2222' --delete-after --delete-excluded _site/ hostuser@vrepin.org: {% endhighlight %} From 44f0e5b14acda389d741775d2c43af1d399c4eb4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 5 Aug 2015 10:19:09 -0700 Subject: [PATCH 038/810] Update history to reflect merge of #3891 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bec3cca6..d984173d 100644 --- a/History.markdown +++ b/History.markdown @@ -124,6 +124,7 @@ * Remove var collision with site template header menu iteration variable (#3838) * Change non-existent `hl_linenos` to `hl_lines` to allow passthrough in safe mode (#3787) * Add missing flag to disable the watcher (#3820) + * Update CI guide to include more direct explanations of the flow (#3891) ### Development Fixes From 1f29e5b5dcd1fcaace787b49f7903c62a3ebb999 Mon Sep 17 00:00:00 2001 From: Nate Berkopec Date: Wed, 5 Aug 2015 17:09:21 -0400 Subject: [PATCH 039/810] Contributing.md should refer to script/cucumber --- CONTRIBUTING.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.markdown b/CONTRIBUTING.markdown index 0f5be303..e4f9fda5 100644 --- a/CONTRIBUTING.markdown +++ b/CONTRIBUTING.markdown @@ -40,7 +40,7 @@ Before you start, run the tests and make sure that they pass (to confirm your environment is configured properly): $ bundle exec rake test - $ bundle exec rake features + $ bundle exec script/cucumber Workflow -------- From 11230718a446a279c0db9058eee5c30fbee2323b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 5 Aug 2015 14:19:38 -0700 Subject: [PATCH 040/810] Update history to reflect merge of #3894 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d984173d..1d8f7356 100644 --- a/History.markdown +++ b/History.markdown @@ -160,6 +160,7 @@ * 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) ### Site Enhancements From 489b9c3639fe3373d098fdd40f1bbc8c49b61e31 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 5 Aug 2015 14:30:31 -0700 Subject: [PATCH 041/810] update contributing documentation to reflect workflow updates --- CONTRIBUTING.markdown | 32 ++++++++++++----- site/_docs/contributing.md | 74 +++++++++++++++++--------------------- 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/CONTRIBUTING.markdown b/CONTRIBUTING.markdown index e4f9fda5..f83249c9 100644 --- a/CONTRIBUTING.markdown +++ b/CONTRIBUTING.markdown @@ -31,16 +31,25 @@ Test Dependencies ----------------- To run the test suite and build the gem you'll need to install Jekyll's -dependencies. Jekyll uses Bundler, so a quick run of the bundle command and -you're all set! +dependencies. Simply run this command to get all setup: - $ bundle + $ script/bootstrap Before you start, run the tests and make sure that they pass (to confirm your environment is configured properly): - $ bundle exec rake test - $ bundle exec script/cucumber + $ script/cibuild + +If you are only updating a file in `test/`, you can use the command: + + $ script/test test/blah_test.rb + +If you are only updating a `.feature` file, you can use the command: + + $ script/cucumber features/blah.feature + +Both `script/test` and `script/cucumber` can be run without arguments to +run its entire respective suite. Workflow -------- @@ -48,10 +57,10 @@ Workflow Here's the most direct way to get your work merged into the project: * Fork the project. -* Clone down your fork ( `git clone git@github.com:/jekyll.git` ). +* Clone down your fork ( `git clone git@github.com:[username]/jekyll.git` ). * Create a topic branch to contain your change ( `git checkout -b my_awesome_feature` ). * Hack away, add tests. Not necessarily in that order. -* Make sure everything still passes by running `rake`. +* Make sure everything still passes by running `script/cibuild`. * If necessary, rebase your commits into logical chunks, without errors. * Push the branch up ( `git push origin my_awesome_feature` ). * Create a pull request against jekyll/jekyll and describe what your change @@ -74,11 +83,16 @@ requests directed at another branch will not be accepted. The [Jekyll wiki](https://github.com/jekyll/jekyll/wiki) on GitHub can be freely updated without a pull request as all GitHub users have access. +If you want to add your plugin to the +[list of plugins](http://jekyllrb.com/docs/plugins/#available-plugins), +please submit a pull request modifying the +[plugins page source file](site/_docs/plugins.md) by adding a +link to your plugin under the proper subheading depending upon its type. + Gotchas ------- -* If you want to bump the gem version, please put that in a separate commit. - This way, the maintainers can control when the gem gets released. +* Please do not bump the gem version in your pull requests. * Try to keep your patch(es) based from the latest commit on jekyll/jekyll. The easier it is to apply your work, the less work the maintainers have to do, which is always a good thing. diff --git a/site/_docs/contributing.md b/site/_docs/contributing.md index 150525fb..ae768e5b 100644 --- a/site/_docs/contributing.md +++ b/site/_docs/contributing.md @@ -7,10 +7,12 @@ permalink: /docs/contributing/ So you've got an awesome idea to throw into Jekyll. Great! Please keep the following in mind: +* **Use https://talk.jekyllrb.com for non-technical or indirect Jekyll questions that are not bugs.** +* **Contributions will not be accepted without tests or necessary documentation updates.** * If you're creating a small fix or patch to an existing feature, just a simple test will do. Please stay in the confines of the current test suite and use [Shoulda](https://github.com/thoughtbot/shoulda/tree/master) and - [RSpec Mocks](https://github.com/rspec/rspec-mocks/). + [RSpec-Mocks](https://github.com/rspec/rspec-mocks). * If it's a brand new feature, make sure to create a new [Cucumber](https://github.com/cucumber/cucumber/) feature and reuse steps where appropriate. Also, whipping up some documentation in your fork's `site` @@ -36,24 +38,30 @@ following in mind:

+ Test Dependencies ----------------- To run the test suite and build the gem you'll need to install Jekyll's -dependencies. Jekyll uses Bundler, so a quick run of the `bundle` command and -you're all set! +dependencies. Simply run this command to get all setup: -{% highlight bash %} -$ bundle -{% endhighlight %} + $ script/bootstrap Before you start, run the tests and make sure that they pass (to confirm your environment is configured properly): -{% highlight bash %} -$ bundle exec rake test -$ bundle exec rake features -{% endhighlight %} + $ script/cibuild + +If you are only updating a file in `test/`, you can use the command: + + $ script/test test/blah_test.rb + +If you are only updating a `.feature` file, you can use the command: + + $ script/cucumber features/blah.feature + +Both `script/test` and `script/cucumber` can be run without arguments to +run its entire respective suite. Workflow -------- @@ -61,30 +69,14 @@ Workflow Here's the most direct way to get your work merged into the project: * Fork the project. -* Clone down your fork: - -{% highlight bash %} -git clone git://github.com//jekyll.git -{% endhighlight %} - -* Create a topic branch to contain your change: - -{% highlight bash %} -git checkout -b my_awesome_feature -{% endhighlight %} - - +* Clone down your fork ( `git clone git@github.com:[username]/jekyll.git` ). +* Create a topic branch to contain your change ( `git checkout -b my_awesome_feature` ). * Hack away, add tests. Not necessarily in that order. -* Make sure everything still passes by running `rake`. +* Make sure everything still passes by running `script/cibuild`. * If necessary, rebase your commits into logical chunks, without errors. -* Push the branch up: - -{% highlight bash %} -git push origin my_awesome_feature -{% endhighlight %} - -* Create a pull request against jekyll/jekyll:master and describe what your - change does and the why you think it should be merged. +* Push the branch up ( `git push origin my_awesome_feature` ). +* Create a pull request against jekyll/jekyll and describe what your change + does and the why you think it should be merged. Updating Documentation ---------------------- @@ -101,8 +93,7 @@ All documentation pull requests should be directed at `master`. Pull requests directed at another branch will not be accepted. The [Jekyll wiki]({{ site.repository }}/wiki) on GitHub -can be freely updated without a pull request as all -GitHub users have access. +can be freely updated without a pull request as all GitHub users have access. If you want to add your plugin to the [list of plugins](/docs/plugins/#available-plugins), please submit a pull request modifying the [plugins page source @@ -112,14 +103,15 @@ link to your plugin under the proper subheading depending upon its type. Gotchas ------- -* If you want to bump the gem version, please put that in a separate commit. - This way, the maintainers can control when the gem gets released. +* Please do not bump the gem version in your pull requests. * Try to keep your patch(es) based from the latest commit on jekyll/jekyll. - The easier it is to apply your work, the less work the maintainers have to - do, which is always a good thing. -* Please don't tag your GitHub issue with \[fix\], \[feature\], etc. The - maintainers actively read the issues and will label it once they come across - it. + The easier it is to apply your work, the less work the maintainers have to do, + which is always a good thing. +* Please don't tag your GitHub issue with [fix], [feature], etc. The maintainers + actively read the issues and will label it once they come across it. + +Finally... +----------
Let us know what could be better!
From 7c8e24a488831ee1a571eedc4d9b1cdbd89754bf Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 5 Aug 2015 14:31:48 -0700 Subject: [PATCH 042/810] Update history to reflect merge of #3895 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1d8f7356..e43cd4b5 100644 --- a/History.markdown +++ b/History.markdown @@ -161,6 +161,7 @@ * Update JRuby testing to 9K ([3ab386f](https://github.com/jekyll/jekyll/commit/3ab386f1b096be25a24fe038fc70fd0fb08d545d)) * Organize dependencies into dev and test groups. (#3852) * Contributing.md should refer to `script/cucumber` (#3894) + * Update contributing documentation to reflect workflow updates (#3895) ### Site Enhancements From aecfe4c1602a27a357126d7aedc377d06ab13d2e Mon Sep 17 00:00:00 2001 From: Veres Lajos Date: Fri, 7 Aug 2015 22:32:33 +0100 Subject: [PATCH 043/810] typofix in site/_docs/plugins.md --- 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 c8d3e288..cf0a8bab 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -745,7 +745,7 @@ LESS.js files during generation. - [Smilify](https://github.com/SaswatPadhi/jekyll_smilify) by [SaswatPadhi](https://github.com/SaswatPadhi): Convert text emoticons in your content to themeable smiley pics. - [Read in X Minutes](https://gist.github.com/zachleat/5792681) by [zachleat](https://github.com/zachleat): Estimates the reading time of a string (for blog post content). - [Jekyll-timeago](https://github.com/markets/jekyll-timeago): Converts a time value to the time ago in words. -- [pluralize](https://github.com/bdesham/pluralize): Easily combine a number and a word into a gramatically-correct amount like “1 minute” or “2 minute**s**”. +- [pluralize](https://github.com/bdesham/pluralize): Easily combine a number and a word into a grammatically-correct amount like “1 minute” or “2 minute**s**”. - [reading_time](https://github.com/bdesham/reading_time): Count words and estimate reading time for a piece of text, ignoring HTML elements that are unlikely to contain running text. - [Table of Content Generator](https://github.com/dafi/jekyll-toc-generator): Generate the HTML code containing a table of content (TOC), the TOC can be customized in many way, for example you can decide which pages can be without TOC. - [jekyll-humanize](https://github.com/23maverick23/jekyll-humanize): This is a port of the Django app humanize which adds a "human touch" to data. Each method represents a Fluid type filter that can be used in your Jekyll site templates. Given that Jekyll produces static sites, some of the original methods do not make logical sense to port (e.g. naturaltime). From d652f6e337915361bbbd7bef6b5eb021810e6bfa Mon Sep 17 00:00:00 2001 From: Veres Lajos Date: Fri, 7 Aug 2015 22:32:36 +0100 Subject: [PATCH 044/810] typofix in test/test_regenerator.rb --- test/test_regenerator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index f1221bda..6e2ce477 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -49,7 +49,7 @@ class TestRegenerator < JekyllUnitTest @regenerator = Regenerator.new(@site) # these should pass, since nothing has changed, and the - # loop above made sure the desinations exist + # loop above made sure the designations exist assert !@regenerator.regenerate?(@page) assert !@regenerator.regenerate?(@post) assert !@regenerator.regenerate?(@document) From af3fe0f30d172d8ab712919d0aeaee8210639250 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 8 Aug 2015 17:39:26 -0500 Subject: [PATCH 045/810] Update history.markdown to reflect the merger of #3897. --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e43cd4b5..9d498006 100644 --- a/History.markdown +++ b/History.markdown @@ -232,6 +232,7 @@ * Add Jekyll Portfolio Generator to list of plugins (#3883) * Add `site.html_files` to variables docs (#3880) * Add Static Publisher tool to list of deployment methods (#3865) + * Fix a few typos. (#3897) ## 2.5.3 / 2014-12-22 From ac56e9dd1684f6bf0c58dfc48bcb5378866ddb61 Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Thu, 11 Jun 2015 11:24:58 -0700 Subject: [PATCH 046/810] Make _includes directory configurable; closes #2684 and rename `plugins`, `layouts` and `data_source` directories for consistency --- bin/jekyll | 4 +-- features/site_configuration.feature | 2 +- lib/jekyll/configuration.rb | 34 +++++++++++++++++++++--- lib/jekyll/convertible.rb | 2 +- lib/jekyll/plugin_manager.rb | 6 ++--- lib/jekyll/reader.rb | 2 +- lib/jekyll/readers/layout_reader.rb | 4 +-- lib/jekyll/renderer.rb | 2 +- lib/jekyll/tags/include.rb | 8 +++--- site/_docs/configuration.md | 13 ++++----- test/source/_includes_custom/custom.html | 1 + test/test_configuration.rb | 14 ++++++++++ test/test_site.rb | 8 +++--- test/test_tags.rb | 17 ++++++++++++ 14 files changed, 89 insertions(+), 28 deletions(-) create mode 100644 test/source/_includes_custom/custom.html diff --git a/bin/jekyll b/bin/jekyll index 60330cd7..b88f9cb9 100755 --- a/bin/jekyll +++ b/bin/jekyll @@ -22,8 +22,8 @@ Mercenary.program(:jekyll) do |p| 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', '-p', '--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]', Array, 'Plugins directory (defaults to ./_plugins)' - p.option 'layouts', '--layouts DIR', String, 'Layouts directory (defaults to ./_layouts)' + 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)' Jekyll::Command.subclasses.each { |c| c.init_with_program(p) } diff --git a/features/site_configuration.feature b/features/site_configuration.feature index c9edc2ff..379cea4f 100644 --- a/features/site_configuration.feature +++ b/features/site_configuration.feature @@ -224,7 +224,7 @@ Feature: Site configuration | key | value | | time | 2010-01-01 | | future | true | - | layouts | _theme | + | layouts_dir | _theme | And I have a _posts directory And I have the following posts: | title | date | layout | content | diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 35b10503..68dd9faf 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -9,9 +9,10 @@ module Jekyll # Where things are 'source' => Dir.pwd, 'destination' => File.join(Dir.pwd, '_site'), - 'plugins' => '_plugins', - 'layouts' => '_layouts', - 'data_source' => '_data', + 'plugins_dir' => '_plugins', + 'layouts_dir' => '_layouts', + 'data_dir' => '_data', + 'includes_dir' => '_includes', 'collections' => nil, # Handling Reading @@ -263,6 +264,33 @@ module Jekyll "`_config.yml` file." end + if config.key? 'plugins' + Jekyll::Deprecator.deprecation_message "The 'plugins'" + + " configuration option has been renamed to 'plugins_dir'." + + " Please update your config file accordingly." + # copy but don't overwrite: + config['plugins_dir'] = config['plugins'] unless config.key?('plugins_dir') + config.delete('plugins') + end + + if config.key? 'layouts' + Jekyll::Deprecator.deprecation_message "The 'layouts'" + + " configuration option has been renamed to 'layouts_dir'." + + " Please update your config file accordingly." + # copy but don't overwrite: + config['layouts_dir'] = config['layouts'] unless config.key?('layouts_dir') + config.delete('layouts') + end + + if config.key? 'data_source' + Jekyll::Deprecator.deprecation_message "The 'data_source'" + + " configuration option has been renamed to 'data_dir'." + + " Please update your config file accordingly." + # copy but don't overwrite: + config['data_dir'] = config['data_source'] unless config.key?('data_dir') + config.delete('data_source') + end + config end diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 5767ab02..bb336085 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -211,7 +211,7 @@ module Jekyll self.output = render_liquid(layout.content, payload, info, - File.join(site.config['layouts'], layout.name)) + File.join(site.config['layouts_dir'], layout.name)) # Add layout to dependency tree site.regenerator.add_dependency( diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index 5ba0924f..bc541617 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -82,10 +82,10 @@ module Jekyll # # Returns an Array of plugin search paths def plugins_path - if (site.config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins']) - [site.in_source_dir(site.config['plugins'])] + if (site.config['plugins_dir'] == Jekyll::Configuration::DEFAULTS['plugins_dir']) + [site.in_source_dir(site.config['plugins_dir'])] else - Array(site.config['plugins']).map { |d| File.expand_path(d) } + Array(site.config['plugins_dir']).map { |d| File.expand_path(d) } end end diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 892bc917..b8cdae18 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -16,7 +16,7 @@ module Jekyll @site.layouts = LayoutReader.new(site).read read_directories sort_files! - @site.data = DataReader.new(site).read(site.config['data_source']) + @site.data = DataReader.new(site).read(site.config['data_dir']) CollectionReader.new(site).read end diff --git a/lib/jekyll/readers/layout_reader.rb b/lib/jekyll/readers/layout_reader.rb index a8466beb..f0620294 100644 --- a/lib/jekyll/readers/layout_reader.rb +++ b/lib/jekyll/readers/layout_reader.rb @@ -38,11 +38,11 @@ module Jekyll end def layout_directory_inside_source - site.in_source_dir(site.config['layouts']) + site.in_source_dir(site.config['layouts_dir']) end def layout_directory_in_cwd - dir = Jekyll.sanitized_path(Dir.pwd, site.config['layouts']) + dir = Jekyll.sanitized_path(Dir.pwd, site.config['layouts_dir']) if File.directory?(dir) && !site.safe dir else diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 4a772978..9683c44f 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -138,7 +138,7 @@ module Jekyll layout.content, payload, info, - File.join(site.config['layouts'], layout.name) + File.join(site.config['layouts_dir'], layout.name) ) # Add layout to dependency tree diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index b809ffe7..38b90790 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -20,7 +20,6 @@ module Jekyll def initialize(tag_name, markup, tokens) super - @includes_dir = tag_includes_dir matched = markup.strip.match(VARIABLE_SYNTAX) if matched @file = matched['variable'].strip @@ -100,12 +99,13 @@ eos end end - def tag_includes_dir - '_includes'.freeze + def tag_includes_dir(context) + context.registers[:site].config['includes_dir'].freeze end def render(context) site = context.registers[:site] + @includes_dir = tag_includes_dir(context) dir = resolved_includes_dir(context) file = render_variable(context) || @file @@ -161,7 +161,7 @@ eos end class IncludeRelativeTag < IncludeTag - def tag_includes_dir + def tag_includes_dir(context) '.'.freeze end diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index f9ac4eaa..2d397cad 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -465,12 +465,13 @@ file or on the command-line. {% highlight yaml %} # Where things are -source: . -destination: ./_site -plugins: ./_plugins -layouts: ./_layouts -data_source: ./_data -collections: null +source: . +destination: ./_site +plugins_dir: ./_plugins +layouts_dir: ./_layouts +data_dir: ./_data +includes_dir: ./_includes +collections: null # Handling Reading safe: false diff --git a/test/source/_includes_custom/custom.html b/test/source/_includes_custom/custom.html new file mode 100644 index 00000000..cbf553c6 --- /dev/null +++ b/test/source/_includes_custom/custom.html @@ -0,0 +1 @@ +custom_included \ No newline at end of file diff --git a/test/test_configuration.rb b/test/test_configuration.rb index ce54223c..bd99dc8b 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -66,6 +66,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, }] end should "unset 'auto' and 'watch'" do @@ -93,6 +96,17 @@ class TestConfiguration < JekyllUnitTest assert !@config.backwards_compatibilize.key?("pygments") 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"] + assert @config.key?("data_source") + assert !@config.backwards_compatibilize.key?("data_source") + assert @config.backwards_compatibilize["data_dir"] + end end context "#fix_common_issues" do setup do diff --git a/test/test_site.rb b/test/test_site.rb index 6b65ddb4..ba83c5c7 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -13,22 +13,22 @@ class TestSite < JekyllUnitTest end should "have an array for plugins if passed as a string" do - site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins' => '/tmp/plugins'})) + site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'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' => ['/tmp/plugins', '/tmp/otherplugins']})) + site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'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' => []})) + site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'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' => nil})) + site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins_dir' => nil})) assert_equal [], site.plugins end diff --git a/test/test_tags.rb b/test/test_tags.rb index ef919ede..58b481eb 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -600,6 +600,23 @@ CONTENT end end + context "with custom includes directory" do + setup do + content = < '_includes_custom', 'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) + end + + should "include file from custom directory" do + assert_match "custom_included", @result + end + end + context "without parameters within if statement" do setup do content = < Date: Wed, 5 Aug 2015 13:42:08 -0400 Subject: [PATCH 047/810] Future should be set to false in the default config --- features/create_sites.feature | 18 +++++++++++++++--- lib/jekyll/configuration.rb | 2 +- site/_docs/configuration.md | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/features/create_sites.feature b/features/create_sites.feature index 18996bfe..6eb05dc3 100644 --- a/features/create_sites.feature +++ b/features/create_sites.feature @@ -112,16 +112,16 @@ Feature: Create sites And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html" Scenario: Basic site with internal post linking - Given I have an "index.html" page that contains "URL: {% post_url 2020-01-31-entry2 %}" + Given I have an "index.html" page that contains "URL: {% post_url 2008-01-01-entry2 %}" And I have a configuration file with "permalink" set to "pretty" And I have a _posts directory And I have the following posts: | title | date | layout | content | | entry1 | 2007-12-31 | post | content for entry1. | - | entry2 | 2020-01-31 | post | content for entry2. | + | entry2 | 2008-01-01 | post | content for entry2. | When I run jekyll build Then the _site directory should exist - And I should see "URL: /2020/01/31/entry2/" in "_site/index.html" + 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" @@ -156,3 +156,15 @@ Feature: Create sites And the "_site/index.html" file should exist And the "_site/public.html" file should exist And the "_site/secret.html" file should exist + + Scenario: Basic site with page with future date + Given I have a _posts directory + And I have the following post: + | title | date | layout | content | + | entry1 | 2020-12-31 | post | content for entry1. | + When I run jekyll build + Then the _site directory should not exist + + When I run jekyll build --future + Then the _site directory should exist + And the "_site/2020/12/31/entry1.html" file should exist diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 35b10503..832d3ef0 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -26,7 +26,7 @@ module Jekyll # Filtering Content 'show_drafts' => nil, 'limit_posts' => 0, - 'future' => true, # remove and make true just default + 'future' => false, 'unpublished' => false, # Plugins diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index ad7764b0..f89d06c5 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -483,7 +483,7 @@ markdown_ext: "markdown,mkdown,mkdn,mkd,md" # Filtering Content show_drafts: null limit_posts: 0 -future: true +future: false unpublished: false # Plugins From 63a51df90937dcea8e3d0a3f8dcdb32d541e7b93 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 16 Aug 2015 13:15:47 -0400 Subject: [PATCH 048/810] Fix up test for 'future' flag. /cc #3892 --- features/create_sites.feature | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/features/create_sites.feature b/features/create_sites.feature index 6eb05dc3..898115c2 100644 --- a/features/create_sites.feature +++ b/features/create_sites.feature @@ -162,9 +162,11 @@ Feature: Create sites And I have the following post: | title | date | layout | content | | 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 not exist - + Then 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 And the "_site/2020/12/31/entry1.html" file should exist From 8b72f142178ce281777e9b9fe8a18e6cdc4dfad7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 16 Aug 2015 13:17:24 -0400 Subject: [PATCH 049/810] Update history to reflect merge of #3892 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9d498006..2e2cf25f 100644 --- a/History.markdown +++ b/History.markdown @@ -125,6 +125,7 @@ * 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) ### Development Fixes From 399606c54447b5c4853981ae52cf40c30195c3be Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 16 Aug 2015 13:30:39 -0400 Subject: [PATCH 050/810] Unify renaming of configuration options to a single method. /cc #3782. --- lib/jekyll/configuration.rb | 48 ++++++++++--------------------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 68dd9faf..6cf54193 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -220,14 +220,10 @@ module Jekyll config.delete('server') end - if config.key? 'server_port' - Jekyll::Deprecator.deprecation_message "The 'server_port' configuration option" + - " has been renamed to 'port'. Please update your config" + - " file accordingly." - # copy but don't overwrite: - config['port'] = config['server_port'] unless config.key?('port') - config.delete('server_port') - 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 if config.key? 'pygments' Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" + @@ -264,33 +260,6 @@ module Jekyll "`_config.yml` file." end - if config.key? 'plugins' - Jekyll::Deprecator.deprecation_message "The 'plugins'" + - " configuration option has been renamed to 'plugins_dir'." + - " Please update your config file accordingly." - # copy but don't overwrite: - config['plugins_dir'] = config['plugins'] unless config.key?('plugins_dir') - config.delete('plugins') - end - - if config.key? 'layouts' - Jekyll::Deprecator.deprecation_message "The 'layouts'" + - " configuration option has been renamed to 'layouts_dir'." + - " Please update your config file accordingly." - # copy but don't overwrite: - config['layouts_dir'] = config['layouts'] unless config.key?('layouts_dir') - config.delete('layouts') - end - - if config.key? 'data_source' - Jekyll::Deprecator.deprecation_message "The 'data_source'" + - " configuration option has been renamed to 'data_dir'." + - " Please update your config file accordingly." - # copy but don't overwrite: - config['data_dir'] = config['data_source'] unless config.key?('data_dir') - config.delete('data_source') - end - config end @@ -305,5 +274,14 @@ module Jekyll config end + + 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 " + + "file accordingly." + config[new] = config.delete(old) + end + end end end From 010038e78a4200faae924e6d857d0cbac64eb8ac Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 16 Aug 2015 13:32:18 -0400 Subject: [PATCH 051/810] Update history to reflect merge of #3782 [ci skip] --- History.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/History.markdown b/History.markdown index 2e2cf25f..292b6564 100644 --- a/History.markdown +++ b/History.markdown @@ -82,6 +82,9 @@ * 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) + ### Bug Fixes From 2db01b9651640deaa3be2e484b9ca98a94d4436f Mon Sep 17 00:00:00 2001 From: Leonard Date: Sun, 16 Aug 2015 20:59:06 +0200 Subject: [PATCH 052/810] Added my site for learning purposes A week ago, I asked @parkr via email if he could add my site here (mostly because I thought it's too cheeky to just propose a file-change). But now he told me that it's better to just do it here: I'm asking because I spend a huge amount of time and effort on making it great and usefully structured for people who're just getting started with Jekyll. Therefore it's also great as a forked starting-point, if you ask me. Besides keeping the code clean, I also spend much time on making the site as fast as possible. There's not much CSS in use, the HTML output is minified and images are directly served from the repo (and therefore GitHub's CDN) instead of from third-party services. There's also a lot of "include"-thinking happening for things like embedded Tweets, images or iFrames - which most people just inline in each post. When making a significant change, I also always make sure to write a few paragraphs about why I exactly did it as a commit message. And when it comes to really big updates, I write entire posts too (explaining all improvements and their benefits to the site's performance/look). Here's an recent example: http://leo.github.io/notes/v2/ I'm definitely sure that many people could get something out of it. Don't you think so too? --- site/_docs/sites.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/_docs/sites.md b/site/_docs/sites.md index c11da820..02b5aa25 100644 --- a/site/_docs/sites.md +++ b/site/_docs/sites.md @@ -20,6 +20,8 @@ learning purposes. ([source](https://github.com/rsms/rsms.github.com)) - [Scott Chacon](http://schacon.github.com) ([source](https://github.com/schacon/schacon.github.com)) +- [Leonard Lamprecht](http://leo.github.io) + ([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 47c9ed0829fb45de72684b021d65c320a8ecec1f Mon Sep 17 00:00:00 2001 From: BRAVO <127.0.0.1.pb@gmail.com> Date: Mon, 17 Aug 2015 13:23:17 +0200 Subject: [PATCH 053/810] I think you made a typo there as seen on: http://blog.davepoon.net/2015/01/19/setting-up-sass-with-jekyll/ http://markdotto.com/2014/09/25/sass-and-jekyll/#create-a-sass-stylesheet --- 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 e82ddb30..b4f202d8 100644 --- a/site/_docs/assets.md +++ b/site/_docs/assets.md @@ -73,7 +73,7 @@ You may also specify the output style with the `style` option in your {% highlight yaml %} sass: - style: :compressed + style: compressed {% endhighlight %} These are passed to Sass, so any output style options Sass supports are valid From 4c1427c400ea764310b0c892f8ae80b6bad1ab4c Mon Sep 17 00:00:00 2001 From: "jaybe@jekyll" Date: Tue, 11 Aug 2015 17:56:35 -0500 Subject: [PATCH 054/810] docs: Update _data in "Directory structure" Add in references to _data format and extension options of .csv, .json, etc., consistent with _docs/datafiles.md Signed-off-by: Parker Moore --- site/_docs/structure.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/site/_docs/structure.md b/site/_docs/structure.md index 53a48951..eb6a0892 100644 --- a/site/_docs/structure.md +++ b/site/_docs/structure.md @@ -133,11 +133,12 @@ An overview of what each of these does:

Well-formatted site data should be placed here. The jekyll engine - will autoload all yaml files (ends with - .yml or .yaml) in this directory. If - there's a file members.yml under the directory, - then you can access contents of the file - through site.data.members. + will autoload all YAML files in this directory (using either the + .yml, .yaml, .json or + .csv formats and extensions) 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.

From a446589cdce0ca931e9187a2cb8f80f1eabc8b8c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 20 Aug 2015 10:16:52 -0700 Subject: [PATCH 055/810] Add a Code of Conduct. Closes #3924. --- CONDUCT.md | 22 ++++++++++++++++++++++ README.markdown | 12 ++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 CONDUCT.md diff --git a/CONDUCT.md b/CONDUCT.md new file mode 100644 index 00000000..65c05c57 --- /dev/null +++ b/CONDUCT.md @@ -0,0 +1,22 @@ +# 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. + +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. 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 one or more of the project maintainers. + +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 diff --git a/README.markdown b/README.markdown index 42ad29d1..df56108e 100644 --- a/README.markdown +++ b/README.markdown @@ -22,6 +22,18 @@ Jekyll does what you tell it to do — no more, no less. It doesn't try to outs * Fork and [Contribute](http://jekyllrb.com/docs/contributing/) your own modifications * Have questions? Check out our official forum community [Jekyll Talk](https://talk.jekyllrb.com/) or [`#jekyll` on irc.freenode.net](https://botbot.me/freenode/jekyll/) +## 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 +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, @envygeeks, or @mattr-) know +and we will address it as soon as possible. + ## Diving In * [Migrate](http://import.jekyllrb.com/docs/home/) from your previous system From 753bdbefbfb3c1d5327a5c72ff1ad535dc5bfc9c Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Fri, 21 Aug 2015 10:36:37 -0500 Subject: [PATCH 056/810] Update history to reflect merge of #3925 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 292b6564..b81b2013 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * 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) ### Minor Enhancements From 34afc7784d96524561c7fe6365531d5b9b4125fd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 23 Aug 2015 12:55:20 -0700 Subject: [PATCH 057/810] Update history to reflect merge of #3871 [ci skip] --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index b81b2013..a2b01ed9 100644 --- a/History.markdown +++ b/History.markdown @@ -85,7 +85,7 @@ * 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) ### Bug Fixes From 12fc4c5ef4bff36b60c74fc2fd09816f86a76cab Mon Sep 17 00:00:00 2001 From: Dominik Date: Mon, 24 Aug 2015 14:07:27 +0200 Subject: [PATCH 058/810] update 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 cf0a8bab..926b3ba0 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -809,6 +809,7 @@ LESS.js files during generation. - [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. #### Collections From 1eb1f4ea4da07ce669efc1a33860b917bcccd2e0 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Mon, 24 Aug 2015 16:21:50 -0400 Subject: [PATCH 059/810] add script to vendor mime types --- lib/jekyll/mime.types | 894 +++++++++++++++++++++++++++++++++++++----- script/vendor-mimes | 35 ++ 2 files changed, 834 insertions(+), 95 deletions(-) create mode 100755 script/vendor-mimes diff --git a/lib/jekyll/mime.types b/lib/jekyll/mime.types index 4e33d137..15828b91 100644 --- a/lib/jekyll/mime.types +++ b/lib/jekyll/mime.types @@ -1,96 +1,800 @@ -# These are the same MIME types that GitHub Pages uses as of 26 January 2014 +# Woah there. Do not edit this file directly. +# This file is generated automatically by script/vendor-mimes. -text/html;charset=utf-8 html htm shtml -text/css css -text/xml;charset=utf-8 xml rss xsl xsd -image/gif gif -image/jpeg jpeg jpg -application/x-javascript js -application/atom+xml atom -application/json json geojson topojson - -text/mathml mml -text/plain txt -text/vnd.sun.j2me.app-descriptor jad -text/vnd.wap.wml wml -text/x-component htc -text/cache-manifest manifest appcache -text/coffeescript coffee -text/plain pde -text/plain md markdown -text/vcard vcf vcard - -image/png png -image/svg+xml svg -image/svg+xml svgz -image/tiff tif tiff -image/vnd.wap.wbmp wbmp -image/x-icon ico -image/x-jng jng -image/x-ms-bmp bmp - -application/vnd.ms-fontobject eot -application/x-font-ttf ttf -application/x-font-woff woff -application/font-woff2 woff2 -font/opentype otf - -application/java-archive jar ear -application/mac-binhex40 hqx -application/msword doc -application/pdf pdf -application/postscript ps eps ai -application/rdf+xml rdf -application/rtf rtf -application/vnd.apple.pkpass pkpass -application/vnd.ms-excel xls -application/vnd.ms-powerpoint ppt -application/vnd.wap.wmlc wmlc -application/xhtml+xml xhtml -application/x-cocoa cco -application/x-chrome-extension crx -application/x-java-archive-diff jardiff -application/x-java-jnlp-file jnlp -application/x-makeself run -application/x-ms-application application -application/x-ms-manifest manifest -application/x-ms-vsto vsto -application/x-ns-proxy-autoconfig pac -application/x-perl pl pm -application/x-pilot prc pdb -application/x-rar-compressed rar -application/x-redhat-package-manager rpm -application/x-sea sea -application/x-shockwave-flash swf -application/x-stuffit sit -application/x-tcl tcl tk -application/x-web-app-manifest+json webapp -application/x-x509-ca-cert der pem crt -application/x-xpinstall xpi -application/x-zip war -application/zip zip - -application/octet-stream bin exe dll -application/octet-stream deb -application/octet-stream deploy -application/octet-stream dmg -application/octet-stream iso img -application/octet-stream msi msp msm - -audio/midi mid midi kar -audio/mpeg mp3 -audio/x-realaudio ra -audio/ogg ogg - -video/3gpp 3gpp 3gp -video/m4v m4v -video/mp4 mp4 -video/mpeg mpeg mpg -video/ogg ogg ogv -video/quicktime mov -video/webm webm -video/x-flv flv -video/x-mng mng -video/x-ms-asf asx asf -video/x-ms-wmv wmv -video/x-msvideo avi +application/andrew-inset ez +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +application/atomsvc+xml atomsvc +application/bdoc bdoc +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +application/cu-seeme cu +application/dash+xml mdp +application/davmount+xml davmount +application/docbook+xml dbk +application/dssc+der dssc +application/dssc+xml xdssc +application/ecmascript ecma +application/emma+xml emma +application/epub+zip epub +application/exi exi +application/font-tdpfr pfr +application/font-woff woff +application/font-woff2 woff2 +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +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/json json map +application/json5 json5 +application/jsonml+json jsonml +application/ld+json jsonld +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/mads+xml mads +application/manifest+json webmanifest +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +application/mathml+xml mathml +application/mbox mbox +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +application/mods+xml mods +application/mp21 m21 mp21 +application/mp4 mp4s m4p +application/msword doc dot +application/mxf mxf +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 +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +application/pgp-signature asc sig +application/pics-rules prf +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +application/postscript ai eps ps +application/prs.cww cww +application/pskc+xml pskcxml +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +application/set-payment-initiation setpay +application/set-registration-initiation setreg +application/shf+xml shf +application/smil+xml smi smil +application/sparql-query rq +application/sparql-results+xml srx +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +application/tei+xml tei teicorpus +application/thraud+xml tfi +application/timestamped-data tsd +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +application/vnd.android.package-archive apk +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.mpegurl m3u8 +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +application/vnd.blueice.multipass mpm +application/vnd.bmi bmi +application/vnd.businessobjects rep +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +application/vnd.cups-ppd ppd +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +application/vnd.dna dna +application/vnd.dolby.mlp mlp +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +application/vnd.dvb.service svc +application/vnd.dynageo geo +application/vnd.ecowin.chart mag +application/vnd.enliven nml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +application/vnd.eszigno3+xml es3 et3 +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +application/vnd.hydrostatix.sof-data sfd-hdstx +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +application/vnd.ms-cab-compressed cab +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +application/vnd.ms-officetheme thmx +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +application/vnd.ms-project mpp mpt +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.olpc-sugar xo +application/vnd.oma.dd2+xml dd2 +application/vnd.openofficeorg.extension oxt +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +application/vnd.openxmlformats-officedocument.presentationml.template potx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +application/vnd.osgeo.mapguide.package mgp +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +application/vnd.palm pdb pqa oprc +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +application/vnd.picsel efif +application/vnd.pmi.widget wg +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +application/vnd.sailingtracker.track st +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +application/vnd.smart.teacher teacher +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.sus-calendar sus susp +application/vnd.svd svd +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +application/vnd.vcx vcx +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +application/vnd.vsf vsf +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +application/vnd.wt.stf stf +application/vnd.xara xar +application/vnd.xfdl xfdl +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +application/widget wgt +application/winhlp hlp +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-chrome-extension crx +application/x-cocoa cco +application/x-conference nsc +application/x-cpio cpio +application/x-csh csh +application/x-debian-package udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +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 +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +application/x-hdf hdf +application/x-httpd-php php +application/x-install-instructions install +application/x-java-archive-diff jardiff +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lua-bytecode luac +application/x-lzh-compressed lzh lha +application/x-makeself run +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload com bat +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-ns-proxy-autoconfig pac +application/x-nzb nzb +application/x-perl pl pm +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-redhat-package-manager rpm +application/x-research-info-systems ris +application/x-sea sea +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl tk +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +application/x-web-app-manifest+json webapp +application/x-x509-ca-cert der crt pem +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +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-dtd dtd +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +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/ogg oga ogg spx +audio/s3m s3m +audio/silk sil +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +audio/vnd.rip rip +audio/wav wav +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +image/g3fax g3 +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/ktx ktx +image/png png +image/prs.btif btif +image/sgi sgi +image/svg+xml svg svgz +image/tiff tiff tif +image/vnd.adobe.photoshop psd +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.djvu djvu djv +image/vnd.dvb.subtitle sub +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +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 +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/rfc822 eml mime +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +model/vnd.gdl gdl +model/vnd.gtw gtw +model/vnd.mts mts +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +text/cache-manifest appcache manifest +text/calendar ics ifb +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/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/stylus stylus styl +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +text/uri-list uri uris urls +text/vcard vcard +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.mcurl mcurl +text/vnd.curl.scurl scurl +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +text/vnd.sun.j2me.app-descriptor jad +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/vtt vtt +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-component htc +text/x-fortran f for f77 f90 +text/x-handlebars-template hbs +text/x-java-source java +text/x-lua lua +text/x-markdown markdown md mkd +text/x-nfo nfo +text/x-opml opml +text/x-pascal p pas +text/x-processing pde +text/x-sass sass +text/x-scss scss +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +text/yaml yaml yml +video/3gpp 3gp 3gpp +video/3gpp2 3g2 +video/h261 h261 +video/h263 h263 +video/h264 h264 +video/jpeg jpgv +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +video/mp2t ts +video/mp4 mp4 mp4v mpg4 +video/mpeg mpeg mpg mpe m1v m2v +video/ogg ogv +video/quicktime qt mov +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +video/vnd.dvb.file dvb +video/vnd.fvt fvt +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice \ No newline at end of file diff --git a/script/vendor-mimes b/script/vendor-mimes new file mode 100755 index 00000000..ea779232 --- /dev/null +++ b/script/vendor-mimes @@ -0,0 +1,35 @@ +#!/usr/bin/env ruby +# Vendors the MIME type config from the mime-db list +# usage: script/vendor-mimes + +require 'json' +require 'open-uri' + +config = File.expand_path "../lib/jekyll/mime.types", File.dirname(__FILE__) + +# Create an array of vendored mimetype => [extensions] +mimes = {} +json = open('https://raw.githubusercontent.com/jshttp/mime-db/master/db.json').read +data = JSON.parse(json) +data.reject! { |mime, meta| meta["extensions"].nil? || meta["extensions"].empty? } +data.each do |mime, meta| + # Normalize extensions and mime-types + mime = mime.downcase.strip + extensions = meta["extensions"].map { |e| e.downcase.strip }.compact + + # If a given extension is listed multiple times, prefer the first one listed + extensions.reject! { |extension| mimes.values.flatten.include?(extension) } + + next if extensions.empty? + mimes[mime] = [] if mimes[mime].nil? + mimes[mime].concat extensions +end + +strlen = mimes.keys.max_by(&:length).length +output = "" +output << "# Woah there. Do not edit this file directly.\n" +output << "# This file is generated automatically by script/vendor-mimes.\n\n" +mimes = mimes.sort_by { |k,v| k } +output << mimes.map { |mime,extensions| "#{mime.ljust(strlen)} #{extensions.join(" ")}" }.join("\n") + +File.write(config, output) From 14a564673018e24b639895937505e6e348ef77a2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 24 Aug 2015 14:03:35 -0700 Subject: [PATCH 060/810] Update history to reflect merge of #3933 [ci skip] --- History.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/History.markdown b/History.markdown index a2b01ed9..7939f361 100644 --- a/History.markdown +++ b/History.markdown @@ -86,6 +86,7 @@ * 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) ### Bug Fixes @@ -167,6 +168,7 @@ * 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) ### Site Enhancements From 47cb3a8fd72529ea5508469f3681e4fc6730e6c6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 24 Aug 2015 18:01:04 -0700 Subject: [PATCH 061/810] docs: categories/tags only with array & comma-separated string Fixed #3930 --- site/_docs/frontmatter.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/frontmatter.md b/site/_docs/frontmatter.md index 7d27dc07..c9a0292e 100644 --- a/site/_docs/frontmatter.md +++ b/site/_docs/frontmatter.md @@ -109,7 +109,7 @@ front matter of a page or 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 - space-separated string. + comma-separated string.

@@ -123,7 +123,7 @@ front matter of a page or 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 - space-separated string. + comma-separated string.

From cd4829d28d3323bdf74dbb6808be99be8f1c1d41 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 25 Aug 2015 22:11:23 -0700 Subject: [PATCH 062/810] Update history to reflect merge of #3931 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7939f361..74413ead 100644 --- a/History.markdown +++ b/History.markdown @@ -240,6 +240,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 4169075dd116b4131b620af6fb6a786f485b2e09 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 25 Aug 2015 23:00:58 -0700 Subject: [PATCH 063/810] filters: `where` should compare stringified versions of input & comparator Non-string input was being missed as a result of poor comparison. Converting inputs to strings ensure numerical and boolean values are properly compared. Fixes #3911. --- lib/jekyll/filters.rb | 2 +- test/test_filters.rb | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 12d4eb5a..72c332ad 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -211,7 +211,7 @@ module Jekyll def where(input, property, value) return input unless input.is_a?(Enumerable) input = input.values if input.is_a?(Hash) - input.select { |object| item_property(object, property) == value } + input.select { |object| item_property(object, property).to_s == value.to_s } end # Sort an array of objects diff --git a/test/test_filters.rb b/test/test_filters.rb index 82d31922..cf4db89b 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -277,6 +277,23 @@ class TestFilters < JekyllUnitTest should "filter objects appropriately" do assert_equal 2, @filter.where(@array_of_objects, "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}, + } + + results = @filter.where(hash, "featured", "true") + assert_equal 2, results.length + assert_equal 9.2, results[0]["rating"] + assert_equal 4.7, results[1]["rating"] + + results = @filter.where(hash, "rating", 4.7) + assert_equal 1, results.length + assert_equal 4.7, results[0]["rating"] + end end context "sort filter" do From f2d31a1b201a1f566863465ed95bb08aa0555775 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 25 Aug 2015 23:39:40 -0700 Subject: [PATCH 064/810] Update history to reflect merge of #3935 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 74413ead..496e620d 100644 --- a/History.markdown +++ b/History.markdown @@ -131,6 +131,7 @@ * 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) ### Development Fixes From edcbe99b58beb043c8ed0747242b140ec61f0b1d Mon Sep 17 00:00:00 2001 From: Julien Bourdeau Date: Sun, 30 Aug 2015 15:48:02 +0200 Subject: [PATCH 065/810] Update README.md --- site/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/README.md b/site/README.md index d98f6db7..27cd67c6 100644 --- a/site/README.md +++ b/site/README.md @@ -9,7 +9,8 @@ For information about contributing, see the [Contributing page](http://jekyllrb. ## Running locally You can preview your contributions before opening a pull request by running from within the directory: + 1. `bundle install` 2. `bundle exec rake site:preview` -It's just a jekyll site, afterall! :wink: \ No newline at end of file +It's just a jekyll site, afterall! :wink: From d18d1bc43b1876c0850f98caa4c11496dc1b0125 Mon Sep 17 00:00:00 2001 From: Neil Faccly Date: Sun, 30 Aug 2015 21:10:27 +0500 Subject: [PATCH 066/810] Jekyll views router plugin --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 926b3ba0..832c0d41 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -844,6 +844,7 @@ LESS.js files during generation. - [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. +- [Jekyll views router](https://bitbucket.org/nyufac/jekyll-views-router): Simple router between generator plugins and templates. #### Editors From fffb834e639347810a0fdd1684086fcba839ac6d Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Mon, 31 Aug 2015 05:17:16 -0500 Subject: [PATCH 067/810] Update history.markdown to reflect the merger of #3158 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 496e620d..4fe4a260 100644 --- a/History.markdown +++ b/History.markdown @@ -242,6 +242,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 11da2e0d90258015ab26a4d21b64e109cd95ad9c Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 1 Sep 2015 13:27:18 -0500 Subject: [PATCH 068/810] Update history.markdown to reflect the merger of #3769 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4fe4a260..96d08557 100644 --- a/History.markdown +++ b/History.markdown @@ -243,6 +243,7 @@ * 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) ## 2.5.3 / 2014-12-22 From a7378da16c4d170fa32b9a21f3bfb5ece321e490 Mon Sep 17 00:00:00 2001 From: Leonard Date: Tue, 1 Sep 2015 20:27:39 +0200 Subject: [PATCH 069/810] Updated URL --- site/_docs/sites.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/sites.md b/site/_docs/sites.md index 02b5aa25..42d04921 100644 --- a/site/_docs/sites.md +++ b/site/_docs/sites.md @@ -20,7 +20,7 @@ learning purposes. ([source](https://github.com/rsms/rsms.github.com)) - [Scott Chacon](http://schacon.github.com) ([source](https://github.com/schacon/schacon.github.com)) -- [Leonard Lamprecht](http://leo.github.io) +- [Leonard Lamprecht](http://leo.im) ([source](https://github.com/leo/leo.github.io)) If you would like to explore more examples, you can find a list of sites From baafe24e4a84e29b47856055a1d718edd59746f5 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 1 Sep 2015 13:54:24 -0500 Subject: [PATCH 070/810] Update history.markdown to reflect the merge of #3736 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 96d08557..60b1c0a9 100644 --- a/History.markdown +++ b/History.markdown @@ -244,6 +244,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 1dc2a34252b353f9f64e91c98f03350bbb8a40cd Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Wed, 2 Sep 2015 20:23:58 -0700 Subject: [PATCH 071/810] Update history to reflect merge of #3828 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 60b1c0a9..7a1809da 100644 --- a/History.markdown +++ b/History.markdown @@ -132,6 +132,7 @@ * 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) ### Development Fixes From b732667aea966344efead1ec85eadcbc2b20aaed Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 7 Sep 2015 22:04:32 -0700 Subject: [PATCH 072/810] site: document required ruby versions closes #3963 --- 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 5ca2bb51..99709c71 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -15,7 +15,7 @@ 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. - [Ruby](http://www.ruby-lang.org/en/downloads/) (including development - headers) + headers, v1.9.3 or above for Jekyll 2 and v2 or above for Jekyll 3) - [RubyGems](http://rubygems.org/pages/download) - Linux, Unix, or Mac OS X - [NodeJS](http://nodejs.org), or another JavaScript runtime (Jekyll 2 and From b02ae4fad19c8a226d1a9b4038bfd5d294bb90d5 Mon Sep 17 00:00:00 2001 From: Arne Gockeln Date: Wed, 9 Sep 2015 14:43:54 +0200 Subject: [PATCH 073/810] Update plugins.md Added a link to a new generator plugin for replacing german umlauts with html --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 832c0d41..440623bf 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -712,6 +712,7 @@ LESS.js files during generation. - [Jekyll Http Basic Auth Plugin](https://gist.github.com/snrbrnjna/422a4b7e017192c284b3): Plugin to manage http basic auth for jekyll generated pages and directories. - [Jekyll Auto Image by Merlos](https://github.com/merlos/jekyll-auto-image): Gets the first image of a post. Useful to list your posts with images or to add [twitter cards](https://dev.twitter.com/cards/overview) to your site. - [Jekyll Portfolio Generator by Shannon Babincsak](https://github.com/codeinpink/jekyll-portfolio-generator): Generates project pages and computes related projects out of project data files. +- [Jekyll-Umlauts by Arne Gockeln](https://github.com/webchef/jekyll-umlauts): This generator replaces all german umlauts (äöüß) case sensitive with html. #### Converters From f1fd89bd8e7f4485334318c5f6a324963d8ee144 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 9 Sep 2015 08:09:08 -0500 Subject: [PATCH 074/810] Update history.markdown to reflect the merger of #3966 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7a1809da..59edfcee 100644 --- a/History.markdown +++ b/History.markdown @@ -246,6 +246,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 908bb2e7aff85f6356751bdd416a6fd4a567643a Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 11 Sep 2015 14:41:46 -0500 Subject: [PATCH 075/810] Fix #3970: Use Gem::Version to compare versions, not >. --- History.markdown | 1 + lib/jekyll/converters/markdown/redcarpet_parser.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 59edfcee..d8880fd2 100644 --- a/History.markdown +++ b/History.markdown @@ -133,6 +133,7 @@ * 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 >. ### Development Fixes diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index 8ddf2292..6788d96e 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -76,7 +76,7 @@ module Jekyll rouge/plugins/redcarpet ]) - if Rouge.version < '1.3.0' + 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 From d6b37a1644214a7e5b6287fed23d09a63186c22e Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 11 Sep 2015 15:03:07 -0500 Subject: [PATCH 076/810] Lock Cucumber to 2.0 because 2.1 is broken. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 7ddda06e..a6d2a5b8 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' + gem 'cucumber', '~> 2.0', '< 2.1' gem 'simplecov', '~> 0.9' gem 'jekyll_test_plugin' gem 'jekyll_test_plugin_malicious' From 402643435dedf72a9413e16343c42a42ebbf2bd2 Mon Sep 17 00:00:00 2001 From: Bruce Smith Date: Mon, 21 Sep 2015 12:08:18 -0700 Subject: [PATCH 077/810] replace broken link; add other Mac-specific info Fixes #3968 --- site/_docs/troubleshooting.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index ee49c782..602d62a3 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -40,20 +40,32 @@ export PATH=$PATH:/home/private/gems/bin export RB_USER_INSTALL='true' {% endhighlight %} -On Mac OS X, you may need to update RubyGems: +On Mac OS X, you may need to update RubyGems (using `sudo` only if necessary): {% highlight bash %} sudo gem update --system {% endhighlight %} -If you still have issues, you may need to [use Xcode to install Command Line -Tools](http://www.zlu.me/ruby/os%20x/gem/mountain%20lion/2012/02/21/install-native-ruby-gem-in-mountain-lion-preview.html) -that will allow you to install native gems using the following command: +If you still have issues, you can download and install new Command Line +Tools (such as `gcc`) using the command + +{% highlight bash %} +xcode-select --install +{% endhighlight %} + +which may allow you to install native gems using this command (again using +`sudo` only if necessary): {% highlight bash %} sudo gem install jekyll {% endhighlight %} +Note that upgrading MacOS X 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 +Line Tools. + To install RubyGems on Gentoo: {% highlight bash %} From 666df42a28c9b9e96002e34bfc194a193145d575 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 21 Sep 2015 12:20:43 -0700 Subject: [PATCH 078/810] Update history to reflect merge of #3968 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d8880fd2..00cfcc5d 100644 --- a/History.markdown +++ b/History.markdown @@ -248,6 +248,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 9181d22391ae1e85b3ebe93a2054be2fcebbe57d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 21 Sep 2015 12:21:35 -0700 Subject: [PATCH 079/810] Update history to reflect merge of #3917 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 00cfcc5d..65bdec0b 100644 --- a/History.markdown +++ b/History.markdown @@ -249,6 +249,7 @@ * 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) ## 2.5.3 / 2014-12-22 From f3b99ebda75ae61201529c29d6e11db482b9a080 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 21 Sep 2015 12:31:00 -0700 Subject: [PATCH 080/810] Release :gem: 3.0.0.pre.beta9 --- 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 1e416f05..a5d8a120 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.0.0.pre.beta8' + VERSION = '3.0.0.pre.beta9' end From a82b063d427b81f2f91dae0620c0b0a492efe8ca Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Tue, 22 Sep 2015 09:35:14 -0700 Subject: [PATCH 081/810] Added documentation for Jekyll environment variables Information about Jekyll environment variables was missing from the documentation. This seemed like a good place to include it. --- site/_docs/configuration.md | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 1c9b339f..4a5e0624 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -201,6 +201,14 @@ class="flag">flags (specified on the command-line) that control them.

--drafts

+ + +

Environment

+

Use a specific environment value in the build

+ + +

JEKYLL_ENV=production

+

Future

@@ -263,6 +271,8 @@ class="flag">flags (specified on the command-line) that control them.
+ + ### Serve Command Options In addition to the options below, the `serve` sub-command can accept any of the options @@ -339,6 +349,34 @@ before your site is served.

+## 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. + +For example, suppose you set this conditional statement in your code: + +```liquid + {% raw %} + {% if jekyll.environment == "production" %} + {% include disqus.html %} + {% endif %} + {% endraw %} +``` + +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: + +```bash +JEKYLL_ENV=production jekyll build +``` + +Specifying an environment value allows you to make certain content available only within specific environments. + +The default value for `JEKYLL_ENV` is `development`. Therefore if you omit `JEKYLL_ENV` from the build arguments, the default value will be `JEKYLL_ENV=development`. Any content inside `{% raw %}{% if jekyll.environment == "development" %}{% raw %}` tags will automatically appear in the build. + +Your environment values can be anything you want (not just `development` or `production`). Some elements you might want to hide in development environments include Disqus comment forms or Google Analytics. Conversely, you might want to expose an "Edit me in Github" button in a development 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. + ## Front Matter defaults Using [YAML Front Matter](../frontmatter/) is one way that you can specify configuration in the pages and posts for your site. Setting things like a default layout, or customizing the title, or specifying a more precise date/time for the post can all be added to your page or post front matter. From 38a561a14cd17f0cd28dcff1317ee3d7677f6ac2 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Tue, 22 Sep 2015 14:28:32 -0700 Subject: [PATCH 082/810] Made small pull request fixes as noted by Parker --- site/_docs/configuration.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 4a5e0624..af4ce145 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -201,14 +201,15 @@ class="flag">flags (specified on the command-line) that control them.

--drafts

- +

Environment

-

Use a specific environment value in the build

+

Use a specific environment value in the build.

JEKYLL_ENV=production

+

Future

@@ -272,7 +273,6 @@ class="flag">flags (specified on the command-line) that control them. - ### Serve Command Options In addition to the options below, the `serve` sub-command can accept any of the options @@ -358,7 +358,7 @@ For example, suppose you set this conditional statement in your code: ```liquid {% raw %} {% if jekyll.environment == "production" %} - {% include disqus.html %} + {% include disqus.html %} {% endif %} {% endraw %} ``` @@ -373,7 +373,7 @@ Specifying an environment value allows you to make certain content available onl The default value for `JEKYLL_ENV` is `development`. Therefore if you omit `JEKYLL_ENV` from the build arguments, the default value will be `JEKYLL_ENV=development`. Any content inside `{% raw %}{% if jekyll.environment == "development" %}{% raw %}` tags will automatically appear in the build. -Your environment values can be anything you want (not just `development` or `production`). Some elements you might want to hide in development environments include Disqus comment forms or Google Analytics. Conversely, you might want to expose an "Edit me in Github" button in a development environment but not include it in production environments. +Your environment values can be anything you want (not just `development` or `production`). Some elements you might want to hide in development environments include Disqus comment forms or Google Analytics. Conversely, you might want to expose an "Edit me in GitHub" button in a development 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. From 8563f591259fc99e183dd74db3e234f61a585538 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 22 Sep 2015 21:07:09 -0700 Subject: [PATCH 083/810] Update history to reflect merge of #3989 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 65bdec0b..b527747a 100644 --- a/History.markdown +++ b/History.markdown @@ -250,6 +250,7 @@ * 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) ## 2.5.3 / 2014-12-22 From c7bc76269c3d3c87235000f5fde4c51491b738ac Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 23 Sep 2015 17:32:33 -0700 Subject: [PATCH 084/810] Abort if no subcommand. Fixes #3412 --- lib/jekyll/deprecator.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/deprecator.rb b/lib/jekyll/deprecator.rb index dfd3183c..8fda510b 100644 --- a/lib/jekyll/deprecator.rb +++ b/lib/jekyll/deprecator.rb @@ -3,9 +3,10 @@ module Jekyll extend self def process(args) - no_subcommand(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 \ + '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'." @@ -16,12 +17,13 @@ module Jekyll 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." + 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." + deprecation_message "Jekyll now uses subcommands instead of just switches. Run `jekyll --help` to find out more." + abort end end From 22b59ae793b31c2d7812161462326cabf3decbb0 Mon Sep 17 00:00:00 2001 From: Pedro Euko Date: Wed, 23 Sep 2015 13:38:11 -0300 Subject: [PATCH 085/810] Added permalink time variables --- features/permalinks.feature | 13 +++++++++++++ lib/jekyll/post.rb | 3 +++ site/_docs/permalinks.md | 30 ++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/features/permalinks.feature b/features/permalinks.feature index cb90d1f7..bc13de88 100644 --- a/features/permalinks.feature +++ b/features/permalinks.feature @@ -64,6 +64,19 @@ Feature: Fancy permalinks Then 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 + Given I have a _posts directory + And I have the following post: + | title | category | date | content | + | Custom Permalink Schema | stuff | 2009-03-27 22:31:07 | Totally custom. | + And I have a configuration file with: + | key | value | + | permalink | "/:year:month:day:hour:minute:second.html" | + | timezone | UTC | + When I run jekyll build + Then the _site directory should exist + And I should see "Totally custom." in "_site/20090327223107.html" + Scenario: Use per-post permalink Given I have a _posts directory And I have the following post: diff --git a/lib/jekyll/post.rb b/lib/jekyll/post.rb index 62973d1d..85d168d9 100644 --- a/lib/jekyll/post.rb +++ b/lib/jekyll/post.rb @@ -227,6 +227,9 @@ module Jekyll :year => date.strftime("%Y"), :month => date.strftime("%m"), :day => date.strftime("%d"), + :hour => date.strftime("%H"), + :minute => date.strftime("%M"), + :second => date.strftime("%S"), :title => slug, :i_day => date.strftime("%-d"), :i_month => date.strftime("%-m"), diff --git a/site/_docs/permalinks.md b/site/_docs/permalinks.md index 962d4fe7..ddbbc13f 100644 --- a/site/_docs/permalinks.md +++ b/site/_docs/permalinks.md @@ -73,6 +73,36 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti

Year from the Post’s filename without the century.

+ + +

hour

+ + +

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

+ + + + +

minute

+ + +

+ Minute of the hour from the Post’s filename. (00..59) +

+ + + + +

second

+ + +

+ Second of the minute from the Post’s filename. (00..60) +

+ +

title

From f9925bef2b54aaac660c6f69ae44129350bea9a5 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 24 Sep 2015 12:59:05 -0500 Subject: [PATCH 086/810] Update history.markdown to reflect the merge of #3990 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b527747a..0b880fe9 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * 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) ### Minor Enhancements From 16eef805391c49c68da92ca1c0c72dbf07bc70fd Mon Sep 17 00:00:00 2001 From: Arthur Hammer Date: Thu, 24 Sep 2015 18:16:06 +0200 Subject: [PATCH 087/810] Fix broken configuration documentation page --- site/_docs/configuration.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index af4ce145..ffbef8a4 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -351,27 +351,27 @@ before your site is served. ## 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. +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. For example, suppose you set this conditional statement in your code: -```liquid - {% raw %} - {% if jekyll.environment == "production" %} - {% include disqus.html %} - {% endif %} - {% endraw %} -``` +{% highlight 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: -```bash -JEKYLL_ENV=production jekyll build -``` +{% highlight sh %} +JEKYLL_ENV=production jekyll build +{% endhighlight %} Specifying an environment value allows you to make certain content available only within specific environments. -The default value for `JEKYLL_ENV` is `development`. Therefore if you omit `JEKYLL_ENV` from the build arguments, the default value will be `JEKYLL_ENV=development`. Any content inside `{% raw %}{% if jekyll.environment == "development" %}{% raw %}` tags will automatically appear in the build. +The default value for `JEKYLL_ENV` is `development`. Therefore if you omit `JEKYLL_ENV` from the build arguments, the default value will be `JEKYLL_ENV=development`. Any content inside `{% raw %}{% if jekyll.environment == "development" %}{% endraw %}` tags will automatically appear in the build. Your environment values can be anything you want (not just `development` or `production`). Some elements you might want to hide in development environments include Disqus comment forms or Google Analytics. Conversely, you might want to expose an "Edit me in GitHub" button in a development environment but not include it in production environments. From 51f32502b9a0460d3501e3539a92567c3cf6ef40 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 24 Sep 2015 13:42:34 -0500 Subject: [PATCH 088/810] Update history.markdown to reflect the merge of #3994 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0b880fe9..a86b4399 100644 --- a/History.markdown +++ b/History.markdown @@ -252,6 +252,7 @@ * 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) ## 2.5.3 / 2014-12-22 From abcab4b91f35d000f820cc8d6efbb6184c899169 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 24 Sep 2015 16:07:03 -0700 Subject: [PATCH 089/810] Update history to reflect merge of #3992 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a86b4399..7a73bcd0 100644 --- a/History.markdown +++ b/History.markdown @@ -135,6 +135,7 @@ * 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) ### Development Fixes From 85b6d936d8885eaf488cddf5b88035c921db6c5b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 24 Sep 2015 16:24:26 -0700 Subject: [PATCH 090/810] docs: include backup github-pages Gemfile Fixes #3985 --- 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 86e9682a..c9a4644c 100644 --- a/site/_docs/github-pages.md +++ b/site/_docs/github-pages.md @@ -41,6 +41,16 @@ 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: + +{% highlight ruby %} +source 'https://rubygems.org' + +gem 'github-pages' +{% endhighlight %} + + And be sure to run bundle update often.

From 1703b59ce8ba219e8266cc0c8fa19190776cbe37 Mon Sep 17 00:00:00 2001 From: David Herman Date: Fri, 25 Sep 2015 18:57:46 -0700 Subject: [PATCH 091/810] Add header message to _config.yml The first thing new users to Jekyll do is open _config.yml, so this change adds a simple welcome message to the top of it. Additionally, it informs the user that the file is not automatically reloaded when changed, which is a point of confusion for new users. Related issue: https://github.com/jekyll/jekyll/issues/2302 --- lib/site_template/_config.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index f4151011..1c5e5bc9 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -1,3 +1,10 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely need to edit after that. +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'jekyll serve'. If you change this file, please restart the server process. + # Site settings title: Your awesome title email: your-email@domain.com From 2807b8a012ead8b8fe7ed30f1a8ad1f6f9de7ba4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Sep 2015 12:35:22 -0700 Subject: [PATCH 092/810] Update history to reflect merge of #3997 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7a73bcd0..49ccd08e 100644 --- a/History.markdown +++ b/History.markdown @@ -88,6 +88,7 @@ * 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) ### Bug Fixes From 269018b0110133e5fdb9f508e300eed19fdc6b4d Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Sun, 27 Sep 2015 15:49:24 -0400 Subject: [PATCH 093/810] Instructions for El Capitan --- site/_docs/troubleshooting.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index 602d62a3..4a1a2b91 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -60,12 +60,43 @@ which may allow you to install native gems using this command (again using sudo gem install jekyll {% endhighlight %} -Note that upgrading MacOS X does not automatically upgrade Xcode itself +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 Xcode.app can interfere with the command line tools downloaded above. If you run into this issue, upgrade Xcode and install the upgraded Command Line Tools. +### Jekyll & Mac OS X 10.11 + +With the introduction of System Integrity Protection, several directories +that were previously writable are now considered system locations and are no +longer available. As a result, it is recommended that you choose one of a +number of available Ruby environments ([RVM][], [rbenv][], [chruby][], etc.) in +which to install Jekyll. + +[RVM]: https://rvm.io +[rbenv]: http://rbenv.org +[chruby]: https://github.com/postmodern/chruby + +If you elect to use a method other than Homebrew to install Ruby, it may be +necessary to modify your `$PATH` variable using the following command: + +{% highlight bash %} +export PATH=/usr/local/bin:$PATH +{% endhighlight %} + +GUI apps can modify the `$PATH` as follows: + +{% highlight bash %} +launchctl setenv PATH "/usr/local/bin:$PATH" +{% endhighlight %} + +This approach is useful because `/usr/local` is considered a "safe" location on +systems which have SIP enabled, it avoids potential conflicts with the +version of Ruby included by Apple, and it keeps Jekyll and its +dependencies in a sandboxed environment. Therefore, individual gems +can be added or removed according to your specific needs. + To install RubyGems on Gentoo: {% highlight bash %} From 951c604017c2d7a241011f96ee92c3b8ab5c70fd Mon Sep 17 00:00:00 2001 From: hartmel Date: Mon, 28 Sep 2015 22:18:02 +0200 Subject: [PATCH 094/810] Add timezone as hour & minute offset in the initial post in the new site template. Fixes #3998 --- .../_posts/0000-00-00-welcome-to-jekyll.markdown.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb b/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb index a1f2407c..6ad29942 100644 --- a/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +++ b/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb @@ -1,7 +1,7 @@ --- layout: post title: "Welcome to Jekyll!" -date: <%= Time.now.strftime('%Y-%m-%d %H:%M:%S') %> +date: <%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %> 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. From ed7fcf6773dc4aa9a9b3852d450dbd67c56617f6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 28 Sep 2015 14:03:30 -0700 Subject: [PATCH 095/810] Update history to reflect merge of #4001 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 49ccd08e..0e31fcfc 100644 --- a/History.markdown +++ b/History.markdown @@ -89,6 +89,7 @@ * 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) ### Bug Fixes From ca29e4f585632d38866f75fbe6cd395d364518fc Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Mon, 28 Sep 2015 21:31:27 -0400 Subject: [PATCH 096/810] Feedback from @parkr, rephrasing, and link to Ruby managers --- site/_docs/troubleshooting.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index 4a1a2b91..daf0764d 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -71,15 +71,17 @@ Line Tools. With the introduction of System Integrity Protection, several directories that were previously writable are now considered system locations and are no longer available. As a result, it is recommended that you choose one of a -number of available Ruby environments ([RVM][], [rbenv][], [chruby][], etc.) in +number of Ruby version managers ([RVM][], [rbenv][], [chruby][], [etc][].) in which to install Jekyll. [RVM]: https://rvm.io [rbenv]: http://rbenv.org [chruby]: https://github.com/postmodern/chruby +[etc]: https://github.com/rvm/rvm/blob/master/docs/alt.md -If you elect to use a method other than Homebrew to install Ruby, it may be -necessary to modify your `$PATH` variable using the following command: +If you elect to use a method other than those listed above to install +Ruby (such as Homebrew), it may be necessary to modify your `$PATH` +variable using the following command: {% highlight bash %} export PATH=/usr/local/bin:$PATH @@ -91,11 +93,14 @@ GUI apps can modify the `$PATH` as follows: launchctl setenv PATH "/usr/local/bin:$PATH" {% endhighlight %} +Once you've done that, `brew install ruby` and `gem install jekyll` should work +as expected. + This approach is useful because `/usr/local` is considered a "safe" location on systems which have SIP enabled, it avoids potential conflicts with the version of Ruby included by Apple, and it keeps Jekyll and its -dependencies in a sandboxed environment. Therefore, individual gems -can be added or removed according to your specific needs. +dependencies in a sandboxed environment. Therefore, individual gems can be +added or removed according to your specific needs. To install RubyGems on Gentoo: From 9c9481a8a99bd3bbee10bb9f9feca23f97b9a30d Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Wed, 30 Sep 2015 12:57:09 -0400 Subject: [PATCH 097/810] Notes for Homebrew, advanced installs, and cleanup --- site/_docs/troubleshooting.md | 52 +++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index daf0764d..cf0c3d8e 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -40,6 +40,15 @@ export PATH=$PATH:/home/private/gems/bin export RB_USER_INSTALL='true' {% endhighlight %} +To install RubyGems on Gentoo: + +{% highlight bash %} +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 bash %} @@ -70,7 +79,21 @@ Line Tools. With the introduction of System Integrity Protection, several directories that were previously writable are now considered system locations and are no -longer available. As a result, it is recommended that you choose one of a +longer available. Given these changes, the simplest way to get up and running +is to install Homebrew and then use it to set up Ruby. This can be done as +follows: + +{% highlight bash %} +ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" +{% endhighlight %} + +Once Homebrew is installed, the second step is easy: + +{% highlight bash %} +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 which to install Jekyll. @@ -79,9 +102,8 @@ which to install Jekyll. [chruby]: https://github.com/postmodern/chruby [etc]: https://github.com/rvm/rvm/blob/master/docs/alt.md -If you elect to use a method other than those listed above to install -Ruby (such as Homebrew), it may be necessary to modify your `$PATH` -variable using the following command: +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 %} export PATH=/usr/local/bin:$PATH @@ -93,23 +115,11 @@ GUI apps can modify the `$PATH` as follows: launchctl setenv PATH "/usr/local/bin:$PATH" {% endhighlight %} -Once you've done that, `brew install ruby` and `gem install jekyll` should work -as expected. - -This approach is useful because `/usr/local` is considered a "safe" location on -systems which have SIP enabled, it avoids potential conflicts with the -version of Ruby included by Apple, and it keeps Jekyll and its -dependencies in a sandboxed environment. Therefore, individual gems can be -added or removed according to your specific needs. - -To install RubyGems on Gentoo: - -{% highlight bash %} -sudo emerge -av dev-ruby/rubygems -{% endhighlight %} - -On Windows, you may need to install [RubyInstaller -DevKit](https://wiki.github.com/oneclick/rubyinstaller/development-kit). +Either of these approaches are useful because `/usr/local` is considered a +"safe" location on systems which have SIP enabled, they avoid potential +conflicts with the version of Ruby included by Apple, and it keeps Jekyll and +its dependencies in a sandboxed environment. This also has the added +benefit of not requiring `sudo` when you want to add or remove a gem. ### Could not find a JavaScript runtime. (ExecJS::RuntimeUnavailable) From 9f4d4bbae03aae862bdd825ef3223ea538adbf79 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 30 Sep 2015 21:23:41 -0700 Subject: [PATCH 098/810] Update history to reflect merge of #3999 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0e31fcfc..c0c511ba 100644 --- a/History.markdown +++ b/History.markdown @@ -256,6 +256,7 @@ * 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) ## 2.5.3 / 2014-12-22 From bb9462f12fd9d68a86017c6f174b3dd1d817d6e3 Mon Sep 17 00:00:00 2001 From: Kevin Locke Date: Thu, 1 Oct 2015 13:58:00 -0700 Subject: [PATCH 099/810] Whole-post excerpts should match the post content When a post does not contain an excerpt_separator, meaning the excerpt includes the entire post, the excerpt should contain exactly the post content. This is desirable both from a correctness standpoint, that the excerpt should not introduce any new content, and more practically to allow fast and easy detection of whole-post excerpts in Liquid templates using `post.excerpt == post.content`. A common use-case is deciding whether to render "Read More" links on a page containing post excerpts. This commit does exactly that. It avoids adding additional newlines to the excerpt content when the excerpt includes the whole post and adds tests to ensure that this behavior is correct and preserved going forward. Signed-off-by: Kevin Locke --- features/post_excerpts.feature | 2 +- lib/jekyll/excerpt.rb | 6 +++++- test/test_excerpt.rb | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/features/post_excerpts.feature b/features/post_excerpts.feature index e9d048bd..c66c527b 100644 --- a/features/post_excerpts.feature +++ b/features/post_excerpts.feature @@ -47,4 +47,4 @@ Feature: Post excerpts And the _site/2007/12/31 directory should exist And the "_site/2007/12/31/entry1.html" file should exist And I should see "

content for entry1.

" in "_site/index.html" - And I should see "

content for entry1.

\n\n" in "_site/2007/12/31/entry1.html" + And I should see "

content for entry1.

\n" in "_site/2007/12/31/entry1.html" diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index 347be217..3d463944 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -107,7 +107,11 @@ module Jekyll def extract_excerpt(post_content) head, _, tail = post_content.to_s.partition(post.excerpt_separator) - "" << head << "\n\n" << tail.scan(/^\[[^\]]+\]:.+$/).join("\n") + if tail.empty? + head + else + "" << head << "\n\n" << tail.scan(/^\[[^\]]+\]:.+$/).join("\n") + end end end end diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index ecd42148..a5025cda 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -124,4 +124,23 @@ class TestExcerpt < JekyllUnitTest end end end + + context "A whole-post excerpt" do + setup do + clear_dest + @site = Site.new(site_configuration) + @post = setup_post("2008-02-02-published.markdown") + @excerpt = @post.send :extract_excerpt + end + + should "be generated" do + assert_equal true, @excerpt.is_a?(Jekyll::Excerpt) + end + + context "#content" do + should "match the post content" do + assert_equal @post.content, @excerpt.content + end + end + end end From 464d4b0254833d296f45bf9cd1ec50b843e2271e Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 8 Oct 2015 09:59:15 +0300 Subject: [PATCH 100/810] update plugins documentation you have to install gem files for plugins for them in order to work --- 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 440623bf..4b14ec1b 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -29,7 +29,7 @@ You have 3 options for installing 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 -values of the gem names of the plugins you'd like to use. An example: +values of the gem names of the plugins you'd like to use. Don't foreget to install your plugins using `gem install my-jekyll-plugin` prior running jekyll. An example: gems: [jekyll-test-plugin, jekyll-jsonify, jekyll-assets] # This will require each of these gems automatically. From 3435d05c2a4e41a44784e27058460be86a16134d Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 8 Oct 2015 10:23:29 +0300 Subject: [PATCH 101/810] Update plugins.md Note to option 2 and 3 for installing plugins --- site/_docs/plugins.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 4b14ec1b..75832afd 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -29,7 +29,7 @@ You have 3 options for installing 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 -values of the gem names of the plugins you'd like to use. Don't foreget to install your plugins using `gem install my-jekyll-plugin` prior running jekyll. An example: +values of the gem names of the plugins you'd like to use. An example: gems: [jekyll-test-plugin, jekyll-jsonify, jekyll-assets] # This will require each of these gems automatically. @@ -40,6 +40,8 @@ values of the gem names of the plugins you'd like to use. Don't foreget to insta gem "my-jekyll-plugin" end +Both option 2 and 3 require you to install your plugins using `gem install my-jekyll-plugin` prior running jekyll. +
_plugins, _config.yml and Gemfile From 30d82aff5d965e81f580f3f0d71d825d9ddb8474 Mon Sep 17 00:00:00 2001 From: takuti Date: Thu, 8 Oct 2015 22:31:15 +0900 Subject: [PATCH 102/810] Update 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 440623bf..dd920058 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -736,6 +736,7 @@ LESS.js files during generation. - [Customized Kramdown Converter](https://github.com/mvdbos/kramdown-with-pygments): Enable Pygments syntax highlighting for Kramdown-parsed fenced code blocks. - [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. #### Filters From b9bdb85a47ce7d0435ba6b6fc4bb5eb676cf4503 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Thu, 8 Oct 2015 08:52:58 -0500 Subject: [PATCH 103/810] Update history to reflect merge of #4015 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c0c511ba..ef0b93ab 100644 --- a/History.markdown +++ b/History.markdown @@ -257,6 +257,7 @@ * 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) ## 2.5.3 / 2014-12-22 From bc3e67da62bd23b45d4e45f42c1e42eb61bd5296 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 8 Oct 2015 21:47:29 +0300 Subject: [PATCH 104/810] Update plugins.md Added gem install and bundle install commands for plugins set up --- site/_docs/plugins.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 75832afd..fb29967b 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -28,19 +28,26 @@ 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 `gems` and the values of the gem names of the plugins you'd like to use. An example: + ```rb gems: [jekyll-test-plugin, jekyll-jsonify, jekyll-assets] # This will require each of these gems automatically. -3. Add the relevant plugins to a Bundler group in your `Gemfile`. An + ``` + + * Install your plugins using `gem install jekyll-test-plugin` +3. * Add the relevant plugins to a Bundler group in your `Gemfile`. An example: + ```rb group :jekyll_plugins do gem "my-jekyll-plugin" end + ``` + + * Run `bundle install` -Both option 2 and 3 require you to install your plugins using `gem install my-jekyll-plugin` prior running jekyll.
From 6cda306bbf8d332dfdd46167eaf66e9bdc868fcf Mon Sep 17 00:00:00 2001 From: Anton Date: Fri, 9 Oct 2015 10:23:08 +0300 Subject: [PATCH 105/810] Update plugins.md Corrected display of installing options --- site/_docs/plugins.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index fb29967b..584bc6cd 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -28,25 +28,24 @@ 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 `gems` and the values of the gem names of the plugins you'd like to use. An example: - ```rb + gems: [jekyll-test-plugin, jekyll-jsonify, jekyll-assets] # This will require each of these gems automatically. - ``` - - * Install your plugins using `gem install jekyll-test-plugin` -3. * Add the relevant plugins to a Bundler group in your `Gemfile`. An + + Then install your plugins using `gem install jekyll-test-plugin jekyll-jsonify jekyll-assets` + +3. Add the relevant plugins to a Bundler group in your `Gemfile`. An example: - ```rb group :jekyll_plugins do gem "my-jekyll-plugin" + gem "another-jekyll-plugin" end - ``` - - * Run `bundle install` + + Now you need to install all plugins from your Bundler group by running single command `bundle install`
From 9b091f8d5d5800c1332d4653a2928675a2ec7d48 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 9 Oct 2015 07:28:02 -0500 Subject: [PATCH 106/810] Update Kramdown and reduce it's constraints. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index a6d2a5b8..3639ecfe 100644 --- a/Gemfile +++ b/Gemfile @@ -44,7 +44,7 @@ gem 'jekyll-coffeescript', '~> 1.0' gem 'jekyll-feed' gem 'jekyll-gist', '~> 1.0' gem 'mime-types', '~> 2.6' -gem 'kramdown', '~> 1.8.0' +gem 'kramdown', '~> 1.9' platform :ruby, :mswin, :mingw do gem 'rdiscount', '~> 2.0' From 611af3f4564a756f161d0f8d7aec3ef6a26db662 Mon Sep 17 00:00:00 2001 From: Jesse W Date: Fri, 9 Oct 2015 11:35:18 -0700 Subject: [PATCH 107/810] added alternative jekyll gem installation instructions --- site/_docs/troubleshooting.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index cf0c3d8e..02f10b95 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -79,8 +79,15 @@ Line Tools. With the introduction of System Integrity Protection, several directories that were previously writable are now considered system locations and are no -longer available. Given these changes, the simplest way to get up and running -is to install Homebrew and then use it to set up Ruby. This can be done as +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 %} +sudo gem install -n /usr/local/bin jekyll +{% endhighlight %} + +Alternatively, Homebrew can be install and used to set up Ruby. This can be done as follows: {% highlight bash %} From 45902b20476f691b348cf64991c059c93f4def28 Mon Sep 17 00:00:00 2001 From: Marcus Stollsteimer Date: Sun, 11 Oct 2015 19:49:40 +0200 Subject: [PATCH 108/810] Avoid "mismatched indentations" warning for ruby -w --- lib/jekyll/tags/highlight.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index de8a7393..454c09a2 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -48,13 +48,13 @@ eos output = case context.registers[:site].highlighter - when 'pygments' - render_pygments(code, is_safe) - when 'rouge' - render_rouge(code) - else - render_codehighlighter(code) - end + when 'pygments' + render_pygments(code, is_safe) + when 'rouge' + render_rouge(code) + else + render_codehighlighter(code) + end rendered_output = add_code_tag(output) prefix + rendered_output + suffix From 3eb25217ce52d0b7ac49619490f801f65fde9fdc Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 11 Oct 2015 14:35:52 -0700 Subject: [PATCH 109/810] Added installation instructions for 2 of the 3 options for plugins. Fixes #4013. --- site/_docs/plugins.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index dd920058..6be050d8 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -31,15 +31,23 @@ Jekyll generates your site. 2. In your `_config.yml` file, add a new array with the key `gems` and the values of the gem names of the plugins you'd like to use. An example: + gems: [jekyll-test-plugin, jekyll-jsonify, jekyll-assets] # This will require each of these gems automatically. + + Then install your plugins using `gem install jekyll-test-plugin jekyll-jsonify jekyll-assets` + 3. Add the relevant plugins to a Bundler group in your `Gemfile`. An example: group :jekyll_plugins do gem "my-jekyll-plugin" + gem "another-jekyll-plugin" end + Now you need to install all plugins from your Bundler group by running single command `bundle install` + +
_plugins, _config.yml and Gemfile From e7043ac4f3daf4a641b171df26b5f3e4df51bb3b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 11 Oct 2015 14:37:49 -0700 Subject: [PATCH 110/810] Update history to reflect merge of #4013 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ef0b93ab..9422ab3c 100644 --- a/History.markdown +++ b/History.markdown @@ -258,6 +258,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 53f975feb4a2cc8df7dabc7bbe4738fdb21950ff Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 11 Oct 2015 14:50:30 -0700 Subject: [PATCH 111/810] Update history to reflect merge of #4018 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9422ab3c..c4aa52e6 100644 --- a/History.markdown +++ b/History.markdown @@ -259,6 +259,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 8e1dd75312fe0bff09b60eec218a9d70e7a4dcda Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Sun, 11 Oct 2015 21:09:44 -0400 Subject: [PATCH 112/810] Fixed a typo, wrap at 80 characters --- site/_docs/troubleshooting.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index 02f10b95..5d7b1ad9 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -79,16 +79,16 @@ Line Tools. With the introduction of System Integrity Protection, several directories that were previously writable are now considered system locations and are no -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): +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 %} sudo gem install -n /usr/local/bin jekyll {% endhighlight %} -Alternatively, Homebrew can be install and used to set up Ruby. This can be done as -follows: +Alternatively, Homebrew can be installed and used to set up Ruby. This can be +done as follows: {% highlight bash %} ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" From 7ae044ee44c7539547f47471806d4d34a1cea9fd Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 11 Oct 2015 22:17:37 -0500 Subject: [PATCH 113/810] Update history.markdown to reflect the merge of #4022 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c4aa52e6..139cc274 100644 --- a/History.markdown +++ b/History.markdown @@ -260,6 +260,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 63144fd46d03941d67f02b3b3f9e3bbbd84deca0 Mon Sep 17 00:00:00 2001 From: MonsieurV Date: Wed, 14 Oct 2015 22:12:08 +0200 Subject: [PATCH 114/810] Fix pretty permalink example Following what the documentation specify above for the pretty permalink format (`/:categories/:year/:month/:day/:title/`), it should result for the example to `/2009/04/29/slap-chop/` and not `/2009/04/29/slap-chop/index.html`. Well, at least if I've understood correctly ;-) --- site/_docs/permalinks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/permalinks.md b/site/_docs/permalinks.md index ddbbc13f..7bc46675 100644 --- a/site/_docs/permalinks.md +++ b/site/_docs/permalinks.md @@ -234,7 +234,7 @@ Given a post named: `/2009-04-29-slap-chop.md`

pretty

-

/2009/04/29/slap-chop/index.html

+

/2009/04/29/slap-chop/

From 8add5aec4b8490aa129a01cee4d37c215f6b6dc8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 15 Oct 2015 11:38:42 -0700 Subject: [PATCH 115/810] Update history to reflect merge of #4029 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 139cc274..3a844840 100644 --- a/History.markdown +++ b/History.markdown @@ -261,6 +261,7 @@ * 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) ## 2.5.3 / 2014-12-22 From b72556fd03d944e29276f58f9a6163352a81e142 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Thu, 15 Oct 2015 20:34:44 -0500 Subject: [PATCH 116/810] Make a constant for the regex to find hidden files A raw regular expression isn't very expressive, IMHO. Rather than having people who read this code parse the regular expression to figure out what it's for, let's give a name. This way, it becomes more obvious what exactly it is we're doing here. --- lib/jekyll/cleaner.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index 70bd2f79..30c0a432 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -3,6 +3,7 @@ require 'set' module Jekyll # Handles the cleanup of a site's destination before it is built. class Cleaner + HIDDEN_FILE_REGEX = /\/\.{1,2}$/ attr_reader :site def initialize(site) @@ -40,7 +41,7 @@ module Jekyll dirs = keep_dirs Dir.glob(site.in_dest_dir("**", "*"), File::FNM_DOTMATCH) do |file| - next if file =~ /\/\.{1,2}$/ || file =~ regex || dirs.include?(file) + next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file) files << file end From ff504a39ba00b9524fccc2531c7320a9b87ca051 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Thu, 15 Oct 2015 20:59:34 -0500 Subject: [PATCH 117/810] Ignore `.bundle` when generating test coverage Fix the code coverage reporting when using `.bundle` to store my gems in by having SimpleCov ignore that directory. Use of `.bundle` to store my gems consolidates things since since that directory also holds the bundler config file. It also keeps a `vendor` directory out of the project tree for non-Rails projects. Simplecov was not ignoring that directory though, which meant that the code coverage numbers I were seeing locally were wrong (and very frightening). With this change, all is right with the world once again. :smiley: --- test/helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/helper.rb b/test/helper.rb index 0b64e5e0..db3b8822 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -7,6 +7,7 @@ unless ENV['TRAVIS'] SimpleCov.start('gem') do add_filter "/vendor/bundle" add_filter "/vendor/gem" + add_filter ".bundle" end end From b1125f53de92fcacd6346dbcad98084b2e9c62b0 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Thu, 15 Oct 2015 21:13:32 -0500 Subject: [PATCH 118/810] Update history to reflect merge of #4004 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3a844840..dec8be87 100644 --- a/History.markdown +++ b/History.markdown @@ -138,6 +138,7 @@ * 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) ### Development Fixes From d3e4c931635b8b30a6ba367c97365a80c4d9b19d Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 16 Oct 2015 06:11:36 -0500 Subject: [PATCH 119/810] Update history.markdown to reflect the merge of #4033 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index dec8be87..602fb09b 100644 --- a/History.markdown +++ b/History.markdown @@ -177,6 +177,7 @@ * 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 From 14f351fc19e2473e7eb65e55ead069d102132365 Mon Sep 17 00:00:00 2001 From: "jaybe@jekyll" Date: Fri, 16 Oct 2015 11:53:31 -0500 Subject: [PATCH 120/810] Update usage.md re: _config.yml not reloaded during automatic regeneration _config.yml not reloaded during automatic regeneration --- site/_docs/usage.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/site/_docs/usage.md b/site/_docs/usage.md index 7a424bd4..2d2b8fc4 100644 --- a/site/_docs/usage.md +++ b/site/_docs/usage.md @@ -22,6 +22,18 @@ $ jekyll build --watch # watched for changes, and regenerated automatically. {% endhighlight %} +
+
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> + during automatic regeneration are not loaded until the next execution. +

+

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

+
+
Destination folders are cleaned on site builds

From 16c0bf8db89c7a92a7a4c53cee4ae58ab875543d Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 16 Oct 2015 12:02:13 -0500 Subject: [PATCH 121/810] Update history.markdown to reflect the merge of #4034 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 602fb09b..3428c388 100644 --- a/History.markdown +++ b/History.markdown @@ -264,6 +264,7 @@ * 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) ## 2.5.3 / 2014-12-22 From 87f9ed94a91d4d23e8e01b72553adb90558343b1 Mon Sep 17 00:00:00 2001 From: "jaybe@jekyll" Date: Fri, 16 Oct 2015 12:08:29 -0500 Subject: [PATCH 122/810] Remove brackets around _config.yml Referring to _config.yml consistently with --- site/_docs/usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/usage.md b/site/_docs/usage.md index 2d2b8fc4..28c4efb0 100644 --- a/site/_docs/usage.md +++ b/site/_docs/usage.md @@ -25,8 +25,8 @@ $ jekyll build --watch

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> + The _config.yml master configuration file contains global configurations + and variable definitions that are read once at execution time. Changes made to _config.yml during automatic regeneration are not loaded until the next execution.

From ff55da727ecbd6e5fa4c91c98c782fcf2c5ffaa7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 16 Oct 2015 12:53:18 -0700 Subject: [PATCH 123/810] Release :gem: 3.0.0.pre.beta10 --- 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 a5d8a120..5970bff1 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.0.0.pre.beta9' + VERSION = '3.0.0.pre.beta10' end From 62d628c7e0cfb3be3bda1d391d1f9cd89f378d75 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 17 Oct 2015 06:57:40 -0500 Subject: [PATCH 124/810] Update history.markdown to reflect the merge of #4032 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3428c388..d26bf634 100644 --- a/History.markdown +++ b/History.markdown @@ -90,6 +90,7 @@ * 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) ### Bug Fixes From d63acc140db95f62e851b984005fb07701d97e98 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 17 Oct 2015 11:12:01 -0700 Subject: [PATCH 125/810] installation docs: specify Python 2.7 as dep for Jekyll 2 Fixes #4036. --- 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 99709c71..f0c091f0 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -20,7 +20,7 @@ requirements you’ll need to make sure your system has before you start. - Linux, Unix, or Mac OS X - [NodeJS](http://nodejs.org), or another JavaScript runtime (Jekyll 2 and earlier, for CoffeeScript support). -- Python (Jekyll 2 and earlier) +- [Python 2.7](https://www.python.org/downloads/) (for Jekyll 2 and earlier)

Running Jekyll on Windows
From aa9927f073517cfab7292d4f178f103a7e605698 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Sun, 18 Oct 2015 23:00:56 -0400 Subject: [PATCH 126/810] Apply the highlight class --- site/_docs/contributing.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/site/_docs/contributing.md b/site/_docs/contributing.md index ae768e5b..1feec0dc 100644 --- a/site/_docs/contributing.md +++ b/site/_docs/contributing.md @@ -45,20 +45,20 @@ 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: - $ script/bootstrap +
$ script/bootstrap
Before you start, run the tests and make sure that they pass (to confirm your environment is configured properly): - $ script/cibuild +
$ script/cibuild
If you are only updating a file in `test/`, you can use the command: - $ script/test test/blah_test.rb +
$ script/test test/blah_test.rb
If you are only updating a `.feature` file, you can use the command: - $ script/cucumber features/blah.feature +
$ script/cucumber features/blah.feature
Both `script/test` and `script/cucumber` can be run without arguments to run its entire respective suite. From 36a41cd22424f5cca95e11403e91114f01f67542 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Mon, 19 Oct 2015 12:06:46 -0400 Subject: [PATCH 127/810] 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 ffbef8a4..fb7cd2f3 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 ae768e5b..4728e96e 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 c1040b2b..1fb0c64c 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 9186345eca8d7e75e2deda75c32d03187a17298d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 19 Oct 2015 10:00:20 -0700 Subject: [PATCH 128/810] Update history to reflect merge of #4046 [ci skip] --- History.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index d26bf634..e66fe324 100644 --- a/History.markdown +++ b/History.markdown @@ -265,7 +265,8 @@ * 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) + * Note that `_config.yml` is not reloaded during regeneration (#4034) + * Apply code block figure syntax to blocks in CONTRIBUTING (#4046) ## 2.5.3 / 2014-12-22 From c2c671641df7fa3604d99fbd2f66720e5dcc1000 Mon Sep 17 00:00:00 2001 From: BigBlueHat Date: Tue, 20 Oct 2015 08:43:34 -0400 Subject: [PATCH 129/810] Move GitHub & Twitter icons into includes --- lib/site_template/_includes/footer.html | 9 ++------- lib/site_template/_includes/icon-github.svg | 3 +++ lib/site_template/_includes/icon-twitter.svg | 4 ++++ 3 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 lib/site_template/_includes/icon-github.svg create mode 100644 lib/site_template/_includes/icon-twitter.svg diff --git a/lib/site_template/_includes/footer.html b/lib/site_template/_includes/footer.html index 8fa89ba9..9fbc29e3 100644 --- a/lib/site_template/_includes/footer.html +++ b/lib/site_template/_includes/footer.html @@ -18,9 +18,7 @@
  • - - - + {% include icon-github.svg %} {{ site.github_username }} @@ -32,10 +30,7 @@
  • {{ site.twitter_username }} diff --git a/lib/site_template/_includes/icon-github.svg b/lib/site_template/_includes/icon-github.svg new file mode 100644 index 00000000..1ae1eb60 --- /dev/null +++ b/lib/site_template/_includes/icon-github.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/site_template/_includes/icon-twitter.svg b/lib/site_template/_includes/icon-twitter.svg new file mode 100644 index 00000000..871707da --- /dev/null +++ b/lib/site_template/_includes/icon-twitter.svg @@ -0,0 +1,4 @@ + + + From 5d92a90bded649f69457f1e589717f861583e49c Mon Sep 17 00:00:00 2001 From: BigBlueHat Date: Tue, 20 Oct 2015 08:52:20 -0400 Subject: [PATCH 130/810] Make HTML includes for GitHub & Twitter icons Made one for each to avoid over paramaterizing the includes. Also allows for various icon formats. --- lib/site_template/_includes/footer.html | 16 ++-------------- lib/site_template/_includes/icon-github.html | 7 +++++++ lib/site_template/_includes/icon-twitter.html | 7 +++++++ 3 files changed, 16 insertions(+), 14 deletions(-) create mode 100644 lib/site_template/_includes/icon-github.html create mode 100644 lib/site_template/_includes/icon-twitter.html diff --git a/lib/site_template/_includes/footer.html b/lib/site_template/_includes/footer.html index 9fbc29e3..72239f1c 100644 --- a/lib/site_template/_includes/footer.html +++ b/lib/site_template/_includes/footer.html @@ -16,25 +16,13 @@ diff --git a/lib/site_template/_includes/icon-github.html b/lib/site_template/_includes/icon-github.html new file mode 100644 index 00000000..604b6d31 --- /dev/null +++ b/lib/site_template/_includes/icon-github.html @@ -0,0 +1,7 @@ + + + {% include icon-github.svg %} + + + {{ include.username }} + diff --git a/lib/site_template/_includes/icon-twitter.html b/lib/site_template/_includes/icon-twitter.html new file mode 100644 index 00000000..25c242ec --- /dev/null +++ b/lib/site_template/_includes/icon-twitter.html @@ -0,0 +1,7 @@ + + + + {{ include.username }} + From 2cde74c44bf286adfd102ffb33c32970ab5ecddd Mon Sep 17 00:00:00 2001 From: BigBlueHat Date: Tue, 20 Oct 2015 08:56:36 -0400 Subject: [PATCH 131/810] Use GitHub icon inline in about.md Had to remove whitespace from icon includes because Markdown... --- lib/site_template/_includes/icon-github.html | 8 +------- lib/site_template/_includes/icon-github.svg | 4 +--- lib/site_template/about.md | 8 ++++++-- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/lib/site_template/_includes/icon-github.html b/lib/site_template/_includes/icon-github.html index 604b6d31..e501a16b 100644 --- a/lib/site_template/_includes/icon-github.html +++ b/lib/site_template/_includes/icon-github.html @@ -1,7 +1 @@ - - - {% include icon-github.svg %} - - - {{ include.username }} - +{% include icon-github.svg %}{{ include.username }} diff --git a/lib/site_template/_includes/icon-github.svg b/lib/site_template/_includes/icon-github.svg index 1ae1eb60..4422c4f5 100644 --- a/lib/site_template/_includes/icon-github.svg +++ b/lib/site_template/_includes/icon-github.svg @@ -1,3 +1 @@ - - - + diff --git a/lib/site_template/about.md b/lib/site_template/about.md index 3ed64bb6..d0e6de5e 100644 --- a/lib/site_template/about.md +++ b/lib/site_template/about.md @@ -6,6 +6,10 @@ 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](http://jekyllrb.com/) -You can find the source code for the Jekyll new theme at: [github.com/jglovier/jekyll-new](https://github.com/jglovier/jekyll-new) +You can find the source code for the Jekyll new theme at: +{% include icon-github.html username="jglovier" %} / +[jekyll-new](https://github.com/jglovier/jekyll-new) -You can find the source code for Jekyll at [github.com/jekyll/jekyll](https://github.com/jekyll/jekyll) +You can find the source code for Jekyll at +{% include icon-github.html username="jekyll" %} / +[jekyll](https://github.com/jekyll/jekyll) From d8f38eef0e4e84cca1fe86f432f1e9085fce46a8 Mon Sep 17 00:00:00 2001 From: BigBlueHat Date: Tue, 20 Oct 2015 09:03:27 -0400 Subject: [PATCH 132/810] Made icon-twitter.html inline-able --- lib/site_template/_includes/icon-twitter.html | 8 +------- lib/site_template/_includes/icon-twitter.svg | 5 +---- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/lib/site_template/_includes/icon-twitter.html b/lib/site_template/_includes/icon-twitter.html index 25c242ec..e623dbd6 100644 --- a/lib/site_template/_includes/icon-twitter.html +++ b/lib/site_template/_includes/icon-twitter.html @@ -1,7 +1 @@ - - - - {{ include.username }} - +{{ include.username }} diff --git a/lib/site_template/_includes/icon-twitter.svg b/lib/site_template/_includes/icon-twitter.svg index 871707da..dcf660e7 100644 --- a/lib/site_template/_includes/icon-twitter.svg +++ b/lib/site_template/_includes/icon-twitter.svg @@ -1,4 +1 @@ - - - + From 915f8d3eb64d8b70c25db042d77beea7f38888ba Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 21 Oct 2015 11:22:54 -0700 Subject: [PATCH 133/810] Update history to reflect merge of #4049 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e66fe324..bc90016d 100644 --- a/History.markdown +++ b/History.markdown @@ -91,6 +91,7 @@ * 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) ### Bug Fixes From c84627b2e1e459cafe6da52b6a0b4cf4a330f740 Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Thu, 22 Oct 2015 00:30:14 -0700 Subject: [PATCH 134/810] Change default font weight to 400 to fix bold/strong text issues --- lib/site_template/_sass/_layout.scss | 1 + lib/site_template/css/main.scss | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/site_template/_sass/_layout.scss b/lib/site_template/_sass/_layout.scss index b09c82fe..9cbfddef 100644 --- a/lib/site_template/_sass/_layout.scss +++ b/lib/site_template/_sass/_layout.scss @@ -12,6 +12,7 @@ .site-title { font-size: 26px; + font-weight: 300; line-height: 56px; letter-spacing: -1px; margin-bottom: 0; diff --git a/lib/site_template/css/main.scss b/lib/site_template/css/main.scss index ba29244a..f2e566e2 100644 --- a/lib/site_template/css/main.scss +++ b/lib/site_template/css/main.scss @@ -8,7 +8,7 @@ // Our variables $base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; $base-font-size: 16px; -$base-font-weight: 300; +$base-font-weight: 400; $small-font-size: $base-font-size * 0.875; $base-line-height: 1.5; From 7330b499f1faeef29dbf2063f77013fa71c8df2a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 22 Oct 2015 11:22:38 -0700 Subject: [PATCH 135/810] Update history to reflect merge of #4050 [ci skip] --- History.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index bc90016d..e2fc23f2 100644 --- a/History.markdown +++ b/History.markdown @@ -138,9 +138,10 @@ * 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 >. + * 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) ### Development Fixes From 58365ae8983d92838418bcf7c42aa1d871c5fac8 Mon Sep 17 00:00:00 2001 From: Tunghsiao Liu Date: Sun, 25 Oct 2015 19:40:40 +0800 Subject: [PATCH 136/810] Add missing highlighting CSS class for Rouge --- lib/site_template/_sass/_syntax-highlighting.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/site_template/_sass/_syntax-highlighting.scss b/lib/site_template/_sass/_syntax-highlighting.scss index e36627da..35a4ac80 100644 --- a/lib/site_template/_sass/_syntax-highlighting.scss +++ b/lib/site_template/_sass/_syntax-highlighting.scss @@ -1,7 +1,8 @@ /** * Syntax highlighting styles */ -.highlight { +.highlight, +.highlighter-rouge { background: #fff; @extend %vertical-rhythm; From 2f5303dd67b4bff3a9ddbbb8c0c078d152bf3fb0 Mon Sep 17 00:00:00 2001 From: Tunghsiao Liu Date: Mon, 26 Oct 2015 15:17:04 +0800 Subject: [PATCH 137/810] Apply rouge highlighter background to child node --- lib/site_template/_sass/_syntax-highlighting.scss | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/site_template/_sass/_syntax-highlighting.scss b/lib/site_template/_sass/_syntax-highlighting.scss index 35a4ac80..8fac5977 100644 --- a/lib/site_template/_sass/_syntax-highlighting.scss +++ b/lib/site_template/_sass/_syntax-highlighting.scss @@ -1,11 +1,14 @@ /** * Syntax highlighting styles */ -.highlight, -.highlighter-rouge { +.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 From b89f943bf22bd7f36c8378791ca543e16a59f442 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 18 Oct 2015 15:53:09 -0700 Subject: [PATCH 138/810] collections: posts as collection --- features/hooks.feature | 41 +- lib/jekyll.rb | 4 +- lib/jekyll/collection.rb | 13 +- lib/jekyll/configuration.rb | 39 +- lib/jekyll/convertible.rb | 23 +- lib/jekyll/document.rb | 173 ++++- lib/jekyll/draft.rb | 40 -- lib/jekyll/excerpt.rb | 78 ++- lib/jekyll/hooks.rb | 16 +- lib/jekyll/page.rb | 2 +- lib/jekyll/post.rb | 334 ---------- lib/jekyll/publisher.rb | 4 +- lib/jekyll/reader.rb | 8 +- lib/jekyll/readers/collection_reader.rb | 6 +- lib/jekyll/readers/draft_reader.rb | 37 -- lib/jekyll/readers/post_reader.rb | 45 +- lib/jekyll/regenerator.rb | 6 +- lib/jekyll/related_posts.rb | 2 +- lib/jekyll/renderer.rb | 14 +- lib/jekyll/site.rb | 21 +- lib/jekyll/tags/post_url.rb | 8 +- lib/jekyll/utils.rb | 19 +- site/_docs/plugins.md | 39 +- test/helper.rb | 29 +- test/test_collections.rb | 5 +- test/test_configuration.rb | 22 +- test/test_document.rb | 54 +- test/test_draft.rb | 55 -- test/test_excerpt.rb | 46 +- test/test_front_matter_defaults.rb | 6 +- test/test_new_command.rb | 9 +- test/test_post.rb | 815 ------------------------ test/test_related_posts.rb | 6 +- test/test_site.rb | 12 +- test/test_tags.rb | 22 +- 35 files changed, 496 insertions(+), 1557 deletions(-) delete mode 100644 lib/jekyll/draft.rb delete mode 100644 lib/jekyll/post.rb delete mode 100644 lib/jekyll/readers/draft_reader.rb delete mode 100644 test/test_draft.rb delete mode 100644 test/test_post.rb diff --git a/features/hooks.feature b/features/hooks.feature index b0846bab..489f256b 100644 --- a/features/hooks.feature +++ b/features/hooks.feature @@ -74,7 +74,7 @@ Feature: Hooks Given I have a _plugins directory And I have a "_plugins/ext.rb" file with content: """ - Jekyll::Hooks.register :page, :post_init do |page| + Jekyll::Hooks.register :pages, :post_init do |page| page.name = 'renamed.html' page.process(page.name) end @@ -88,7 +88,7 @@ Feature: Hooks Given I have a _plugins directory And I have a "_plugins/ext.rb" file with content: """ - Jekyll::Hooks.register :page, :pre_render do |page, payload| + Jekyll::Hooks.register :pages, :pre_render do |page, payload| payload['myparam'] = 'special' if page.name == 'page1.html' end """ @@ -103,7 +103,7 @@ Feature: Hooks And I have a "index.html" page that contains "WRAP ME" And I have a "_plugins/ext.rb" file with content: """ - Jekyll::Hooks.register :page, :post_render do |page| + Jekyll::Hooks.register :pages, :post_render do |page| page.output = "{{{{{ #{page.output.chomp} }}}}}" end """ @@ -115,7 +115,7 @@ Feature: Hooks And I have a "index.html" page that contains "HELLO FROM A PAGE" And I have a "_plugins/ext.rb" file with content: """ - Jekyll::Hooks.register :page, :post_write do |page| + Jekyll::Hooks.register :pages, :post_write do |page| require 'fileutils' filename = page.destination(page.site.dest) FileUtils.mv(filename, "#{filename}.moved") @@ -128,16 +128,15 @@ Feature: Hooks Given I have a _plugins directory And I have a "_plugins/ext.rb" file with content: """ - # rot13 translate - Jekyll::Hooks.register :post, :post_init do |post| - post.content.tr!('abcdefghijklmnopqrstuvwxyz', - 'nopqrstuvwxyzabcdefghijklm') + Jekyll::Hooks.register :posts, :post_init do |post| + post.data['harold'] = "content for entry1.".tr!('abcdefghijklmnopqrstuvwxyz', + 'nopqrstuvwxyzabcdefghijklm') end """ And I have a _posts directory And I have the following posts: - | title | date | layout | content | - | entry1 | 2015-03-14 | nil | content for entry1. | + | title | date | layout | content | + | entry1 | 2015-03-14 | nil | {{ page.harold }} | When I run jekyll build Then the _site directory should exist And I should see "pbagrag sbe ragel1." in "_site/2015/03/14/entry1.html" @@ -148,7 +147,7 @@ Feature: Hooks """ # Add myvar = 'old' to posts before 2015-03-15, and myvar = 'new' for # others - Jekyll::Hooks.register :post, :pre_render do |post, payload| + Jekyll::Hooks.register :posts, :pre_render do |post, payload| if post.date < Time.new(2015, 3, 15) payload['myvar'] = 'old' else @@ -170,7 +169,7 @@ Feature: Hooks And I have a "_plugins/ext.rb" file with content: """ # Replace content after rendering - Jekyll::Hooks.register :post, :post_render do |post| + Jekyll::Hooks.register :posts, :post_render do |post| post.output.gsub! /42/, 'the answer to life, the universe and everything' end """ @@ -188,7 +187,7 @@ Feature: Hooks And I have a "_plugins/ext.rb" file with content: """ # Log all post filesystem writes - Jekyll::Hooks.register :post, :post_write do |post| + Jekyll::Hooks.register :posts, :post_write do |post| filename = post.destination(post.site.dest) open('_site/post-build.log', 'a') do |f| f.puts "Wrote #{filename} at #{Time.now}" @@ -208,7 +207,7 @@ Feature: Hooks Given I have a _plugins directory And I have a "_plugins/ext.rb" file with content: """ - Jekyll::Hooks.register [:page, :post], :post_render do |owner| + Jekyll::Hooks.register [:pages, :posts], :post_render do |owner| owner.output = "{{{{{ #{owner.output.chomp} }}}}}" end """ @@ -225,19 +224,19 @@ Feature: Hooks Given I have a _plugins directory And I have a "_plugins/ext.rb" file with content: """ - Jekyll::Hooks.register :page, :post_render, priority: :normal do |owner| + Jekyll::Hooks.register :pages, :post_render, priority: :normal do |owner| # first normal runs second owner.output = "1 #{owner.output.chomp}" end - Jekyll::Hooks.register :page, :post_render, priority: :high do |owner| + Jekyll::Hooks.register :pages, :post_render, priority: :high do |owner| # high runs last owner.output = "2 #{owner.output.chomp}" end - Jekyll::Hooks.register :page, :post_render do |owner| + Jekyll::Hooks.register :pages, :post_render do |owner| # second normal runs third (normal is default) owner.output = "3 #{owner.output.chomp}" end - Jekyll::Hooks.register :page, :post_render, priority: :low do |owner| + Jekyll::Hooks.register :pages, :post_render, priority: :low do |owner| # low runs first owner.output = "4 #{owner.output.chomp}" end @@ -250,7 +249,7 @@ Feature: Hooks Given I have a _plugins directory And I have a "_plugins/ext.rb" file with content: """ - Jekyll::Hooks.register :document, :pre_render do |doc, payload| + Jekyll::Hooks.register :documents, :pre_render do |doc, payload| doc.data['text'] = doc.data['text'] << ' are belong to us' end """ @@ -276,7 +275,7 @@ Feature: Hooks Given I have a _plugins directory And I have a "_plugins/ext.rb" file with content: """ - Jekyll::Hooks.register :document, :post_render do |doc| + Jekyll::Hooks.register :documents, :post_render do |doc| doc.output.gsub! /

    /, '

    ' end """ @@ -302,7 +301,7 @@ Feature: Hooks Given I have a _plugins directory And I have a "_plugins/ext.rb" file with content: """ - Jekyll::Hooks.register :document, :post_write do |doc| + Jekyll::Hooks.register :documents, :post_write do |doc| open('_site/document-build.log', 'a') do |f| f.puts "Wrote document #{doc.collection.docs.index doc} at #{Time.now}" end diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 9d6b5b63..2ac3b3fa 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -30,7 +30,6 @@ require 'kramdown' require 'colorator' SafeYAML::OPTIONS[:suppress_warnings] = true -Liquid::Template.error_mode = :strict module Jekyll @@ -53,7 +52,6 @@ module Jekyll autoload :CollectionReader, 'jekyll/readers/collection_reader' autoload :DataReader, 'jekyll/readers/data_reader' autoload :LayoutReader, 'jekyll/readers/layout_reader' - autoload :DraftReader, 'jekyll/readers/draft_reader' autoload :PostReader, 'jekyll/readers/post_reader' autoload :PageReader, 'jekyll/readers/page_reader' autoload :StaticFileReader, 'jekyll/readers/static_file_reader' @@ -136,7 +134,7 @@ module Jekyll # # Returns the new logger. def logger=(writer) - @logger = LogAdapter.new(writer) + @logger = LogAdapter.new(writer, (ENV["JEKYLL_LOG_LEVEL"] || :info).to_sym) end # Public: An array of sites diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index e8740cf6..9faffaab 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -1,6 +1,7 @@ module Jekyll class Collection attr_reader :site, :label, :metadata + attr_writer :docs # Create a new Collection. # @@ -22,6 +23,14 @@ module Jekyll @docs ||= [] end + [:sort, :sort!, :each, :[], :reject, :first, :last, :size, :length].each do |method| + class_eval %Q" + def #{method}(*args, &blk) + docs.#{method}(*args, &blk) + end + " + end + # Fetch the static files in this collection. # Defaults to an empty array if no static files have been read in. # @@ -40,7 +49,7 @@ module Jekyll 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) + docs << doc if site.publisher.publish?(doc) || !write? 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) @@ -163,7 +172,7 @@ module Jekyll # # Returns true if the 'write' metadata is true, false otherwise. def write? - !!metadata['output'] + !!metadata.fetch('output', false) end # The URL template to render collection's documents at. diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index b7562d30..ee05e8bc 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -5,7 +5,7 @@ module Jekyll # Default options. Overridden by values in _config.yml. # Strings rather than symbols are used for compatibility with YAML. - DEFAULTS = { + DEFAULTS = Configuration[{ # Where things are 'source' => Dir.pwd, 'destination' => File.join(Dir.pwd, '_site'), @@ -13,7 +13,7 @@ module Jekyll 'layouts_dir' => '_layouts', 'data_dir' => '_data', 'includes_dir' => '_includes', - 'collections' => nil, + 'collections' => {}, # Handling Reading 'safe' => false, @@ -80,7 +80,7 @@ module Jekyll 'coderay_css' => 'style' } } - } + }] # Public: Turn all keys into string # @@ -186,7 +186,7 @@ module Jekyll $stderr.puts "#{err}" end - configuration.fix_common_issues.backwards_compatibilize + configuration.fix_common_issues.backwards_compatibilize.add_default_collections end # Public: Split a CSV string into an array containing its values @@ -275,6 +275,21 @@ module Jekyll config end + def add_default_collections + config = clone + + return config if config['collections'].nil? + + if config['collections'].is_a?(Array) + config['collections'] = Hash[config['collections'].map{|c| [c, {}]}] + end + config['collections']['posts'] ||= {} + config['collections']['posts']['output'] = true + config['collections']['posts']['permalink'] = style_to_permalink(config['permalink']) + + config + end + def renamed_key(old, new, config, allowed_values = nil) if config.key?(old) Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" + @@ -283,5 +298,21 @@ module Jekyll config[new] = config.delete(old) end end + + private + def style_to_permalink(permalink_style) + case permalink_style.to_sym + when :pretty + "/:categories/:year/:month/:day/:title/" + when :none + "/:categories/:title.html" + when :date + "/:categories/:year/:month/:day/:title.html" + when :ordinal + "/:categories/:year/:y_day/:title.html" + else + permalink_style.to_s + end + end end end diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index d91a31e8..57abb7d1 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -135,21 +135,15 @@ module Jekyll # # Returns the type of self. def type - if is_a?(Draft) - :drafts - elsif is_a?(Post) - :posts - elsif is_a?(Page) + if is_a?(Page) :pages end end # returns the owner symbol for hook triggering def hook_owner - if is_a?(Post) - :post - elsif is_a?(Page) - :page + if is_a?(Page) + :pages end end @@ -215,6 +209,7 @@ module Jekyll used = Set.new([layout]) while layout + Jekyll.logger.debug "Rendering Layout:", path payload = Utils.deep_merge_hashes(payload, {"content" => output, "page" => layout.data}) self.output = render_liquid(layout.content, @@ -245,6 +240,9 @@ module Jekyll # # Returns nothing. def do_layout(payload, layouts) + Jekyll.logger.debug "Rendering:", self.relative_path + + 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'] } } @@ -252,13 +250,18 @@ module Jekyll payload["highlighter_prefix"] = converters.first.highlighter_prefix payload["highlighter_suffix"] = converters.first.highlighter_suffix - self.content = render_liquid(content, payload, info, path) if render_with_liquid? + 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 diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index da07a995..9dbc4cee 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -7,6 +7,8 @@ module Jekyll attr_reader :path, :site, :extname, :output_ext, :content, :output, :collection YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m + DATELESS_FILENAME_MATCHER = /^(.*)(\.[^.]+)$/ + DATE_FILENAME_MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ # Create a new Document. # @@ -21,6 +23,17 @@ module Jekyll @output_ext = Jekyll::Renderer.new(site, self).output_ext @collection = relations[:collection] @has_yaml_header = nil + + subdirs = relative_path.split(File::SEPARATOR).reject do |c| + c.empty? || c.eql?(collection.relative_directory) || c.eql?("_drafts") || c.eql?(basename) + end + merge_data!({'categories' => subdirs }) + + data.default_proc = proc do |hash, key| + site.frontmatter_defaults.find(relative_path, collection.label, key) + end + + trigger_hooks(:post_init) end def output=(output) @@ -41,6 +54,27 @@ module Jekyll @data ||= Hash.new end + # Merge some data in with this document's data. + # + # Returns the merged data. + def merge_data!(other) + 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 + 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.") + end + data + end + + def date + data['date'] ||= site.time + end + # The path to the document, relative to the site source. # # Returns a String path which represents the relative path @@ -138,11 +172,23 @@ module Jekyll # 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']) || Utils.slugify(basename_without_ext) + collection: collection.label, + path: cleaned_relative_path, + output_ext: output_ext, + name: Utils.slugify(basename_without_ext), + title: 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"), } end @@ -165,6 +211,10 @@ module Jekyll }).to_s end + def [](key) + data[key] + end + # The full path to the output file. # # base_directory - the base path of the output directory @@ -190,7 +240,7 @@ module Jekyll f.write(output) end - Jekyll::Hooks.trigger :document, :post_write, self + trigger_hooks(:post_write) end # Returns merged option hash for File.read of self.site (if exists) @@ -218,22 +268,23 @@ module Jekyll def read(opts = {}) @to_liquid = nil + Jekyll.logger.debug "Reading:", relative_path + if yaml_file? @data = SafeYAML.load_file(path) else begin defaults = @site.frontmatter_defaults.all(url, collection.label.to_sym) - unless defaults.empty? - @data = defaults - end + merge_data!(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($1) - unless data_file.nil? - @data = Utils.deep_merge_hashes(defaults, data_file) - end + merge_data!(data_file) if data_file end + + post_read rescue SyntaxError => e puts "YAML Exception reading #{path}: #{e.message}" rescue Exception => e @@ -242,19 +293,54 @@ module Jekyll end end + def post_read + if DATE_FILENAME_MATCHER =~ relative_path + m, cats, 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 {|w| w.capitalize! || w }.join(' ') + end + populate_categories + populate_tags + + if generate_excerpt? + data['excerpt'] = Jekyll::Excerpt.new(self) + end + end + + def populate_categories + merge_data!({ + "categories" => ( + Array(data['categories']) + Utils.pluralized_array_from_hash(data, 'category', 'categories') + ).map { |c| c.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. def to_liquid @to_liquid ||= if data.is_a?(Hash) - Utils.deep_merge_hashes data, { + Utils.deep_merge_hashes Utils.deep_merge_hashes({ "output" => output, "content" => content, "relative_path" => relative_path, "path" => relative_path, "url" => url, - "collection" => collection.label - } + "collection" => collection.label, + "next" => next_doc, + "previous" => previous_doc, + "id" => id, + }, data), { 'excerpt' => data['excerpt'].to_s } else data end @@ -272,7 +358,7 @@ module Jekyll # # Returns the content of the document def to_s - content || '' + output || content || 'NO CONTENT' end # Compare this document against another document. @@ -281,7 +367,11 @@ module Jekyll # 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 <=>(anotherDocument) - path <=> anotherDocument.path + cmp = data['date'] <=> anotherDocument.data['date'] + if 0 == cmp + cmp = path <=> anotherDocument.path + end + cmp end # Determine whether this document should be written. @@ -292,5 +382,54 @@ module Jekyll def write? collection && collection.write? end + + # The Document excerpt_separator, from the YAML Front-Matter or site + # default excerpt_separator value + # + # Returns the document excerpt_separator + def excerpt_separator + (data['excerpt_separator'] || site.config['excerpt_separator']).to_s + end + + # Whether to generate an excerpt + # + # Returns true if the excerpt separator is configured. + def generate_excerpt? + !excerpt_separator.empty? + end + + 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 + + def previous_doc + pos = collection.docs.index {|post| post.equal?(self) } + if pos && pos > 0 + collection.docs[pos - 1] + else + nil + end + end + + def trigger_hooks(hook_name, *args) + Jekyll::Hooks.trigger collection.label.to_sym, hook_name, self, *args if collection + Jekyll::Hooks.trigger :documents, hook_name, self, *args + end + + def id + @id ||= File.join(File.dirname(url), (data['slug'] || basename_without_ext).to_s) + end + + # Calculate related posts. + # + # Returns an Array of related Posts. + def related_posts + Jekyll::RelatedPosts.new(self).build + end end end diff --git a/lib/jekyll/draft.rb b/lib/jekyll/draft.rb deleted file mode 100644 index 16daefdf..00000000 --- a/lib/jekyll/draft.rb +++ /dev/null @@ -1,40 +0,0 @@ -module Jekyll - - class Draft < Post - - # Valid post name regex (no date) - MATCHER = /^(.*)(\.[^.]+)$/ - - # Draft name validator. Draft filenames must be like: - # my-awesome-post.textile - # - # Returns true if valid, false if not. - def self.valid?(name) - name =~ MATCHER - end - - # Get the full path to the directory containing the draft files - def containing_dir(dir) - site.in_source_dir(dir, '_drafts') - end - - # The path to the draft source file, relative to the site source - def relative_path - File.join(@dir, '_drafts', @name) - end - - # Extract information from the post filename. - # - # name - The String filename of the post file. - # - # Returns nothing. - def process(name) - m, slug, ext = *name.match(MATCHER) - self.date = File.mtime(File.join(@base, name)) - self.slug = slug - self.ext = ext - end - - end - -end diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index 3d463944..36fcd11b 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -2,46 +2,43 @@ require 'forwardable' module Jekyll class Excerpt - include Convertible extend Forwardable - attr_accessor :post - attr_accessor :content, :output, :ext + attr_accessor :doc + attr_accessor :content, :ext + attr_writer :output - def_delegator :@post, :site, :site - def_delegator :@post, :name, :name - def_delegator :@post, :ext, :ext + def_delegators :@doc, :site, :name, :ext, :relative_path, :extname, + :render_with_liquid?, :collection, :related_posts - # Initialize this Post instance. + # Initialize this Excerpt instance. # - # site - The Site. - # base - The String path to the dir containing the post file. - # name - The String filename of the post file. + # doc - The Document. # - # Returns the new Post. - def initialize(post) - self.post = post - self.content = extract_excerpt(post.content) + # Returns the new Excerpt. + def initialize(doc) + self.doc = doc + self.content = extract_excerpt(doc.content) end - def to_liquid - post.to_liquid(post.class::EXCERPT_ATTRIBUTES_FOR_LIQUID) - end - - # Fetch YAML front-matter data from related post, without layout key + # Fetch YAML front-matter data from related doc, without layout key # - # Returns Hash of post data + # Returns Hash of doc data def data - @data ||= post.data.dup + @data ||= doc.data.dup @data.delete("layout") + @data.delete("excerpt") @data end + def trigger_hooks(*) + end + # 'Path' of the excerpt. # - # Returns the path for the post this excerpt belongs to with #excerpt appended + # Returns the path for the doc this excerpt belongs to with #excerpt appended def path - File.join(post.path, "#excerpt") + File.join(doc.path, "#excerpt") end # Check if excerpt includes a string @@ -51,28 +48,43 @@ module Jekyll (output && output.include?(something)) || content.include?(something) end - # The UID for this post (useful in feeds). - # e.g. /2008/11/05/my-awesome-post + # The UID for this doc (useful in feeds). + # e.g. /2008/11/05/my-awesome-doc # # Returns the String UID. def id - File.join(post.dir, post.slug, "#excerpt") + "#{doc.id}#excerpt" end def to_s output || content end - # Returns the shorthand String identifier of this Post. + def to_liquid + doc.data['excerpt'] = nil + @to_liquid ||= doc.to_liquid + doc.data['excerpt'] = self + @to_liquid + end + + # Returns the shorthand String identifier of this doc. def inspect "" end + def output + @output ||= Renderer.new(doc.site, self, site.site_payload).run + end + + def place_in_layout? + false + end + protected # Internal: Extract excerpt from the content # - # By default excerpt is your first paragraph of a post: everything before + # By default excerpt is your first paragraph of a doc: everything before # the first two new lines: # # --- @@ -86,16 +98,16 @@ module Jekyll # [1]: http://example.com/ # # This is fairly good option for Markdown and Textile files. But might cause - # problems for HTML posts (which is quite unusual for Jekyll). If default + # problems for HTML docs (which is quite unusual for Jekyll). If default # excerpt delimiter is not good for you, you might want to set your own via # configuration option `excerpt_separator`. For example, following is a good - # alternative for HTML posts: + # alternative for HTML docs: # # # file: _config.yml # excerpt_separator: "" # # Notice that all markdown-style link references will be appended to the - # excerpt. So the example post above will have this excerpt source: + # excerpt. So the example doc above will have this excerpt source: # # First paragraph with [link][1]. # @@ -104,8 +116,8 @@ module Jekyll # Excerpts are rendered same time as content is rendered. # # Returns excerpt String - def extract_excerpt(post_content) - head, _, tail = post_content.to_s.partition(post.excerpt_separator) + def extract_excerpt(doc_content) + head, _, tail = doc_content.to_s.partition(doc.excerpt_separator) if tail.empty? head diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index 98ea263f..9933337f 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -17,19 +17,19 @@ module Jekyll pre_render: [], post_write: [], }, - :page => { + :pages => { post_init: [], pre_render: [], post_render: [], post_write: [], }, - :post => { + :posts => { post_init: [], pre_render: [], post_render: [], post_write: [], }, - :document => { + :documents => { pre_render: [], post_render: [], post_write: [], @@ -57,10 +57,12 @@ module Jekyll # register a single hook to be called later, internal API def self.register_one(owner, event, priority, &block) - unless @registry[owner] - raise NotAvailable, "Hooks are only available for the following " << - "classes: #{@registry.keys.inspect}" - end + @registry[owner] ||={ + post_init: [], + pre_render: [], + post_render: [], + post_write: [], + } unless @registry[owner][event] raise NotAvailable, "Invalid hook. #{owner} supports only the " << diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 431878b2..ca5bb268 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -36,7 +36,7 @@ module Jekyll site.frontmatter_defaults.find(File.join(dir, name), type, key) end - Jekyll::Hooks.trigger :page, :post_init, self + Jekyll::Hooks.trigger :pages, :post_init, self end # The generated directory into which the page will be placed diff --git a/lib/jekyll/post.rb b/lib/jekyll/post.rb deleted file mode 100644 index 85d168d9..00000000 --- a/lib/jekyll/post.rb +++ /dev/null @@ -1,334 +0,0 @@ -module Jekyll - class Post - include Comparable - include Convertible - - # Valid post name regex. - MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ - - EXCERPT_ATTRIBUTES_FOR_LIQUID = %w[ - title - url - dir - date - id - categories - next - previous - tags - path - ] - - # Attributes for Liquid templates - ATTRIBUTES_FOR_LIQUID = EXCERPT_ATTRIBUTES_FOR_LIQUID + %w[ - content - excerpt - excerpt_separator - draft? - ] - - # Post name validator. Post filenames must be like: - # 2008-11-05-my-awesome-post.textile - # - # Returns true if valid, false if not. - def self.valid?(name) - name =~ MATCHER - end - - attr_accessor :site - attr_accessor :data, :extracted_excerpt, :content, :output, :ext - attr_accessor :date, :slug, :tags, :categories - - attr_reader :name - - # Initialize this Post instance. - # - # site - The Site. - # base - The String path to the dir containing the post file. - # name - The String filename of the post file. - # - # Returns the new Post. - def initialize(site, source, dir, name) - @site = site - @dir = dir - @base = containing_dir(dir) - @name = name - - self.categories = dir.split('/').reject { |x| x.empty? } - process(name) - read_yaml(@base, name) - - data.default_proc = proc do |hash, key| - site.frontmatter_defaults.find(relative_path, type, key) - end - - if data.key?('date') - self.date = Utils.parse_date(data["date"].to_s, "Post '#{relative_path}' does not have a valid date in the YAML front matter.") - end - - populate_categories - populate_tags - - Jekyll::Hooks.trigger :post, :post_init, self - end - - def published? - if data.key?('published') && data['published'] == false - false - else - true - end - end - - def populate_categories - categories_from_data = Utils.pluralized_array_from_hash(data, 'category', 'categories') - self.categories = ( - Array(categories) + categories_from_data - ).map { |c| c.to_s }.flatten.uniq - end - - def populate_tags - self.tags = Utils.pluralized_array_from_hash(data, "tag", "tags").flatten - end - - # Get the full path to the directory containing the post files - def containing_dir(dir) - site.in_source_dir(dir, '_posts') - end - - # Read the YAML frontmatter. - # - # base - The String path to the dir containing the file. - # name - The String filename of the file. - # - # Returns nothing. - def read_yaml(base, name) - super(base, name) - self.extracted_excerpt = extract_excerpt - end - - # The post excerpt. This is either a custom excerpt - # set in YAML front matter or the result of extract_excerpt. - # - # Returns excerpt string. - def excerpt - data.fetch('excerpt') { extracted_excerpt.to_s } - end - - # Public: the Post title, from the YAML Front-Matter or from the slug - # - # Returns the post title - def title - data.fetch('title') { titleized_slug } - end - - # Public: the Post excerpt_separator, from the YAML Front-Matter or site default - # excerpt_separator value - # - # Returns the post excerpt_separator - def excerpt_separator - (data['excerpt_separator'] || site.config['excerpt_separator']).to_s - end - - # Turns the post slug into a suitable title - def titleized_slug - slug.split('-').select {|w| w.capitalize! || w }.join(' ') - end - - # Public: the path to the post relative to the site source, - # from the YAML Front-Matter or from a combination of - # the directory it's in, "_posts", and the name of the - # post file - # - # Returns the path to the file relative to the site source - def path - data.fetch('path') { relative_path.sub(/\A\//, '') } - end - - # The path to the post source file, relative to the site source - def relative_path - File.join(*[@dir, "_posts", @name].map(&:to_s).reject(&:empty?)) - end - - # Compares Post objects. First compares the Post date. If the dates are - # equal, it compares the Post slugs. - # - # other - The other Post we are comparing to. - # - # Returns -1, 0, 1 - def <=>(other) - cmp = self.date <=> other.date - if 0 == cmp - cmp = self.slug <=> other.slug - end - return cmp - end - - # Extract information from the post filename. - # - # name - The String filename of the post file. - # - # Returns nothing. - def process(name) - m, cats, date, slug, ext = *name.match(MATCHER) - self.date = Utils.parse_date(date, "Post '#{relative_path}' does not have a valid date in the filename.") - self.slug = slug - self.ext = ext - end - - # The generated directory into which the post will be placed - # upon generation. This is derived from the permalink or, if - # permalink is absent, set to the default date - # e.g. "/2008/11/05/" if the permalink style is :date, otherwise nothing. - # - # Returns the String directory. - def dir - File.dirname(url) - end - - # The full path and filename of the post. Defined in the YAML of the post - # body (optional). - # - # Returns the String permalink. - def permalink - data && data['permalink'] - end - - def template - case site.permalink_style - when :pretty - "/:categories/:year/:month/:day/:title/" - when :none - "/:categories/:title.html" - when :date - "/:categories/:year/:month/:day/:title.html" - when :ordinal - "/:categories/:year/:y_day/:title.html" - else - site.permalink_style.to_s - end - end - - # The generated relative url of this post. - # - # Returns the String url. - def url - @url ||= URL.new({ - :template => template, - :placeholders => url_placeholders, - :permalink => permalink - }).to_s - end - - # Returns a hash of URL placeholder names (as symbols) mapping to the - # desired placeholder replacements. For details see "url.rb" - def url_placeholders - { - :year => date.strftime("%Y"), - :month => date.strftime("%m"), - :day => date.strftime("%d"), - :hour => date.strftime("%H"), - :minute => date.strftime("%M"), - :second => date.strftime("%S"), - :title => slug, - :i_day => date.strftime("%-d"), - :i_month => date.strftime("%-m"), - :categories => (categories || []).map { |c| c.to_s.downcase }.uniq.join('/'), - :short_month => date.strftime("%b"), - :short_year => date.strftime("%y"), - :y_day => date.strftime("%j"), - :output_ext => output_ext - } - end - - # The UID for this post (useful in feeds). - # e.g. /2008/11/05/my-awesome-post - # - # Returns the String UID. - def id - File.join(dir, slug) - end - - # Calculate related posts. - # - # Returns an Array of related Posts. - def related_posts(posts) - Jekyll::RelatedPosts.new(self).build - end - - # Add any necessary layouts to this post. - # - # layouts - A Hash of {"name" => "layout"}. - # site_payload - The site payload hash. - # - # Returns nothing. - def render(layouts, site_payload) - # construct payload - payload = Utils.deep_merge_hashes({ - "site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) }, - "page" => to_liquid(self.class::EXCERPT_ATTRIBUTES_FOR_LIQUID) - }, site_payload) - - if generate_excerpt? - extracted_excerpt.do_layout(payload, {}) - end - - do_layout(payload.merge({"page" => to_liquid}), layouts) - end - - # Obtain destination path. - # - # dest - The String path to the destination dir. - # - # Returns destination file path String. - def destination(dest) - # The url needs to be unescaped in order to preserve the correct filename - path = site.in_dest_dir(dest, URL.unescape_path(url)) - path = File.join(path, "index.html") if self.url.end_with?("/") - path << output_ext unless path.end_with?(output_ext) - path - end - - # Returns the shorthand String identifier of this Post. - def inspect - "" - end - - def next - pos = site.posts.index {|post| post.equal?(self) } - if pos && pos < site.posts.length - 1 - site.posts[pos + 1] - else - nil - end - end - - def previous - pos = site.posts.index {|post| post.equal?(self) } - if pos && pos > 0 - site.posts[pos - 1] - else - nil - end - end - - # Returns if this Post is a Draft - def draft? - is_a?(Jekyll::Draft) - end - - protected - - def extract_excerpt - if generate_excerpt? - Jekyll::Excerpt.new(self) - else - "" - end - end - - def generate_excerpt? - !excerpt_separator.empty? - end - end -end diff --git a/lib/jekyll/publisher.rb b/lib/jekyll/publisher.rb index e86e96b6..6bb8a882 100644 --- a/lib/jekyll/publisher.rb +++ b/lib/jekyll/publisher.rb @@ -15,7 +15,7 @@ module Jekyll end def hidden_in_the_future?(thing) - thing.is_a?(Post) && !@site.future && thing.date > @site.time + thing.respond_to?(:date) && !@site.future && thing.date.to_i > @site.time.to_i end end -end \ No newline at end of file +end diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index b8cdae18..149a7a7a 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -22,12 +22,12 @@ module Jekyll # Sorts posts, pages, and static files. def sort_files! - site.posts.sort! + site.collections.values.each(&:sort!) site.pages.sort_by!(&:name) site.static_files.sort_by!(&:relative_path) end - # Recursively traverse directories to find posts, pages and static files + # Recursively traverse directories to find pages and static files # that will become part of the site according to the rules in # filter_entries. # @@ -56,8 +56,8 @@ module Jekyll # # Returns nothing. def retrieve_posts(dir) - site.posts.concat(PostReader.new(site).read(dir)) - site.posts.concat(DraftReader.new(site).read(dir)) if site.show_drafts + site.posts.docs.concat(PostReader.new(site).read_posts(dir)) + site.posts.docs.concat(PostReader.new(site).read_drafts(dir)) if site.show_drafts end # Recursively traverse directories with the read_directories function. diff --git a/lib/jekyll/readers/collection_reader.rb b/lib/jekyll/readers/collection_reader.rb index 04324fa1..6a54321d 100644 --- a/lib/jekyll/readers/collection_reader.rb +++ b/lib/jekyll/readers/collection_reader.rb @@ -1,5 +1,7 @@ module Jekyll class CollectionReader + SPECIAL_COLLECTIONS = %w{posts data}.freeze + attr_reader :site, :content def initialize(site) @site = site @@ -11,9 +13,9 @@ module Jekyll # Returns nothing. def read site.collections.each do |_, collection| - collection.read unless collection.label.eql?('data') + collection.read unless SPECIAL_COLLECTIONS.include?(collection.label) end end end -end \ No newline at end of file +end diff --git a/lib/jekyll/readers/draft_reader.rb b/lib/jekyll/readers/draft_reader.rb deleted file mode 100644 index d62029b2..00000000 --- a/lib/jekyll/readers/draft_reader.rb +++ /dev/null @@ -1,37 +0,0 @@ -module Jekyll - class DraftReader - attr_reader :site, :unfiltered_content - def initialize(site) - @site = site - @unfiltered_content = Array.new - end - - # Read all the files in /

    /_drafts and create a new Draft - # object with each one. - # - # dir - The String relative path of the directory to read. - # - # Returns nothing. - def read(dir) - @unfiltered_content = read_content(dir, '_drafts') - @unfiltered_content.select{ |draft| site.publisher.publish?(draft) } - end - - # Read all the content files from //magic_dir - # and return them with the type klass. - # - # dir - The String relative path of the directory to read. - # magic_dir - The String relative directory to , - # looks for content here. - # klass - The return type of the content. - # - # Returns klass type of content files - def read_content(dir, magic_dir) - @site.reader.get_entries(dir, magic_dir).map do |entry| - Draft.new(site, site.source, dir, entry) if Draft.valid?(entry) - end.reject do |entry| - entry.nil? - end - end - end -end diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index 73bdd85d..c41ef10a 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -3,18 +3,40 @@ module Jekyll attr_reader :site, :unfiltered_content def initialize(site) @site = site - @unfiltered_content = Array.new end - # Read all the files in //_posts and create a new Post + # Read all the files in //_drafts and create a new + # Document object with each one. + # + # dir - The String relative path of the directory to read. + # + # Returns nothing. + def read_drafts(dir) + read_publishable(dir, '_drafts', Document::DATELESS_FILENAME_MATCHER) + end + + # Read all the files in //_posts and create a new Document # object with each one. # # dir - The String relative path of the directory to read. # # Returns nothing. - def read(dir) - @unfiltered_content = read_content(dir, '_posts') - @unfiltered_content.select{ |post| site.publisher.publish?(post) } + def read_posts(dir) + read_publishable(dir, '_posts', Document::DATE_FILENAME_MATCHER) + end + + # Read all the files in // and create a new + # Document object with each one insofar as it matches the regexp matcher. + # + # dir - The String relative path of the directory to read. + # + # Returns nothing. + def read_publishable(dir, magic_dir, matcher) + read_content(dir, magic_dir, matcher).tap do |docs| + docs.each(&:read) + end.select do |doc| + site.publisher.publish?(doc) + end end # Read all the content files from //magic_dir @@ -26,12 +48,15 @@ module Jekyll # klass - The return type of the content. # # Returns klass type of content files - def read_content(dir, magic_dir) + def read_content(dir, magic_dir, matcher) @site.reader.get_entries(dir, magic_dir).map do |entry| - Post.new(site, site.source, dir, entry) if Post.valid?(entry) - end.reject do |entry| - entry.nil? - end + next unless entry =~ matcher + path = @site.in_source_dir(File.join(dir, magic_dir, entry)) + Document.new(path, { + site: @site, + collection: @site.posts + }) + end.reject(&:nil?) end end end diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index d5d74ec9..18b94f6b 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -17,8 +17,8 @@ module Jekyll # Returns a boolean. def regenerate?(document) case document - when Post, Page - document.asset_file? || document.data['regenerate'] || + when Page + document.asset_file? || document.data['regenerate'] || source_modified_or_dest_missing?( site.in_source_dir(document.relative_path), document.destination(@site.dest) ) @@ -87,7 +87,7 @@ module Jekyll return true if disabled? # objects that don't have a path are always regenerated - return true if path.nil? + return true if path.nil? # Check for path in cache if cache.has_key? path diff --git a/lib/jekyll/related_posts.rb b/lib/jekyll/related_posts.rb index 9666b52e..f7dc0962 100644 --- a/lib/jekyll/related_posts.rb +++ b/lib/jekyll/related_posts.rb @@ -46,7 +46,7 @@ module Jekyll end def most_recent_posts - @most_recent_posts ||= (site.posts.reverse - [post]).first(10) + @most_recent_posts ||= (site.posts.docs.reverse - [post]).first(10) end def display(output) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index b79cb6a7..529ff84b 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -23,7 +23,7 @@ module Jekyll # # Returns the output extname including the leading period. def output_ext - converters.first.output_ext(document.extname) + @output_ext ||= converters.first.output_ext(document.extname) end ###################### @@ -31,11 +31,18 @@ module Jekyll ###################### def run + Jekyll.logger.debug "Rendering:", document.relative_path + payload = Utils.deep_merge_hashes({ "page" => document.to_liquid }, site_payload || site.site_payload) - Jekyll::Hooks.trigger :document, :pre_render, document, payload + if document.collection.label == 'posts' && document.is_a?(Document) + 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], @@ -49,13 +56,16 @@ module Jekyll output = document.content if document.render_with_liquid? + Jekyll.logger.debug "Rendering Liquid:", document.relative_path output = render_liquid(output, payload, info, document.path) end + Jekyll.logger.debug "Rendering Markup:", document.relative_path output = convert(output) document.content = output if document.place_in_layout? + Jekyll.logger.debug "Rendering Layout:", document.relative_path place_in_layouts( output, payload, diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 78d4db8b..66bfd163 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -4,7 +4,7 @@ require 'csv' module Jekyll class Site attr_reader :source, :dest, :config - attr_accessor :layouts, :posts, :pages, :static_files, :drafts, + attr_accessor :layouts, :pages, :static_files, :drafts, :exclude, :include, :lsi, :highlighter, :permalink_style, :time, :future, :unpublished, :safe, :plugins, :limit_posts, :show_drafts, :keep_files, :baseurl, :data, :file_read_opts, @@ -74,7 +74,6 @@ module Jekyll def reset self.time = (config['time'] ? Utils.parse_date(config['time'].to_s, "Invalid time in _config.yml.") : Time.now) self.layouts = {} - self.posts = [] self.pages = [] self.static_files = [] self.data = {} @@ -170,14 +169,14 @@ module Jekyll collection.docs.each do |document| if regenerator.regenerate?(document) document.output = Jekyll::Renderer.new(self, document, payload).run - Jekyll::Hooks.trigger :document, :post_render, document + document.trigger_hooks(:post_render) end end end - [posts, pages].flatten.each do |page_or_post| - if regenerator.regenerate?(page_or_post) - page_or_post.render(layouts, payload) + pages.flatten.each do |page| + if regenerator.regenerate?(page) + page.render(layouts, payload) end end rescue Errno::ENOENT @@ -202,6 +201,10 @@ module Jekyll Jekyll::Hooks.trigger :site, :post_write, self end + def posts + collections['posts'] ||= Collection.new(self, 'posts') + end + # Construct a Hash of Posts indexed by the specified Post attribute. # # post_attr - The String name of the Post attribute. @@ -219,7 +222,7 @@ module Jekyll # 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.each { |p| p.send(post_attr.to_sym).each { |t| hash[t] << p } } + posts.each { |p| p.data[post_attr].each { |t| hash[t] << p } } hash.values.each { |posts| posts.sort!.reverse! } hash end @@ -391,8 +394,8 @@ module Jekyll # Returns nothing def limit_posts! if limit_posts > 0 - limit = posts.length < limit_posts ? posts.length : limit_posts - self.posts = posts[-limit, limit] + limit = posts.docs.length < limit_posts ? posts.docs.length : limit_posts + self.posts.docs = posts.docs[-limit, limit] end end diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index ce97642f..2d3e8f44 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -14,7 +14,7 @@ module Jekyll end def ==(other) - other.name.match(@name_regex) + other.basename.match(@name_regex) end def deprecated_equality(other) @@ -32,11 +32,11 @@ module Jekyll # # Returns the post slug with the subdirectory (relative to _posts) def post_slug(other) - path = other.name.split("/")[0...-1].join("/") + path = other.basename.split("/")[0...-1].join("/") if path.nil? || path == "" - other.slug + other.data['slug'] else - path + '/' + other.slug + path + '/' + other.data['slug'] end end end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index cc01c8cc..86d24cef 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -8,6 +8,13 @@ module Jekyll SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze + # Non-destructive version of deep_merge_hashes! See that method. + # + # Returns the merged hashes. + def deep_merge_hashes(master_hash, other_hash) + deep_merge_hashes!(master_hash.dup, other_hash) + end + # Merges a master hash with another hash, recursively. # # master_hash - the "parent" hash whose values will be overridden @@ -17,16 +24,14 @@ module Jekyll # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html # # Thanks to whoever made it. - def deep_merge_hashes(master_hash, other_hash) - target = master_hash.dup - - other_hash.each_key do |key| - if other_hash[key].is_a? Hash and target[key].is_a? Hash - target[key] = Utils.deep_merge_hashes(target[key], other_hash[key]) + def deep_merge_hashes!(target, overwrite) + overwrite.each_key do |key| + if overwrite[key].is_a? Hash and target[key].is_a? Hash + target[key] = Utils.deep_merge_hashes(target[key], overwrite[key]) next end - target[key] = other_hash[key] + target[key] = overwrite[key] end target diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 6be050d8..e29d7624 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -504,8 +504,8 @@ Jekyll::Hooks.register :post, :post_render do |post| end {% endhighlight %} -Jekyll provides hooks for :site, :page, -:post, and :document. In all cases, Jekyll calls your +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 @@ -569,7 +569,7 @@ The complete list of available hooks is below: -

    :page

    +

    :pages

    :post_init

    @@ -580,7 +580,7 @@ The complete list of available hooks is below: -

    :page

    +

    :pages

    :pre_render

    @@ -591,7 +591,7 @@ The complete list of available hooks is below: -

    :page

    +

    :pages

    :post_render

    @@ -602,7 +602,7 @@ The complete list of available hooks is below: -

    :page

    +

    :pages

    :post_write

    @@ -613,7 +613,7 @@ The complete list of available hooks is below: -

    :post

    +

    :posts

    :post_init

    @@ -624,7 +624,7 @@ The complete list of available hooks is below: -

    :post

    +

    :posts

    :pre_render

    @@ -635,7 +635,7 @@ The complete list of available hooks is below: -

    :post

    +

    :posts

    :post_render

    @@ -646,7 +646,7 @@ The complete list of available hooks is below: -

    :post

    +

    :posts

    :post_write

    @@ -657,7 +657,18 @@ The complete list of available hooks is below: -

    :document

    +

    :documents

    + + +

    :post_init

    + + +

    Whenever a document is initialized

    + + + + +

    :documents

    :pre_render

    @@ -668,7 +679,7 @@ The complete list of available hooks is below: -

    :document

    +

    :documents

    :post_render

    @@ -679,7 +690,7 @@ The complete list of available hooks is below: -

    :document

    +

    :documents

    :post_write

    @@ -854,7 +865,7 @@ LESS.js files during generation. - [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. -- [Jekyll views router](https://bitbucket.org/nyufac/jekyll-views-router): Simple router between generator plugins and templates. +- [Jekyll views router](https://bitbucket.org/nyufac/jekyll-views-router): Simple router between generator plugins and templates. #### Editors diff --git a/test/helper.rb b/test/helper.rb index db3b8822..16f015b7 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -20,6 +20,8 @@ require 'rspec/mocks' require 'jekyll' +Jekyll.logger = Logger.new(StringIO.new) + unless jruby? require 'rdiscount' require 'redcarpet' @@ -31,7 +33,7 @@ require 'shoulda' include Jekyll # FIXME: If we really need this we lost the game. -STDERR.reopen(test(?e, '/dev/null') ? '/dev/null' : 'NUL:') +# STDERR.reopen(test(?e, '/dev/null') ? '/dev/null' : 'NUL:') # Report with color. Minitest::Reporters.use! [ @@ -66,6 +68,7 @@ class JekyllUnitTest < Minitest::Test def build_configs(overrides, base_hash = Jekyll::Configuration::DEFAULTS) Utils.deep_merge_hashes(base_hash, overrides) + .fix_common_issues.backwards_compatibilize.add_default_collections end def site_configuration(overrides = {}) @@ -108,23 +111,13 @@ class JekyllUnitTest < Minitest::Test ENV[key] = old_value end - def capture_stdout - $old_stdout = $stdout - $stdout = StringIO.new + def capture_output + stderr = StringIO.new + Jekyll.logger = Logger.new stderr yield - $stdout.rewind - return $stdout.string - ensure - $stdout = $old_stdout - end - - def capture_stderr - $old_stderr = $stderr - $stderr = StringIO.new - yield - $stderr.rewind - return $stderr.string - ensure - $stderr = $old_stderr + stderr.rewind + return stderr.string.to_s end + alias_method :capture_stdout, :capture_output + alias_method :capture_stderr, :capture_output end diff --git a/test/test_collections.rb b/test/test_collections.rb index 3cae5c30..be3a9320 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -80,8 +80,9 @@ class TestCollections < JekyllUnitTest @site.process end - should "not contain any collections" do - assert_equal Hash.new, @site.collections + should "contain only the defaul collections" do + refute_equal Hash.new, @site.collections + refute_nil @site.collections end end diff --git a/test/test_configuration.rb b/test/test_configuration.rb index bd99dc8b..553dfda3 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -1,6 +1,8 @@ require 'helper' class TestConfiguration < JekyllUnitTest + @@defaults = Jekyll::Configuration::DEFAULTS.add_default_collections.freeze + context "#stringify_keys" do setup do @mixed_keys = Configuration[{ @@ -131,20 +133,20 @@ class TestConfiguration < JekyllUnitTest 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 Jekyll::Configuration::DEFAULTS, Jekyll.configuration({}) + assert_equal @@defaults, Jekyll.configuration({}) 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 Jekyll::Configuration::DEFAULTS, Jekyll.configuration({}) + assert_equal @@defaults, Jekyll.configuration({}) 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 Jekyll::Configuration::DEFAULTS, Jekyll.configuration({}) + assert_equal @@defaults, Jekyll.configuration({}) end should "fire warning when user-specified config file isn't there" do @@ -170,27 +172,27 @@ class TestConfiguration < JekyllUnitTest } end - should "load default config if no config_file is set" do + 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 Jekyll::Configuration::DEFAULTS, Jekyll.configuration({}) + assert_equal @@defaults, Jekyll.configuration({}) 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(Jekyll::Configuration::DEFAULTS, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => @paths[:other] }) + assert_equal Utils.deep_merge_hashes(@@defaults, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "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 Jekyll::Configuration::DEFAULTS, Jekyll.configuration({ "config" => @paths[:empty] }) + assert_equal @@defaults, Jekyll.configuration({ "config" => @paths[:empty] }) end should "successfully load a TOML file" do Jekyll.logger.log_level = :warn - assert_equal Jekyll::Configuration::DEFAULTS.merge({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), Jekyll.configuration({ "config" => [@paths[:toml]] }) + assert_equal @@defaults.clone.merge({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), Jekyll.configuration({ "config" => [@paths[:toml]] }) Jekyll.logger.log_level = :info end @@ -203,7 +205,7 @@ 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 Jekyll::Configuration::DEFAULTS, Jekyll.configuration({ "config" => [@paths[:default], @paths[:other], @paths[:toml]] }) + assert_equal @@defaults, Jekyll.configuration({ "config" => [@paths[:default], @paths[:other], @paths[:toml]] }) end should "load multiple config files and last config should win" do @@ -211,7 +213,7 @@ 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(Jekyll::Configuration::DEFAULTS, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] }) + assert_equal Utils.deep_merge_hashes(@@defaults, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] }) end end end diff --git a/test/test_document.rb b/test/test_document.rb index f8b9db66..9f337c27 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -2,6 +2,10 @@ require 'helper' class TestDocument < JekyllUnitTest + def assert_equal_value(key, one, other) + assert_equal(one[key], other[key]) + end + context "a document in a collection" do setup do @site = fixture_site({ @@ -36,10 +40,8 @@ class TestDocument < JekyllUnitTest end should "know its data" do - assert_equal({ - "title" => "Jekyll.configuration", - "whatever" => "foo.bar" - }, @document.data) + assert_equal "Jekyll.configuration", @document.data["title"] + assert_equal "foo.bar", @document.data["whatever"] end context "with YAML ending in three dots" do @@ -53,10 +55,8 @@ class TestDocument < JekyllUnitTest end should "know its data" do - assert_equal({ - "title" => "YAML with Dots", - "whatever" => "foo.bar" - }, @document.data) + assert_equal "YAML with Dots", @document.data["title"] + assert_equal "foo.bar", @document.data["whatever"] end end @@ -88,13 +88,9 @@ class TestDocument < JekyllUnitTest end should "know the frontmatter defaults" do - assert_equal({ - "title"=>"Example slide", - "layout"=>"slide", - "nested"=> { - "key"=>"myval" - } - }, @document.data) + assert_equal "Example slide", @document.data["title"] + assert_equal "slide", @document.data["layout"] + assert_equal({"key"=>"myval"}, @document.data["nested"]) end end @@ -117,14 +113,9 @@ class TestDocument < JekyllUnitTest end should "override default values in the document frontmatter" do - assert_equal({ - "title"=>"Override title", - "layout"=>"slide", - "nested"=> { - "test1"=>"override1", - "test2"=>"override2" - } - }, @document.data) + assert_equal "Override title", @document.data["title"] + assert_equal "slide", @document.data["layout"] + assert_equal({"test1"=>"override1","test2"=>"override2"}, @document.data["nested"]) end end @@ -146,13 +137,9 @@ class TestDocument < JekyllUnitTest end should "know the frontmatter defaults" do - assert_equal({ - "title"=>"Example slide", - "layout"=>"slide", - "nested"=> { - "key"=>"value123" - } - }, @document.data) + assert_equal "Example slide", @document.data["title"] + assert_equal "slide", @document.data["layout"] + assert_equal({"key"=>"value123"}, @document.data["nested"]) end end @@ -174,10 +161,9 @@ class TestDocument < JekyllUnitTest end should "not know the specified frontmatter defaults" do - assert_equal({ - "title"=>"Example slide", - "layout"=>"slide" - }, @document.data) + assert_equal "Example slide", @document.data["title"] + assert_equal "slide", @document.data["layout"] + assert_equal nil, @document.data["nested"] end end diff --git a/test/test_draft.rb b/test/test_draft.rb deleted file mode 100644 index 7312c8c9..00000000 --- a/test/test_draft.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'helper' - -class TestDraft < JekyllUnitTest - def setup_draft(file) - Draft.new(@site, source_dir, '', file) - end - - context "A Draft" do - setup do - clear_dest - @site = Site.new(site_configuration) - end - - should "ensure valid drafts are valid" do - assert Draft.valid?("2008-09-09-foo-bar.textile") - assert Draft.valid?("foo/bar/2008-09-09-foo-bar.textile") - assert Draft.valid?("lol2008-09-09-foo-bar.textile") - - assert !Draft.valid?("blah") - end - - should "make properties accessible through #[]" do - draft = setup_draft('draft-properties.text') - # ! need to touch the file! Or get its timestamp - date = File.mtime(File.join(source_dir, '_drafts', 'draft-properties.text')) - ymd = date.strftime("%Y/%m/%d") - - attrs = { - categories: %w(foo bar baz), - content: "All the properties.\n\nPlus an excerpt.\n", - date: date, - dir: "/foo/bar/baz/#{ymd}", - excerpt: "All the properties.\n\n", - foo: 'bar', - id: "/foo/bar/baz/#{ymd}/draft-properties", - layout: 'default', - name: nil, - path: "_drafts/draft-properties.text", - permalink: nil, - published: nil, - tags: %w(ay bee cee), - title: 'Properties Draft', - url: "/foo/bar/baz/#{ymd}/draft-properties.html" - } - - attrs.each do |attr, val| - attr_str = attr.to_s - result = draft[attr_str] - assert_equal val, result, "For :" - end - end - - end - -end diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index a5025cda..322ba3c6 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -2,33 +2,36 @@ require 'helper' class TestExcerpt < JekyllUnitTest def setup_post(file) - Post.new(@site, source_dir, '', file) + Document.new(@site.in_source_dir(File.join('_posts', file)), { + site: @site, + collection: @site.posts + }).tap(&:read) end - def do_render(post) - layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")} - post.render(layouts, {"site" => {"posts" => []}}) + 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 end context "With extraction disabled" do setup do clear_dest - @site = Site.new(site_configuration('excerpt_separator' => '')) + @site = fixture_site('excerpt_separator' => '') @post = setup_post("2013-07-22-post-excerpt-with-layout.markdown") end should "not be generated" do - excerpt = @post.send(:extract_excerpt) - assert_equal true, excerpt.empty? + refute @post.generate_excerpt? end end context "An extracted excerpt" do setup do clear_dest - @site = Site.new(site_configuration) + @site = fixture_site @post = setup_post("2013-07-22-post-excerpt-with-layout.markdown") - @excerpt = @post.send :extract_excerpt + @excerpt = @post.data['excerpt'] end context "#include(string)" do @@ -45,7 +48,7 @@ class TestExcerpt < JekyllUnitTest context "#id" do should "contain the UID for the post" do - assert_equal @excerpt.id, "#{@post.id}/#excerpt" + assert_equal @excerpt.id, "#{@post.id}#excerpt" end should "return a string" do assert_same @post.id.class, String @@ -53,8 +56,8 @@ class TestExcerpt < JekyllUnitTest end context "#to_s" do - should "return its content if no output present" do - assert_equal @excerpt.content, @excerpt.to_s + should "return rendered output" do + assert_equal @excerpt.output, @excerpt.to_s end should "return its output if output present" do @@ -82,17 +85,6 @@ class TestExcerpt < JekyllUnitTest 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 - - should "consider inheritance" do - klass = Class.new(Jekyll::Post) - assert_gets_called = false - klass.send(:define_method, :assert_gets_called) { assert_gets_called = true } - klass.const_set(:EXCERPT_ATTRIBUTES_FOR_LIQUID, Jekyll::Post::EXCERPT_ATTRIBUTES_FOR_LIQUID + ['assert_gets_called']) - post = klass.new(@site, source_dir, '', "2008-02-02-published.markdown") - Jekyll::Excerpt.new(post).to_liquid - - assert assert_gets_called, 'assert_gets_called did not get called on post.' - end end context "#content" do @@ -111,11 +103,11 @@ class TestExcerpt < JekyllUnitTest setup do @rendered_post = @post.dup do_render(@rendered_post) - @extracted_excerpt = @rendered_post.send :extracted_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.content + assert_equal "

    First paragraph with link ref.

    \n\n", @extracted_excerpt.output end should "link properly" do @@ -128,9 +120,9 @@ class TestExcerpt < JekyllUnitTest context "A whole-post excerpt" do setup do clear_dest - @site = Site.new(site_configuration) + @site = fixture_site @post = setup_post("2008-02-02-published.markdown") - @excerpt = @post.send :extract_excerpt + @excerpt = @post.data['excerpt'] end should "be generated" do diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index 7d2e26be..99efedea 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -69,7 +69,7 @@ class TestFrontMatterDefaults < JekyllUnitTest }] })) @site.process - @affected = @site.posts.find { |page| page.relative_path =~ /^\/win/ } + @affected = @site.posts.docs.find { |page| page.relative_path =~ /win\// } @not_affected = @site.pages.find { |page| page.relative_path == "about.html" } end @@ -95,7 +95,7 @@ class TestFrontMatterDefaults < JekyllUnitTest })) @site.process @affected = @site.pages - @not_affected = @site.posts + @not_affected = @site.posts.docs end should "affect only the specified type and all paths" do @@ -120,7 +120,7 @@ class TestFrontMatterDefaults < JekyllUnitTest })) @site.process @affected = @site.pages - @not_affected = @site.posts + @not_affected = @site.posts.docs end should "affect only the specified type and all paths" do diff --git a/test/test_new_command.rb b/test/test_new_command.rb index 7321b462..33bd1044 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -25,14 +25,15 @@ class TestNewCommand < JekyllUnitTest should 'create a new directory' do assert !File.exist?(@full_path) - capture_stdout { Jekyll::Commands::New.process(@args) } + Jekyll::Commands::New.process(@args) assert File.exist?(@full_path) end should 'display a success message' do - output = capture_stdout { Jekyll::Commands::New.process(@args) } - success_message = "New jekyll site installed in #{@full_path}. \n" - assert_equal success_message, output + 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 diff --git a/test/test_post.rb b/test/test_post.rb deleted file mode 100644 index 2956309f..00000000 --- a/test/test_post.rb +++ /dev/null @@ -1,815 +0,0 @@ -# encoding: utf-8 - -require 'helper' - -class TestPost < JekyllUnitTest - def setup_post(file) - Post.new(@site, source_dir, '', file) - end - - def do_render(post) - layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")} - post.render(layouts, {"site" => {"posts" => []}}) - end - - context "A Post" do - setup do - clear_dest - @site = fixture_site - end - - should "ensure valid posts are valid" do - assert Post.valid?("2008-09-09-foo-bar.textile") - assert Post.valid?("foo/bar/2008-09-09-foo-bar.textile") - assert Post.valid?("2008-09-09-foo-bar.markdown") - assert Post.valid?("foo/bar/2008-09-09-foo-bar.markdown") - - assert !Post.valid?("lol2008-09-09-foo-bar.textile") - assert !Post.valid?("lol2008-09-09-foo-bar.markdown") - assert !Post.valid?("blah") - end - - should "make properties accessible through #[]" do - post = setup_post('2013-12-20-properties.text') - - attrs = { - categories: %w(foo bar baz MixedCase), - content: "All the properties.\n\nPlus an excerpt.\n", - date: Time.new(2013, 12, 20), - dir: "/foo/bar/baz/mixedcase/2013/12/20", - excerpt: "All the properties.\n\n", - foo: 'bar', - id: "/foo/bar/baz/mixedcase/2013/12/20/properties", - layout: 'default', - name: nil, - path: "_posts/2013-12-20-properties.text", - permalink: nil, - published: nil, - tags: %w(ay bee cee), - title: 'Properties Post', - url: "/foo/bar/baz/mixedcase/2013/12/20/properties.html" - } - - attrs.each do |attr, val| - attr_str = attr.to_s - result = post[attr_str] - assert_equal val, result, "For :" - end - end - - context "processing posts" do - setup do - @post = Post.allocate - @post.site = @site - - @real_file = "2008-10-18-foo-bar.markdown" - @fake_file = "2008-09-09-foo-bar.markdown" - @source = source_dir('_posts') - end - - should "keep date, title, and markup type" do - @post.categories = [] - @post.process(@fake_file) - - assert_equal Time.parse("2008-09-09"), @post.date - assert_equal "foo-bar", @post.slug - assert_equal ".markdown", @post.ext - assert_equal "/2008/09/09", @post.dir - assert_equal "/2008/09/09/foo-bar", @post.id - end - - should "ignore subfolders" do - post = Post.allocate - post.categories = ['foo'] - post.site = @site - post.process("cat1/2008-09-09-foo-bar.markdown") - assert_equal 1, post.categories.size - assert_equal "foo", post.categories[0] - - post = Post.allocate - post.categories = ['foo', 'bar'] - post.site = @site - post.process("cat2/CAT3/2008-09-09-foo-bar.markdown") - assert_equal 2, post.categories.size - assert_equal "foo", post.categories[0] - assert_equal "bar", post.categories[1] - - end - - should "create url based on date and title" do - @post.categories = [] - @post.process(@fake_file) - assert_equal "/2008/09/09/foo-bar.html", @post.url - end - - should "raise a good error on invalid post date" do - assert_raises Jekyll::Errors::FatalException do - @post.process("2009-27-03-foo-bar.markdown") - end - end - - should "escape urls" do - @post.categories = [] - @post.process("2009-03-12-hash-#1.markdown") - assert_equal "/2009/03/12/hash-%231.html", @post.url - assert_equal "/2009/03/12/hash-#1", @post.id - end - - should "escape urls with non-alphabetic characters" do - @post.categories = [] - @post.process("2014-03-22-escape-+ %20[].markdown") - assert_equal "/2014/03/22/escape-+%20%2520%5B%5D.html", @post.url - assert_equal "/2014/03/22/escape-+ %20[]", @post.id - end - - should "return a UTF-8 escaped string" do - assert_equal Encoding::UTF_8, URL.escape_path("/rails笔记/2014/04/20/escaped/").encoding - end - - should "return a UTF-8 unescaped string" do - assert_equal Encoding::UTF_8, URL.unescape_path("/rails%E7%AC%94%E8%AE%B0/2014/04/20/escaped/".encode(Encoding::ASCII)).encoding - end - - should "respect permalink in yaml front matter" do - file = "2008-12-03-permalinked-post.markdown" - @post.process(file) - @post.read_yaml(@source, file) - - assert_equal "my_category/permalinked-post", @post.permalink - assert_equal "/my_category", @post.dir - assert_equal "/my_category/permalinked-post", @post.url - end - - should "not be writable outside of destination" do - unexpected = File.expand_path("../../../baddie.html", dest_dir) - File.delete unexpected if File.exist?(unexpected) - post = setup_post("2014-01-06-permalink-traversal.md") - do_render(post) - post.write(dest_dir) - - assert !File.exist?(unexpected), "../../../baddie.html should not exist." - assert File.exist?(File.expand_path("baddie.html", dest_dir)) - end - - context "with CRLF linebreaks" do - setup do - @real_file = "2009-05-24-yaml-linebreak.markdown" - @source = source_dir('win/_posts') - end - should "read yaml front-matter" do - @post.read_yaml(@source, @real_file) - - assert_equal({"title" => "Test title", "layout" => "post", "tag" => "Ruby"}, @post.data) - assert_equal "This is the content", @post.content - end - end - - context "with three dots ending YAML header" do - setup do - @real_file = "2014-03-03-yaml-with-dots.md" - end - should "should read the YAML header" do - @post.read_yaml(@source, @real_file) - - assert_equal({"title" => "Test Post Where YAML Ends in Dots"}, - @post.data) - end - end - - context "with embedded triple dash" do - setup do - @real_file = "2010-01-08-triple-dash.markdown" - end - should "consume the embedded dashes" do - @post.read_yaml(@source, @real_file) - - assert_equal({"title" => "Foo --- Bar"}, @post.data) - assert_equal "Triple the fun!", @post.content - end - end - - context "with site wide permalink" do - setup do - @post.categories = [] - end - - context "with unspecified (date) style" do - setup do - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:year/:month/:day/:title.html", @post.template - assert_equal "/2008/09/09/foo-bar.html", @post.url - end - end - - context "with unspecified (date) style and a category" do - setup do - @post.categories << "beer" - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:year/:month/:day/:title.html", @post.template - assert_equal "/beer/2008/09/09/foo-bar.html", @post.url - end - end - - context "with unspecified (date) style and a numeric category" do - setup do - @post.categories << 2013 - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:year/:month/:day/:title.html", @post.template - assert_equal "/2013/2008/09/09/foo-bar.html", @post.url - end - end - - context "with specified layout of nil" do - setup do - file = '2013-01-12-nil-layout.markdown' - @post = setup_post(file) - @post.process(file) - end - - should "layout of nil is respected" do - assert_equal "nil", @post.data["layout"] - end - end - - context "with unspecified (date) style and categories" do - setup do - @post.categories << "food" - @post.categories << "beer" - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:year/:month/:day/:title.html", @post.template - assert_equal "/food/beer/2008/09/09/foo-bar.html", @post.url - end - end - - context "with space (categories)" do - setup do - @post.categories << "french cuisine" - @post.categories << "belgian beer" - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:year/:month/:day/:title.html", @post.template - assert_equal "/french%20cuisine/belgian%20beer/2008/09/09/foo-bar.html", @post.url - end - end - - context "with mixed case (category)" do - setup do - @post.categories << "MixedCase" - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:year/:month/:day/:title.html", @post.template - assert_equal "/mixedcase/2008/09/09/foo-bar.html", @post.url - end - end - - context "with duplicated mixed case (categories)" do - setup do - @post.categories << "MixedCase" - @post.categories << "Mixedcase" - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:year/:month/:day/:title.html", @post.template - assert_equal "/mixedcase/2008/09/09/foo-bar.html", @post.url - end - end - - context "with none style" do - setup do - @post.site.permalink_style = :none - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:title.html", @post.template - assert_equal "/foo-bar.html", @post.url - end - end - - context "with pretty style" do - setup do - @post.site.permalink_style = :pretty - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:year/:month/:day/:title/", @post.template - assert_equal "/2008/09/09/foo-bar/", @post.url - end - end - - context "with ordinal style" do - setup do - @post.site.permalink_style = :ordinal - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/:categories/:year/:y_day/:title.html", @post.template - assert_equal "/2008/253/foo-bar.html", @post.url - end - end - - context "with custom date permalink" do - setup do - @post.site.permalink_style = '/:categories/:year/:i_month/:i_day/:title/' - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/2008/9/9/foo-bar/", @post.url - end - end - - context "with custom abbreviated month date permalink" do - setup do - @post.site.permalink_style = '/:categories/:year/:short_month/:day/:title/' - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/2008/Sep/09/foo-bar/", @post.url - end - end - - context "with prefix style and no extension" do - setup do - @post.site.permalink_style = "/prefix/:title" - @post.process(@fake_file) - end - - should "process the url correctly" do - assert_equal "/prefix/:title", @post.template - assert_equal "/prefix/foo-bar", @post.url - end - end - end - - should "read yaml front-matter" do - @post.read_yaml(@source, @real_file) - - assert_equal({"title" => "Foo Bar", "layout" => "default"}, @post.data) - assert_equal "# {{ page.title }}\n\nBest **post** ever", @post.content - end - - should "transform markdown" do - @post.process(@real_file) - @post.read_yaml(@source, @real_file) - assert_equal "

    {{ page.title }}

    \n\n

    Best post ever

    ", @post.transform.strip - end - - context "#excerpt" do - setup do - file = "2013-01-02-post-excerpt.markdown" - @post = setup_post(file) - @post.process(file) - @post.read_yaml(@source, file) - do_render(@post) - end - - should "return first paragraph by default" do - assert @post.excerpt.include?("First paragraph"), "contains first paragraph" - assert !@post.excerpt.include?("Second paragraph"), "does not contains second paragraph" - assert !@post.excerpt.include?("Third paragraph"), "does not contains third paragraph" - end - - should "correctly resolve link references" do - assert @post.excerpt.include?("www.jekyllrb.com"), "contains referenced link URL" - end - - should "return rendered HTML" do - assert_equal "

    First paragraph with link ref.

    \n\n", - @post.excerpt - end - - context "with excerpt_separator setting" do - setup do - file = "2013-01-02-post-excerpt.markdown" - - @post.site.config['excerpt_separator'] = "\n---\n" - - @post.process(file) - @post.read_yaml(@source, file) - @post.transform - end - - should "respect given separator" do - assert @post.excerpt.include?("First paragraph"), "contains first paragraph" - assert @post.excerpt.include?("Second paragraph"), "contains second paragraph" - assert !@post.excerpt.include?("Third paragraph"), "does not contains third paragraph" - end - - should "replace separator with new-lines" do - assert !@post.excerpt.include?("---"), "does not contains separator" - end - end - - context "with page's excerpt_separator setting" do - setup do - file = "2015-01-08-post-excerpt-separator.markdown" - - @post.process(file) - @post.read_yaml(@source, file) - @post.transform - end - - should "respect given separator" do - assert @post.excerpt.include?("First paragraph"), "contains first paragraph" - assert @post.excerpt.include?("Second paragraph"), "contains second paragraph" - assert !@post.excerpt.include?("Third paragraph"), "does not contains third paragraph" - end - end - - context "with custom excerpt" do - setup do - file = "2013-04-11-custom-excerpt.markdown" - @post = setup_post(file) - do_render(@post) - end - - should "use custom excerpt" do - assert_equal("I can set a custom excerpt", @post.excerpt) - end - - should "expose custom excerpt to liquid" do - assert @post.content.include?("I can use the excerpt: I can set a custom excerpt"), "Exposes incorrect excerpt to liquid." - end - - end - - end - end - - context "when in a site" do - setup do - clear_dest - @site = fixture_site - @site.posts = [setup_post('2008-02-02-published.markdown'), - setup_post('2009-01-27-categories.markdown')] - end - - should "have next post" do - assert_equal(@site.posts.last, @site.posts.first.next) - end - - should "have previous post" do - assert_equal(@site.posts.first, @site.posts.last.previous) - end - - should "not have previous post if first" do - assert_equal(nil, @site.posts.first.previous) - end - - should "not have next post if last" do - assert_equal(nil, @site.posts.last.next) - end - end - - context "initializing posts" do - should "recognize date in yaml" do - post = setup_post("2010-01-09-date-override.markdown") - do_render(post) - assert_equal Time, post.date.class - assert_equal Time, post.to_liquid["date"].class - assert_equal "/2010/01/10/date-override.html", post.url - assert_equal "

    Post with a front matter date

    \n\n

    10 Jan 2010

    ", post.output.strip - end - - should "recognize time in yaml" do - post = setup_post("2010-01-09-time-override.markdown") - do_render(post) - assert_equal Time, post.date.class - assert_equal Time, post.to_liquid["date"].class - assert_equal "/2010/01/10/time-override.html", post.url - assert_equal "

    Post with a front matter time

    \n\n

    10 Jan 2010

    ", post.output.strip - end - - should "recognize time with timezone in yaml" do - post = setup_post("2010-01-09-timezone-override.markdown") - do_render(post) - assert_equal Time, post.date.class - assert_equal Time, post.to_liquid["date"].class - assert_equal "/2010/01/10/timezone-override.html", post.url - assert_equal "

    Post with a front matter time with timezone

    \n\n

    10 Jan 2010

    ", post.output.strip - end - - should "to_liquid prioritizes post attributes over data" do - post = setup_post("2010-01-16-override-data.markdown") - assert_equal Array, post.tags.class - assert_equal Array, post.to_liquid["tags"].class - assert_equal Time, post.date.class - assert_equal Time, post.to_liquid["date"].class - end - - should "to_liquid should consider inheritance" do - klass = Class.new(Jekyll::Post) - assert_gets_called = false - klass.send(:define_method, :assert_gets_called) { assert_gets_called = true } - klass.const_set(:EXCERPT_ATTRIBUTES_FOR_LIQUID, Jekyll::Post::EXCERPT_ATTRIBUTES_FOR_LIQUID + ['assert_gets_called']) - post = klass.new(@site, source_dir, '', "2008-02-02-published.markdown") - do_render(post) - - assert assert_gets_called, 'assert_gets_called did not get called on post.' - end - - should "recognize category in yaml" do - post = setup_post("2009-01-27-category.markdown") - assert post.categories.include?('foo') - end - - should "recognize several categories in yaml" do - post = setup_post("2009-01-27-categories.markdown") - assert post.categories.include?('foo') - assert post.categories.include?('bar') - assert post.categories.include?('baz') - end - - should "recognize empty category in yaml" do - post = setup_post("2009-01-27-empty-category.markdown") - assert_equal [], post.categories - end - - should "recognize empty categories in yaml" do - post = setup_post("2009-01-27-empty-categories.markdown") - assert_equal [], post.categories - end - - should "recognize number category in yaml" do - post = setup_post("2013-05-10-number-category.markdown") - assert post.categories.include?('2013') - assert !post.categories.include?(2013) - end - - should "recognize mixed case category in yaml" do - post = setup_post("2014-07-05-mixed-case-category.markdown") - assert post.categories.include?('MixedCase') - assert !post.categories.include?('mixedcase') - end - - should "recognize tag in yaml" do - post = setup_post("2009-05-18-tag.markdown") - assert post.tags.include?('code') - end - - should "recognize tags in yaml" do - post = setup_post("2009-05-18-tags.markdown") - assert post.tags.include?('food') - assert post.tags.include?('cooking') - assert post.tags.include?('pizza') - end - - should "recognize empty tag in yaml" do - post = setup_post("2009-05-18-empty-tag.markdown") - assert_equal [], post.tags - end - - should "recognize empty tags in yaml" do - post = setup_post("2009-05-18-empty-tags.markdown") - assert_equal [], post.tags - end - - should "allow no yaml" do - post = setup_post("2009-06-22-no-yaml.markdown") - assert_equal "No YAML.", post.content - end - - should "allow empty yaml" do - post = setup_post("2009-06-22-empty-yaml.markdown") - assert_equal "Empty YAML.", post.content - end - - context "rendering" do - setup do - clear_dest - end - - should "render properly" do - post = setup_post("2008-10-18-foo-bar.markdown") - do_render(post) - assert_equal "<<<

    Foo Bar

    \n\n

    Best post ever

    \n >>>", post.output - end - - should "write properly" do - post = setup_post("2008-10-18-foo-bar.markdown") - do_render(post) - post.write(dest_dir) - - assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, '2008', '10', '18', 'foo-bar.html')) - end - - should "write properly when url has hash" do - post = setup_post("2009-03-12-hash-#1.markdown") - do_render(post) - post.write(dest_dir) - - assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, '2009', '03', '12', - 'hash-#1.html')) - end - - should "write properly when url has space" do - post = setup_post("2014-03-22-escape-+ %20[].markdown") - do_render(post) - post.write(dest_dir) - - assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, '2014', '03', '22', - 'escape-+ %20[].html')) - end - - should "write properly when category has different letter case" do - %w(2014-07-05-mixed-case-category.markdown 2014-07-05-another-mixed-case-category.markdown).each do |file| - post = setup_post(file) - do_render(post) - post.write(dest_dir) - end - - assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'mixedcase', '2014', '07', '05', - 'mixed-case-category.html')) - assert File.exist?(File.join(dest_dir, 'mixedcase', '2014', '07', '05', - 'another-mixed-case-category.html')) - end - - should "write properly without html extension" do - post = setup_post("2008-10-18-foo-bar.markdown") - post.site.permalink_style = ":title/" - do_render(post) - post.write(dest_dir) - - assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'foo-bar', 'index.html')) - end - - should "write properly with extensionless site permalink" do - post = setup_post("2008-10-18-foo-bar.markdown") - post.site.permalink_style = ":title" - do_render(post) - post.write(dest_dir) - - assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'foo-bar.html')) - end - - should "write properly with extensionless post permalink" do - post = setup_post("2015-02-20-extensionless-permalink.markdown") - do_render(post) - post.write(dest_dir) - - assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'extensionless-permalink.html')) - assert_equal "

    /extensionless-permalink

    \n", post.content - end - - should "insert data" do - post = setup_post("2008-11-21-complex.markdown") - do_render(post) - - assert_equal "<<<

    url: /2008/11/21/complex.html\ndate: #{Time.parse("2008-11-21")}\nid: /2008/11/21/complex

    \n >>>", post.output - end - - should "include templates" do - post = setup_post("2008-12-13-include.markdown") - do_render(post) - - assert_equal "<<<
    \n

    Tom Preston-Werner\ngithub.com/mojombo

    \n\n

    This is cool

    \n >>>", post.output - end - - should "render date specified in front matter properly" do - post = setup_post("2010-01-09-date-override.markdown") - do_render(post) - - assert_equal "

    Post with a front matter date

    \n\n

    10 Jan 2010

    ", post.output.strip - end - - should "render time specified in front matter properly" do - post = setup_post("2010-01-09-time-override.markdown") - do_render(post) - - assert_equal "

    Post with a front matter time

    \n\n

    10 Jan 2010

    ", post.output.strip - end - - end - end - - should "generate categories and topics" do - post = Post.new(@site, File.join(File.dirname(__FILE__), *%w[source]), 'foo', 'bar/2008-12-12-topical-post.markdown') - assert_equal ['foo'], post.categories - end - end - - context "converter file extension settings" do - setup do - @site = fixture_site - end - - should "process .md as markdown under default configuration" do - post = setup_post '2011-04-12-md-extension.md' - conv = post.converters.first - assert conv.kind_of? Jekyll::Converters::Markdown - end - - should "process .text as identity under default configuration" do - post = setup_post '2011-04-12-text-extension.text' - conv = post.converters.first - assert conv.kind_of? Jekyll::Converters::Identity - end - - should "process .text as markdown under alternate configuration" do - @site.config['markdown_ext'] = 'markdown,mdw,mdwn,md,text' - post = setup_post '2011-04-12-text-extension.text' - conv = post.converters.first - assert conv.kind_of? Jekyll::Converters::Markdown - end - - should "process .md as markdown under alternate configuration" do - @site.config['markdown_ext'] = 'markdown,mkd,mkdn,md,text' - post = setup_post '2011-04-12-text-extension.text' - conv = post.converters.first - assert conv.kind_of? Jekyll::Converters::Markdown - end - - should "process .mkdn under text if it is not in the markdown config" do - @site.config['markdown_ext'] = 'markdown,mkd,md,text' - post = setup_post '2013-08-01-mkdn-extension.mkdn' - conv = post.converters.first - assert conv.kind_of? Jekyll::Converters::Identity - end - - should "process .Rmd under text if it is not in the markdown config" do - @site.config['markdown_ext'] = 'markdown,mkd,md,text' - post = setup_post '2014-11-24-Rmd-extension.Rmd' - assert_equal 1, post.converters.size - conv = post.converters.first - assert conv.kind_of?(Jekyll::Converters::Identity), "The converter for .Rmd should be the Identity converter." - end - - end - - context "site config with category" do - setup do - front_matter_defaults = { - 'defaults' => [{ - 'scope' => { 'path' => '' }, - 'values' => { 'category' => 'article' } - }] - } - @site = fixture_site(front_matter_defaults) - end - - should "return category if post does not specify category" do - post = setup_post("2009-01-27-no-category.markdown") - assert post.categories.include?('article'), "Expected post.categories to include 'article' but did not." - end - - should "override site category if set on post" do - post = setup_post("2009-01-27-category.markdown") - assert post.categories.include?('foo'), "Expected post.categories to include 'foo' but did not." - assert !post.categories.include?('article'), "Did not expect post.categories to include 'article' but it did." - end - end - - context "site config with categories" do - setup do - front_matter_defaults = { - 'defaults' => [{ - 'scope' => { 'path' => '' }, - 'values' => { 'categories' => ['article'] } - }] - } - @site = fixture_site(front_matter_defaults) - end - - should "return categories if post does not specify categories" do - post = setup_post("2009-01-27-no-category.markdown") - assert post.categories.include?('article'), "Expected post.categories to include 'article' but did not." - end - - should "override site categories if set on post" do - post = setup_post("2009-01-27-categories.markdown") - ['foo', 'bar', 'baz'].each do |category| - assert post.categories.include?(category), "Expected post.categories to include '#{category}' but did not." - end - assert !post.categories.include?('article'), "Did not expect post.categories to include 'article' but it did." - end - end - -end diff --git a/test/test_related_posts.rb b/test/test_related_posts.rb index 4c2c6bf9..cd114c04 100644 --- a/test/test_related_posts.rb +++ b/test/test_related_posts.rb @@ -13,7 +13,7 @@ class TestRelatedPosts < JekyllUnitTest last_post = @site.posts.last related_posts = Jekyll::RelatedPosts.new(last_post).build - last_10_recent_posts = (@site.posts.reverse - [last_post]).first(10) + last_10_recent_posts = (@site.posts.docs.reverse - [last_post]).first(10) assert_equal last_10_recent_posts, related_posts end end @@ -38,8 +38,8 @@ class TestRelatedPosts < JekyllUnitTest end should "index Jekyll::Post objects" do - @site.posts = @site.posts.first(1) - expect_any_instance_of(::ClassifierReborn::LSI).to receive(:add_item).with(kind_of(Jekyll::Post)) + @site.posts.docs = @site.posts.docs.first(1) + expect_any_instance_of(::ClassifierReborn::LSI).to receive(:add_item).with(kind_of(Jekyll::Document)) Jekyll::RelatedPosts.new(@site.posts.last).build_index end diff --git a/test/test_site.rb b/test/test_site.rb index 1ad9d337..811d79d0 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -190,9 +190,9 @@ class TestSite < JekyllUnitTest end should "read posts" do - @site.posts.concat(PostReader.new(@site).read('')) + @site.posts.docs.concat(PostReader.new(@site).read_posts('')) posts = Dir[source_dir('_posts', '**', '*')] - posts.delete_if { |post| File.directory?(post) && !Post.valid?(post) } + posts.delete_if { |post| File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) } assert_equal posts.size - @num_invalid_posts, @site.posts.size end @@ -219,8 +219,8 @@ class TestSite < JekyllUnitTest @site.process posts = Dir[source_dir("**", "_posts", "**", "*")] - posts.delete_if { |post| File.directory?(post) && !Post.valid?(post) } - categories = %w(2013 bar baz category foo z_category MixedCase Mixedcase publish_test win).sort + posts.delete_if { |post| File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) } + categories = %w(2013 bar baz category foo z_category MixedCase Mixedcase es publish_test win).sort assert_equal posts.size - @num_invalid_posts, @site.posts.size assert_equal categories, @site.categories.keys.sort @@ -498,7 +498,7 @@ class TestSite < JekyllUnitTest sleep 1 @site.process mtime3 = File.stat(dest).mtime.to_i - refute_equal mtime2, mtime3 # must be regenerated + refute_equal mtime2, mtime3 # must be regenerated sleep 1 @site.process @@ -522,7 +522,7 @@ class TestSite < JekyllUnitTest @site.process assert File.file?(dest) mtime2 = File.stat(dest).mtime.to_i - refute_equal mtime1, mtime2 # must be regenerated + refute_equal mtime1, mtime2 # must be regenerated end end diff --git a/test/test_tags.rb b/test/test_tags.rb index b08bd213..9536cf70 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -12,7 +12,7 @@ class TestTags < JekyllUnitTest site = fixture_site({"highlighter" => "rouge"}.merge(override)) if override['read_posts'] - site.posts.concat(PostReader.new(site).read('')) + site.posts.docs.concat(PostReader.new(site).read_posts('')) end info = { :filters => [Jekyll::Filters], :registers => { :site => site } } @@ -455,8 +455,8 @@ CONTENT 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/es/2008/11/21/nested/}, @result + assert_match %r{4\s/es/2008/11/21/nested/}, @result end end @@ -655,11 +655,9 @@ CONTENT context "include tag with variable and liquid filters" do setup do - site = fixture_site({'pygments' => true}) - post = Post.new(site, source_dir, '', "2013-12-17-include-variable-filters.markdown") - layouts = { "default" => Layout.new(site, source_dir('_layouts'), "simple.html")} - post.render(layouts, {"site" => {"posts" => []}}) - @content = post.content + 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" } + @content = post.output end should "include file as variable with liquid filters" do @@ -687,11 +685,9 @@ CONTENT context "relative include tag with variable and liquid filters" do setup do - site = fixture_site('pygments' => true) - post = Post.new(site, source_dir, '', "2014-09-02-relative-includes.markdown") - layouts = { "default" => Layout.new(site, source_dir('_layouts'), "simple.html")} - post.render(layouts, {"site" => {"posts" => []}}) - @content = post.content + site = fixture_site({'pygments' => true}).tap(&:read).tap(&:render) + post = site.posts.docs.find {|p| p.basename.eql? "2014-09-02-relative-includes.markdown" } + @content = post.output end should "include file as variable with liquid filters" do From 260ad9a3fb14c04f0661e62471b4e3d4b9fb1c9b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 09:53:43 -0700 Subject: [PATCH 139/810] Update history to reflect merge of #4055 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e2fc23f2..29d18362 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,7 @@ * 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) From 7fbe61fc774065df5da68f5f4980c540cf0ab916 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 09:57:07 -0700 Subject: [PATCH 140/810] Update history to reflect merge of #4053 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 29d18362..d91b9f0a 100644 --- a/History.markdown +++ b/History.markdown @@ -93,6 +93,7 @@ * 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 From 74734d46f8f6f18fd55706fbfdd75a1ef67047c2 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Mon, 26 Oct 2015 13:55:00 -0500 Subject: [PATCH 141/810] Update JRuby on Travis-CI. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3d40a501..37793b16 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,10 +5,10 @@ rvm: - 2.2 - 2.1 - 2.0 -- jruby-9.0.0.0 +- jruby-9.0.3.0 matrix: allow_failures: - - rvm: jruby-9.0.0.0 + - rvm: jruby-9.0.3.0 env: matrix: - TEST_SUITE=test From 2e7c471c70c287295a87e14da9eed9e760831e0f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 13:37:04 -0700 Subject: [PATCH 142/810] Add Document#method_missing and Collection#method_missing Proxies calls to either #data or #docs, respectively. Deprecation warning is printed. --- lib/jekyll/collection.rb | 21 +++++++++++++++------ lib/jekyll/document.rb | 17 +++++++++++++++++ lib/jekyll/reader.rb | 2 +- lib/jekyll/related_posts.rb | 4 ++-- lib/jekyll/site.rb | 6 +++--- 5 files changed, 38 insertions(+), 12 deletions(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 9faffaab..4363aee1 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -23,12 +23,21 @@ module Jekyll @docs ||= [] end - [:sort, :sort!, :each, :[], :reject, :first, :last, :size, :length].each do |method| - class_eval %Q" - def #{method}(*args, &blk) - docs.#{method}(*args, &blk) - end - " + # Override of normal respond_to? to match method_missing's logic for + # looking in @data. + def respond_to?(method, include_private = false) + docs.respond_to?(method.to_sym, include_private) || super + end + + # 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 "", "Called by #{caller.first}." + docs.public_send(method.to_sym, *args, &blck) + else + super + end end # Fetch the static files in this collection. diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 9dbc4cee..46ff7e86 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -431,5 +431,22 @@ module Jekyll def related_posts Jekyll::RelatedPosts.new(self).build end + + # Override of normal respond_to? to match method_missing's logic for + # looking in @data. + def respond_to?(method, include_private = false) + data.key?(method.to_s) || super + end + + # 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}." + data[method.to_s] + else + super + end + end end end diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 149a7a7a..45a20422 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -22,7 +22,7 @@ module Jekyll # Sorts posts, pages, and static files. def sort_files! - site.collections.values.each(&:sort!) + site.collections.values.each{|c| c.docs.sort!} site.pages.sort_by!(&:name) site.static_files.sort_by!(&:relative_path) end diff --git a/lib/jekyll/related_posts.rb b/lib/jekyll/related_posts.rb index f7dc0962..fbc2837b 100644 --- a/lib/jekyll/related_posts.rb +++ b/lib/jekyll/related_posts.rb @@ -14,7 +14,7 @@ module Jekyll end def build - return [] unless site.posts.size > 1 + return [] unless site.posts.docs.size > 1 if site.lsi build_index @@ -30,7 +30,7 @@ module Jekyll lsi = ClassifierReborn::LSI.new(:auto_rebuild => false) display("Populating LSI...") - site.posts.each do |x| + site.posts.docs.each do |x| lsi.add_item(x) end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 66bfd163..2384ea17 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -222,7 +222,7 @@ module Jekyll # 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.each { |p| p.data[post_attr].each { |t| hash[t] << p } } + posts.docs.each { |p| p.data[post_attr].each { |t| hash[t] << p } } hash.values.each { |posts| posts.sort!.reverse! } hash end @@ -265,7 +265,7 @@ module Jekyll "site" => Utils.deep_merge_hashes(config, Utils.deep_merge_hashes(Hash[collections.map{|label, coll| [label, coll.docs]}], { "time" => time, - "posts" => posts.sort { |a, b| b <=> a }, + "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?("/") }, @@ -333,7 +333,7 @@ module Jekyll end def each_site_file - %w(posts pages static_files docs_to_write).each do |type| + %w(pages static_files docs_to_write).each do |type| send(type).each do |item| yield item end From d9b12bc090aa0b275a764eabb0c8482ef7881f99 Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Mon, 26 Oct 2015 13:37:47 -0700 Subject: [PATCH 143/810] Disable incremental regeneration by default in Jekyll 3.0 Disable the feature as it's still not 100% working 100% of the time. Feature can be re-enabled by specifying `full_rebuild: false` in the configuration --- lib/jekyll/configuration.rb | 2 +- test/test_regenerator.rb | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index ee05e8bc..04f7dac2 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -22,7 +22,7 @@ module Jekyll 'keep_files' => ['.git','.svn'], 'encoding' => 'utf-8', 'markdown_ext' => 'markdown,mkdown,mkdn,mkd,md', - 'full_rebuild' => false, + 'full_rebuild' => true, # Filtering Content 'show_drafts' => nil, diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index 6e2ce477..d74c14d5 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -130,7 +130,8 @@ class TestRegenerator < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, - "destination" => dest_dir + "destination" => dest_dir, + "full_rebuild" => false })) @site.process From ef5e131f53843d656f30f04812890fbafd8acbac Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 13:56:35 -0700 Subject: [PATCH 144/810] Update history to reflect merge of #4058 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d91b9f0a..0985c2af 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ ### 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) From 2a040fd5278e6b5a8444a16968622f09c0429574 Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Mon, 26 Oct 2015 14:20:44 -0700 Subject: [PATCH 145/810] Rename incremental regeneration flag Rename from `full_rebuild` to disable, to `incremental` to enable --- Rakefile | 3 +-- features/incremental_rebuild.feature | 18 +++++++++--------- lib/jekyll/cleaner.rb | 2 +- lib/jekyll/command.rb | 2 +- lib/jekyll/commands/build.rb | 4 ++-- lib/jekyll/configuration.rb | 2 +- lib/jekyll/regenerator.rb | 2 +- lib/jekyll/site.rb | 4 ++-- script/rubyprof | 2 +- script/stackprof | 2 +- test/helper.rb | 2 +- test/test_regenerator.rb | 8 ++++---- test/test_site.rb | 10 +++++----- 13 files changed, 30 insertions(+), 31 deletions(-) diff --git a/Rakefile b/Rakefile index 98610a3c..fb177f16 100644 --- a/Rakefile +++ b/Rakefile @@ -209,8 +209,7 @@ namespace :site do Jekyll::Commands::Build.process({ "source" => File.expand_path("site"), "destination" => File.expand_path("gh-pages"), - "sass" => { "style" => "compressed" }, - "full_rebuild" => true + "sass" => { "style" => "compressed" } }) File.open('gh-pages/.nojekyll', 'wb') { |f| f.puts(":dog: food.") } diff --git a/features/incremental_rebuild.feature b/features/incremental_rebuild.feature index 08739d3e..fb95e0c5 100644 --- a/features/incremental_rebuild.feature +++ b/features/incremental_rebuild.feature @@ -10,26 +10,26 @@ Feature: Incremental rebuild | title | date | layout | content | | 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 + When I run jekyll build -I Then 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 + When I run jekyll build -I Then 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 Given I have an "index.html" file that contains "Basic Site" - When I run jekyll build + When I run jekyll build -I Then the ".jekyll-metadata" file should exist Scenario: Rebuild when content is changed Given I have an "index.html" file that contains "Basic Site" - When I run jekyll build + When I run jekyll build -I Then 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 + When I run jekyll build -I Then the _site directory should exist And I should see "Bacon Site" in "_site/index.html" @@ -37,12 +37,12 @@ Feature: Incremental rebuild Given I have a _layouts directory 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 + When I run jekyll build -I Then 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 --full-rebuild + When I run jekyll build Then the _site directory should exist And I should see "Page Layout Changed: Basic Site with Layout" in "_site/index.html" @@ -50,11 +50,11 @@ Feature: Incremental rebuild Given I have a _includes directory 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 + When I run jekyll build -I Then 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 + When I run jekyll build -I Then the _site directory should exist And I should see "Basic Site with include tag: Regenerated by Jekyll" in "_site/index.html" diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index 30c0a432..d23da78f 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -13,7 +13,7 @@ module Jekyll # Cleans up the site's destination directory def cleanup! FileUtils.rm_rf(obsolete_files) - FileUtils.rm_rf(metadata_file) if @site.full_rebuild? + FileUtils.rm_rf(metadata_file) if !@site.incremental? end private diff --git a/lib/jekyll/command.rb b/lib/jekyll/command.rb index a72640fb..f3c89dfd 100644 --- a/lib/jekyll/command.rb +++ b/lib/jekyll/command.rb @@ -60,7 +60,7 @@ module Jekyll 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 'full_rebuild', '-f', '--full-rebuild', 'Disable incremental rebuild.' + c.option 'incremental', '-I', '--incremental', 'Enable incremental rebuild.' end end diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb index b6db514d..de0cc8bc 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -52,10 +52,10 @@ module Jekyll t = Time.now source = options['source'] destination = options['destination'] - full_build = options['full_rebuild'] + incremental = options['incremental'] Jekyll.logger.info "Source:", source Jekyll.logger.info "Destination:", destination - Jekyll.logger.info "Incremental build:", (full_build ? "disabled" : "enabled") + 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." diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 04f7dac2..f57b3ae4 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -22,7 +22,6 @@ module Jekyll 'keep_files' => ['.git','.svn'], 'encoding' => 'utf-8', 'markdown_ext' => 'markdown,mkdown,mkdn,mkd,md', - 'full_rebuild' => true, # Filtering Content 'show_drafts' => nil, @@ -39,6 +38,7 @@ module Jekyll 'highlighter' => 'rouge', 'lsi' => false, 'excerpt_separator' => "\n\n", + 'incremental' => false, # Serving 'detach' => false, # default to not detaching the server diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 18b94f6b..911ca18b 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -144,7 +144,7 @@ module Jekyll # # Returns a Boolean (true for disabled, false for enabled). def disabled? - @disabled = site.full_rebuild? if @disabled.nil? + @disabled = !site.incremental? if @disabled.nil? @disabled end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 66bfd163..6859c2d6 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -351,8 +351,8 @@ module Jekyll # Whether to perform a full rebuild without incremental regeneration # # Returns a Boolean: true for a full rebuild, false for normal build - def full_rebuild?(override = {}) - override['full_rebuild'] || config['full_rebuild'] + def incremental?(override = {}) + override['incremental'] || config['incremental'] end # Returns the publisher or creates a new publisher if it doesn't diff --git a/script/rubyprof b/script/rubyprof index 520dc86e..18c5777b 100755 --- a/script/rubyprof +++ b/script/rubyprof @@ -2,7 +2,7 @@ export BENCHMARK=1 -TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site', 'full_rebuild' => true})" +TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})" RUBY=$(cat < /dev/null || script/bootstrap -TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site', 'full_rebuild' => true})" +TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})" PROF_OUTPUT_FILE=tmp/stackprof-$(date +%Y%m%d%H%M).dump test -f "$PROF_OUTPUT_FILE" || { diff --git a/test/helper.rb b/test/helper.rb index 16f015b7..dc021767 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -74,7 +74,7 @@ class JekyllUnitTest < Minitest::Test def site_configuration(overrides = {}) full_overrides = build_configs(overrides, build_configs({ "destination" => dest_dir, - "full_rebuild" => true + "incremental" => false })) build_configs({ "source" => source_dir diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index d74c14d5..ebd30aec 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -11,7 +11,7 @@ class TestRegenerator < JekyllUnitTest "output" => true } }, - "full_rebuild" => false + "incremental" => true }) @site.read @@ -94,7 +94,7 @@ class TestRegenerator < JekyllUnitTest FileUtils.rm_rf(source_dir(".jekyll-metadata")) @site = fixture_site({ - "full_rebuild" => false + "incremental" => true }) @site.read @@ -131,7 +131,7 @@ class TestRegenerator < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "full_rebuild" => false + "incremental" => true })) @site.process @@ -297,7 +297,7 @@ class TestRegenerator < JekyllUnitTest end should "regenerate everything if metadata is disabled" do - @site.config["full_rebuild"] = true + @site.config["incremental"] = false @regenerator.clear @regenerator.add(@path) @regenerator.write_metadata diff --git a/test/test_site.rb b/test/test_site.rb index 811d79d0..66f1408d 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -330,7 +330,7 @@ class TestSite < JekyllUnitTest end bad_processor = "Custom::Markdown" - s = Site.new(site_configuration('markdown' => bad_processor, 'full_rebuild' => true)) + s = Site.new(site_configuration('markdown' => bad_processor, 'incremental' => false)) assert_raises Jekyll::Errors::FatalException do s.process end @@ -348,7 +348,7 @@ class TestSite < JekyllUnitTest should 'throw FatalException at process time' do bad_processor = 'not a processor name' - s = Site.new(site_configuration('markdown' => bad_processor, 'full_rebuild' => true)) + s = Site.new(site_configuration('markdown' => bad_processor, 'incremental' => false)) assert_raises Jekyll::Errors::FatalException do s.process end @@ -429,7 +429,7 @@ class TestSite < JekyllUnitTest context "manipulating the Jekyll environment" do setup do @site = Site.new(site_configuration({ - 'full_rebuild' => true + 'incremental' => false })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } @@ -443,7 +443,7 @@ class TestSite < JekyllUnitTest setup do ENV["JEKYLL_ENV"] = "production" @site = Site.new(site_configuration({ - 'full_rebuild' => true + 'incremental' => false })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } @@ -473,7 +473,7 @@ class TestSite < JekyllUnitTest context "incremental build" do setup do @site = Site.new(site_configuration({ - 'full_rebuild' => false + 'incremental' => true })) @site.read end From afd1c21af495a782c6476460fd041b6052c27676 Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Mon, 26 Oct 2015 14:21:07 -0700 Subject: [PATCH 146/810] Add `incremental` configuration option to docs --- site/_docs/configuration.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index ffbef8a4..2bb65e82 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -268,6 +268,21 @@ class="flag">flags (specified on the command-line) that control them.

    -q, --quiet

    + + +

    Incremental build

    +

    + Enable the experimental incremental build feature. Incremental build only + re-builds posts and pages that have changed, resulting in significant performance + improvements for large sites, but may also break site generation in certain + cases. +

    + + +

    incremental: BOOL

    +

    -I, --incremental

    + +
  • @@ -534,6 +549,7 @@ markdown: kramdown highlighter: rouge lsi: false excerpt_separator: "\n\n" +incremental: false # Serving detach: false From 6bcef622f55ebae08d56163a5a5ac2e81033d85e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 14:41:40 -0700 Subject: [PATCH 147/810] Update history to reflect merge of #4059 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0985c2af..d52af819 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * Adapt StaticFile for collections, config defaults (#3823) * Add a Code of Conduct for the Jekyll project (#3925) * Added permalink time variables (#3990) + * Add `--increment` flag to enable incremental regen (disabled by default) (#4059) ### Minor Enhancements From 05ba1afc29d595835b82db571a11bdd51eba4ad0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 14:42:03 -0700 Subject: [PATCH 148/810] Release :gem: v3.0.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 5970bff1..cb22ddb8 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.0.0.pre.beta10' + VERSION = '3.0.0.pre.rc1' end From 79c33af3fc8966cce2ecd4343d2952ba0ca5d468 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 14:43:53 -0700 Subject: [PATCH 150/810] post_url: fix access deprecation warning & fix deprecation msg --- lib/jekyll/tags/post_url.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index 2d3e8f44..5b0d6479 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -59,7 +59,7 @@ eos def render(context) site = context.registers[:site] - site.posts.each do |p| + site.posts.docs.each do |p| if @post == p return p.url end @@ -68,9 +68,9 @@ eos # New matching method did not match, fall back to old method # with deprecation warning if this matches - site.posts.each do |p| + site.posts.docs.each do |p| if @post.deprecated_equality p - Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{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." From 5e425a99b4b808589d452a6e6db16e97734050b7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 15:37:14 -0700 Subject: [PATCH 151/810] Update history to reflect merge of #4060 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d52af819..11226d73 100644 --- a/History.markdown +++ b/History.markdown @@ -99,6 +99,7 @@ ### 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) From e45b6f91e79010663c840ef8ca96a1548179af5d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 16:08:19 -0700 Subject: [PATCH 152/810] Document: Only auto-generate the excerpt if it's not overridden Fixes #4061 --- 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 46ff7e86..00a0ca7a 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -307,7 +307,7 @@ module Jekyll populate_tags if generate_excerpt? - data['excerpt'] = Jekyll::Excerpt.new(self) + data['excerpt'] ||= Jekyll::Excerpt.new(self) end end From f8dbbb12880a6e857d9e4729a3447a049a9188fa Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 16:16:36 -0700 Subject: [PATCH 153/810] Clean History.markdown a teensy bit. [ci skip] --- History.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/History.markdown b/History.markdown index 11226d73..65f87192 100644 --- a/History.markdown +++ b/History.markdown @@ -22,7 +22,7 @@ * Adapt StaticFile for collections, config defaults (#3823) * Add a Code of Conduct for the Jekyll project (#3925) * Added permalink time variables (#3990) - * Add `--increment` flag to enable incremental regen (disabled by default) (#4059) + * Add `--incremental` flag to enable incremental regen (disabled by default) (#4059) ### Minor Enhancements @@ -62,7 +62,6 @@ * Added build --destination and --source flags (#3418) * Site template: remove unused `page.meta` attribute (#3537) * Improve the error message when sorting null objects (#3520) - * Add jekyll-smartify plugin (#3572) * Added liquid-md5 plugin (#3598) * Documentation: RR replaced with RSpec Mocks (#3600) * Documentation: Fix subpath. (#3599) @@ -274,6 +273,7 @@ * 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 From 170d6de8d9ec73186bd3f09370d87d7aedd5fe36 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 16:30:48 -0700 Subject: [PATCH 154/810] Update history to reflect merge of #4062 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 65f87192..95757bf6 100644 --- a/History.markdown +++ b/History.markdown @@ -146,6 +146,7 @@ * 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) ### Development Fixes From 45f69bb8cdf1050ea6c35da837e42dd9e0d8eda7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 17:27:26 -0700 Subject: [PATCH 155/810] Utils: deep_merge_hashes should also merge default_proc If the target hash's default_proc isn't set, overwrite with the new hash's default_proc. /cc #4064 --- lib/jekyll/utils.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 86d24cef..c30a986a 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -34,6 +34,10 @@ module Jekyll target[key] = overwrite[key] end + if target.default_proc.nil? + target.default_proc = overwrite.default_proc + end + target end From 7b81f00137fb4a9be98591006dbaa6e43727b3c3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 17:28:20 -0700 Subject: [PATCH 156/810] Defaults: compare paths in applies_path? as Strings to avoid confusion /cc #4064 --- 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 160e6bec..d6cb173f 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -87,7 +87,7 @@ module Jekyll scope_path = Pathname.new(scope['path']) Pathname.new(sanitize_path(path)).ascend do |path| - if path == scope_path + if path.to_s == scope_path.to_s return true end end From 12225f49eaed047a81ac4225aaa22adfe131d126 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 17:31:00 -0700 Subject: [PATCH 157/810] Update History to reflect 45f69bb and 7b81f00 [ci skip] --- History.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/History.markdown b/History.markdown index 95757bf6..5059d172 100644 --- a/History.markdown +++ b/History.markdown @@ -147,6 +147,8 @@ * 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 From 2ca9329a8d9c80bbd0a0a8b43ae30bc9a53f2157 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 16:13:11 -0700 Subject: [PATCH 158/810] Add 3.0 release post. [ci skip] --- .../2015-10-26-jekyll-3-0-released.markdown | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 site/_posts/2015-10-26-jekyll-3-0-released.markdown diff --git a/site/_posts/2015-10-26-jekyll-3-0-released.markdown b/site/_posts/2015-10-26-jekyll-3-0-released.markdown new file mode 100644 index 00000000..28acaeb5 --- /dev/null +++ b/site/_posts/2015-10-26-jekyll-3-0-released.markdown @@ -0,0 +1,35 @@ +--- +layout: news_item +title: 'Jekyll 3.0 Released' +date: 2015-10-26 15:37:30 -0700 +author: parkr +version: 3.0 +categories: [release] +--- + +The much-anticipated Jekyll 3.0 has been released! Key changes: + +- Incremental regeneration (experimental, enable with `--incremental`) +- Liquid profiler (add `--profile` to a build or serve) +- Hook plugin API (no more monkey-patching!) +- Dependencies reduced from 14 to 8, none contain C extensions. We're hoping to reduce this even more in the future. +- Changed version support: no support for Ruby 1.9.3, added basic JRuby support. Better Windows support. +- Extension-less URLs +- `site.collections` is an array of collections, thus: + - `collection[0]` becomes `collection.label` + - `collection[1]` becomes `collection` +- Default highlighter is now Rouge instead of Pygments +- 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. + +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. + +We also added [Jekyll Talk](https://talk.jekyllrb.com), managed solely by Jordon, which offers a modern forum experience for Jekyllers across the globe to talk and learn about Jekyll! + +As always, check out the [full history](/docs/history/#v3.0.0) for more details. + +Our contributors are the core of what makes Jekyll great! Many thanks to the 132 contributors who made this release possible (in alphabetical order): AJ Acevedo, Adam Richeimer, Alan Scherger, Alfred Xing, Anatol Broder, Andrew Dunning, Anna Debenham, Anton, Arne Gockeln, Arthur Hammer, Arthur Neves, BRAVO, Ben Balter, Bernardo Dias, BigBlueHat, Brandon Mathis, Bruce Smith, Cai⚡️, Carlos Matallín, ChaYoung You, Christian Vuerings, Cory Simmons, David Herman, David Silva Smith, David Smith, David Wales, David Williamson, DigitalSparky, Dimitri König, Dominik, Eduardo Boucas, Eduardo Bouças, Eduardo Bouças, Erlend Sogge Heggen, Eugene Pirogov, Ezmyrelda Andrade, Fabian Rodriguez, Fabian Tamp, Fabio Niephaus, Falko Richter, Florian Weingarten, Fonso, Garen Torikian, Guillaume LARIVIERE, Günter Kits, I´m a robot, Jason Ly, Jedd Ahyoung, Jensen Kuras, Jesse Pinho, Jesse W, Jim Meyer, Joel Glovier, Johan Bové, Joop Aué, Jordan Thornquest, Jordon Bedwell, Joseph Anderson, Julien Bourdeau, Justin Weiss, Kamil Dziemianowicz, Kevin Locke, Kevin Ushey, Leonard, Lukas, Mads Ohm Larsen, Malo Skrylevo, Marcus Stollsteimer, Mark Phelps, Mark Tareshawty, Martijn den Hoedt, Martin Jorn Rogalla, Martin Rogalla, Matt Rogers, Matt Sheehan, Matthias Nuessler, Max, Max Beizer, Max White, Merlos, Michael Giuffrida, Michael Tu, Mike Bland, Mike Callan, MonsieurV, Nate Berkopec, Neil Faccly, Nic West, Nicholas Burlett, Nicolas Hoizey, Parker Moore, Pascal Borreli, Pat Hawks, Paul Rayner, Pedro Euko, Peter Robins, Philipp Rudloff, Philippe Loctaux, Rafael Picanço, Renaud Martinet, Robert Papp, Ryan Burnette, Ryan Tomayko, Seb, Seth Warburton, Shannon, Stephen Crosby, Stuart Kent, Suriyaa Kudo, Sylvester Keil, Tanguy Krotoff, Toddy69, Tom Johnson, Tony Eichelberger, Tunghsiao Liu, Veres Lajos, Vitaly Repin, Will Norris, William Entriken, XhmikosR, chrisfinazzo, eksperimental, hartmel, jaybe@jekyll, kaatt, nightsense, nitoyon, robschia, schneems, sonnym, takuti, and tasken. + +Happy Jekylling! From 5082e144d881948fbe7bb40b5a0d362dd791da42 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 20:22:28 -0700 Subject: [PATCH 159/810] Release :gem: 3.0.0.pre.rc1 --- History.markdown | 2 +- lib/jekyll/version.rb | 2 +- site/_docs/history.md | 287 ++++++++++++++++++ .../2015-10-26-jekyll-3-0-released.markdown | 2 +- 4 files changed, 290 insertions(+), 3 deletions(-) diff --git a/History.markdown b/History.markdown index 5059d172..f5dfc16d 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,4 @@ -## HEAD +## 3.0.0 / 2015-10-26 ### Major Enhancements diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index cb22ddb8..91ee762b 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.0.0.pre.rc1' + VERSION = '3.0.0' end diff --git a/site/_docs/history.md b/site/_docs/history.md index 346dc131..7447f334 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -4,6 +4,293 @@ title: History permalink: "/docs/history/" --- +## 3.0.0 / 2015-10-26 +{: #v3-0-0} + +### Major Enhancements +{: #major-enhancements-v3-0-0} + +- Liquid profiler (i.e. know how fast or slow your templates render) ([#3762]({{ site.repository }}/issues/3762)) +- Incremental regeneration ([#3116]({{ site.repository }}/issues/3116)) +- Add Hooks: a new kind of plugin ([#3553]({{ site.repository }}/issues/3553)) +- Upgrade to Liquid 3.0.0 ([#3002]({{ site.repository }}/issues/3002)) +- `site.posts` is now a Collection instead of an Array ([#4055]({{ site.repository }}/issues/4055)) +- Add basic support for JRuby (commit: 0f4477) +- Drop support for Ruby 1.9.3. ([#3235]({{ site.repository }}/issues/3235)) +- Support Ruby v2.2 ([#3234]({{ site.repository }}/issues/3234)) +- Support RDiscount 2 ([#2767]({{ site.repository }}/issues/2767)) +- Remove most runtime deps ([#3323]({{ site.repository }}/issues/3323)) +- Move to Rouge as default highlighter ([#3323]({{ site.repository }}/issues/3323)) +- Mimic GitHub Pages `.html` extension stripping behavior in WEBrick ([#3452]({{ site.repository }}/issues/3452)) +- Always include file extension on output files ([#3490]({{ site.repository }}/issues/3490)) +- Improved permalinks for pages and collections ([#3538]({{ site.repository }}/issues/3538)) +- Sunset (i.e. remove) Maruku ([#3655]({{ site.repository }}/issues/3655)) +- Remove support for relative permalinks ([#3679]({{ site.repository }}/issues/3679)) +- Iterate over `site.collections` as an array instead of a hash. ([#3670]({{ site.repository }}/issues/3670)) +- Adapt StaticFile for collections, config defaults ([#3823]({{ site.repository }}/issues/3823)) +- Add a Code of Conduct for the Jekyll project ([#3925]({{ site.repository }}/issues/3925)) +- Added permalink time variables ([#3990]({{ site.repository }}/issues/3990)) +- Add `--incremental` flag to enable incremental regen (disabled by default) ([#4059]({{ site.repository }}/issues/4059)) + +### Minor Enhancements +{: #minor-enhancements-v3-0-0} + +- Deprecate access to Document#data properties and Collection#docs methods ([#4058]({{ site.repository }}/issues/4058)) +- Sort static files just once, and call `site_payload` once for all collections ([#3204]({{ site.repository }}/issues/3204)) +- Separate `jekyll docs` and optimize external gem handling ([#3241]({{ site.repository }}/issues/3241)) +- Improve `Site#getConverterImpl` and call it `Site#find_converter_instance` ([#3240]({{ site.repository }}/issues/3240)) +- Use relative path for `path` Liquid variable in Documents for consistency ([#2908]({{ site.repository }}/issues/2908)) +- Generalize `Utils#slugify` for any scripts ([#3047]({{ site.repository }}/issues/3047)) +- Added basic microdata to post template in site template ([#3189]({{ site.repository }}/issues/3189)) +- Store log messages in an array of messages. ([#3244]({{ site.repository }}/issues/3244)) +- Allow collection documents to override `output` property in front matter ([#3172]({{ site.repository }}/issues/3172)) +- Keep file modification times between builds for static files ([#3220]({{ site.repository }}/issues/3220)) +- Only downcase mixed-case categories for the URL ([#2571]({{ site.repository }}/issues/2571)) +- Added per post `excerpt_separator` functionality ([#3274]({{ site.repository }}/issues/3274)) +- Allow collections YAML to end with three dots ([#3134]({{ site.repository }}/issues/3134)) +- Add mode parameter to `slugify` Liquid filter ([#2918]({{ site.repository }}/issues/2918)) +- 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)) +- 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)) +- Add `pkill -f jekyll` to ways to kill. ([#3397]({{ site.repository }}/issues/3397)) +- Site template: collapsed, variable-driven font declaration ([#3360]({{ site.repository }}/issues/3360)) +- Site template: Don't always show the scrollbar in code blocks ([#3419]({{ site.repository }}/issues/3419)) +- Site template: Remove undefined `text` class from `p` element ([#3440]({{ site.repository }}/issues/3440)) +- Site template: Optimize text rendering for legibility ([#3382]({{ site.repository }}/issues/3382)) +- Add `draft?` method to identify if Post is a Draft & expose to Liquid ([#3456]({{ site.repository }}/issues/3456)) +- Write regeneration metadata even on full rebuild ([#3464]({{ site.repository }}/issues/3464)) +- Perf: Use `String#end_with?("/")` instead of regexp when checking paths ([#3516]({{ site.repository }}/issues/3516)) +- Docs: document 'ordinal' built-in permalink style ([#3532]({{ site.repository }}/issues/3532)) +- Upgrade liquid-c to 3.x ([#3531]({{ site.repository }}/issues/3531)) +- Use consistent syntax for deprecation warning ([#3535]({{ site.repository }}/issues/3535)) +- Added build --destination and --source flags ([#3418]({{ site.repository }}/issues/3418)) +- Site template: remove unused `page.meta` attribute ([#3537]({{ site.repository }}/issues/3537)) +- Improve the error message when sorting null objects ([#3520]({{ site.repository }}/issues/3520)) +- Added liquid-md5 plugin ([#3598]({{ site.repository }}/issues/3598)) +- Documentation: RR replaced with RSpec Mocks ([#3600]({{ site.repository }}/issues/3600)) +- Documentation: Fix subpath. ([#3599]({{ site.repository }}/issues/3599)) +- Create 'tmp' dir for test_tags if it doesn't exist ([#3609]({{ site.repository }}/issues/3609)) +- Extract reading of data from `Site` to reduce responsibilities. ([#3545]({{ site.repository }}/issues/3545)) +- Removed the word 'Jekyll' a few times from the comments ([#3617]({{ site.repository }}/issues/3617)) +- `bin/jekyll`: with no args, exit with exit code 1 ([#3619]({{ site.repository }}/issues/3619)) +- Incremental build if destination file missing ([#3614]({{ site.repository }}/issues/3614)) +- Static files `mtime` liquid should return a `Time` obj ([#3596]({{ site.repository }}/issues/3596)) +- Use `Jekyll::Post`s for both LSI indexing and lookup. ([#3629]({{ site.repository }}/issues/3629)) +- Add `charset=utf-8` for HTML and XML pages in WEBrick ([#3649]({{ site.repository }}/issues/3649)) +- 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)) +- 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)) +- Performance: Sort files only once ([#3707]({{ site.repository }}/issues/3707)) +- Performance: Marshal metadata ([#3706]({{ site.repository }}/issues/3706)) +- Upgrade highlight wrapper from `div` to `figure` ([#3779]({{ site.repository }}/issues/3779)) +- Upgrade mime-types to `~> 2.6` ([#3795]({{ site.repository }}/issues/3795)) +- Update windows.md with Ruby version info ([#3818]({{ site.repository }}/issues/3818)) +- Make the directory for includes configurable ([#3782]({{ site.repository }}/issues/3782)) +- Rename directory configurations to match `*_dir` convention for consistency ([#3782]({{ site.repository }}/issues/3782)) +- Internal: trigger hooks by owner symbol ([#3871]({{ site.repository }}/issues/3871)) +- Update MIME types from mime-db ([#3933]({{ site.repository }}/issues/3933)) +- Add header to site template `_config.yml` for clarity & direction ([#3997]({{ site.repository }}/issues/3997)) +- Site template: add timezone offset to post date frontmatter ([#4001]({{ site.repository }}/issues/4001)) +- Make a constant for the regex to find hidden files ([#4032]({{ site.repository }}/issues/4032)) +- Site template: refactor github & twitter icons into includes ([#4049]({{ site.repository }}/issues/4049)) +- Site template: add background to Kramdown Rouge-ified backtick code blocks ([#4053]({{ site.repository }}/issues/4053)) + +### Bug Fixes +{: #bug-fixes-v3-0-0} + +- `post_url`: fix access deprecation warning & fix deprecation msg ([#4060]({{ site.repository }}/issues/4060)) +- Perform jekyll-paginate deprecation warning correctly. ([#3580]({{ site.repository }}/issues/3580)) +- Make permalink parsing consistent with pages ([#3014]({{ site.repository }}/issues/3014)) +- `time()`pre-filter method should accept a `Date` object ([#3299]({{ site.repository }}/issues/3299)) +- Remove unneeded end tag for `link` in site template ([#3236]({{ site.repository }}/issues/3236)) +- Kramdown: Use `enable_coderay` key instead of `use_coderay` ([#3237]({{ site.repository }}/issues/3237)) +- Unescape `Document` output path ([#2924]({{ site.repository }}/issues/2924)) +- Fix nav items alignment when on multiple rows ([#3264]({{ site.repository }}/issues/3264)) +- Highlight: Only Strip Newlines/Carriage Returns, not Spaces ([#3278]({{ site.repository }}/issues/3278)) +- Find variables in front matter defaults by searching with relative file path. ([#2774]({{ site.repository }}/issues/2774)) +- Allow variables (e.g `:categories`) in YAML front matter permalinks ([#3320]({{ site.repository }}/issues/3320)) +- Handle nil URL placeholders in permalinks ([#3325]({{ site.repository }}/issues/3325)) +- Template: Fix nav items alignment when in "burger" mode ([#3329]({{ site.repository }}/issues/3329)) +- Template: Remove `!important` from nav SCSS introduced in [#3329]({{ site.repository }}/issues/3329) ([#3375]({{ site.repository }}/issues/3375)) +- The `:title` URL placeholder for collections should be the filename slug. ([#3383]({{ site.repository }}/issues/3383)) +- Trim the generate time diff to just 3 places past the decimal place ([#3415]({{ site.repository }}/issues/3415)) +- The highlight tag should only clip the newlines before and after the *entire* block, not in between ([#3401]({{ site.repository }}/issues/3401)) +- highlight: fix problem with linenos and rouge. ([#3436]({{ site.repository }}/issues/3436)) +- `Site#read_data_file`: read CSV's with proper file encoding ([#3455]({{ site.repository }}/issues/3455)) +- Ignore `.jekyll-metadata` in site template ([#3496]({{ site.repository }}/issues/3496)) +- Template: Point documentation link to the documentation pages ([#3502]({{ site.repository }}/issues/3502)) +- Removed the trailing slash from the example `/blog` baseurl comment ([#3485]({{ site.repository }}/issues/3485)) +- Clear the regenerator cache every time we process ([#3592]({{ site.repository }}/issues/3592)) +- Readd (bring back) minitest-profile ([#3628]({{ site.repository }}/issues/3628)) +- Add WOFF2 font MIME type to Jekyll server MIME types ([#3647]({{ site.repository }}/issues/3647)) +- Be smarter about extracting the extname in `StaticFile` ([#3632]({{ site.repository }}/issues/3632)) +- Process metadata for all dependencies ([#3608]({{ site.repository }}/issues/3608)) +- Show error message if the YAML front matter on a page/post is invalid. ([#3643]({{ site.repository }}/issues/3643)) +- Upgrade redcarpet to 3.2 (Security fix: OSVDB-120415) ([#3652]({{ site.repository }}/issues/3652)) +- Create #mock_expects that goes directly to RSpec Mocks. ([#3658]({{ site.repository }}/issues/3658)) +- Open `.jekyll-metadata` in binary mode to read binary Marshal data ([#3713]({{ site.repository }}/issues/3713)) +- Incremental regeneration: handle deleted, renamed, and moved dependencies ([#3717]({{ site.repository }}/issues/3717)) +- Fix typo on line 19 of pagination.md ([#3760]({{ site.repository }}/issues/3760)) +- Fix it so that 'blog.html' matches 'blog.html' ([#3732]({{ site.repository }}/issues/3732)) +- Remove occasionally-problematic `ensure` in `LiquidRenderer` ([#3811]({{ site.repository }}/issues/3811)) +- Fixed an unclear code comment in site template SCSS ([#3837]({{ site.repository }}/issues/3837)) +- Fix reading of binary metadata file ([#3845]({{ site.repository }}/issues/3845)) +- Remove var collision with site template header menu iteration variable ([#3838]({{ site.repository }}/issues/3838)) +- Change non-existent `hl_linenos` to `hl_lines` to allow passthrough in safe mode ([#3787]({{ site.repository }}/issues/3787)) +- Add missing flag to disable the watcher ([#3820]({{ site.repository }}/issues/3820)) +- Update CI guide to include more direct explanations of the flow ([#3891]({{ site.repository }}/issues/3891)) +- Set `future` to `false` in the default config ([#3892]({{ site.repository }}/issues/3892)) +- filters: `where` should compare stringified versions of input & comparator ([#3935]({{ site.repository }}/issues/3935)) +- Read build options for `jekyll clean` command ([#3828]({{ site.repository }}/issues/3828)) +- Fix [#3970]({{ site.repository }}/issues/3970): Use Gem::Version to compare versions, not `>`. +- Abort if no subcommand. Fixes confusing message. ([#3992]({{ site.repository }}/issues/3992)) +- Whole-post excerpts should match the post content ([#4004]({{ site.repository }}/issues/4004)) +- Change default font weight to 400 to fix bold/strong text issues ([#4050]({{ site.repository }}/issues/4050)) +- Document: Only auto-generate the excerpt if it's not overridden ([#4062]({{ site.repository }}/issues/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 +{: #development-fixes-v3-0-0} + +- Remove loader.rb and "modernize" `script/test`. ([#3574]({{ site.repository }}/issues/3574)) +- Improve the grammar in the documentation ([#3233]({{ site.repository }}/issues/3233)) +- Update the LICENSE text to match the MIT license exactly ([#3253]({{ site.repository }}/issues/3253)) +- Update rake task `site:publish` to fix minor bugs. ([#3254]({{ site.repository }}/issues/3254)) +- Switch to shields.io for the README badges. ([#3255]({{ site.repository }}/issues/3255)) +- Use `FileList` instead of `Dir.glob` in `site:publish` rake task ([#3261]({{ site.repository }}/issues/3261)) +- Fix test script to be platform-independent ([#3279]({{ site.repository }}/issues/3279)) +- Instead of symlinking `/tmp`, create and symlink a local `tmp` in the tests ([#3258]({{ site.repository }}/issues/3258)) +- Fix some spacing ([#3312]({{ site.repository }}/issues/3312)) +- Fix comment typo in `lib/jekyll/frontmatter_defaults.rb` ([#3322]({{ site.repository }}/issues/3322)) +- Move all `regenerate?` checking to `Regenerator` ([#3326]({{ site.repository }}/issues/3326)) +- Factor out a `read_data_file` call to keep things clean ([#3380]({{ site.repository }}/issues/3380)) +- Proof the site with CircleCI. ([#3427]({{ site.repository }}/issues/3427)) +- Update LICENSE to 2015. ([#3477]({{ site.repository }}/issues/3477)) +- Upgrade tests to use Minitest ([#3492]({{ site.repository }}/issues/3492)) +- Remove trailing whitespace ([#3497]({{ site.repository }}/issues/3497)) +- Use `fixture_site` for Document tests ([#3511]({{ site.repository }}/issues/3511)) +- Remove adapters deprecation warning ([#3529]({{ site.repository }}/issues/3529)) +- Minor fixes to `url.rb` to follow GitHub style guide ([#3544]({{ site.repository }}/issues/3544)) +- Minor changes to resolve deprecation warnings ([#3547]({{ site.repository }}/issues/3547)) +- Convert remaining textile test documents to markdown ([#3528]({{ site.repository }}/issues/3528)) +- Migrate the tests to use rspec-mocks ([#3552]({{ site.repository }}/issues/3552)) +- Remove `activesupport` ([#3612]({{ site.repository }}/issues/3612)) +- Added tests for `Jekyll:StaticFile` ([#3633]({{ site.repository }}/issues/3633)) +- Force minitest version to 5.5.1 ([#3657]({{ site.repository }}/issues/3657)) +- Update the way cucumber accesses Minitest assertions ([#3678]({{ site.repository }}/issues/3678)) +- Add `script/rubyprof` to generate cachegrind callgraphs ([#3692]({{ site.repository }}/issues/3692)) +- Upgrade cucumber to 2.x ([#3795]({{ site.repository }}/issues/3795)) +- Update Kramdown. ([#3853]({{ site.repository }}/issues/3853)) +- Updated the scripts shebang for portability ([#3858]({{ site.repository }}/issues/3858)) +- Update JRuby testing to 9K ([3ab386f](https://github.com/jekyll/jekyll/commit/3ab386f1b096be25a24fe038fc70fd0fb08d545d)) +- Organize dependencies into dev and test groups. ([#3852]({{ site.repository }}/issues/3852)) +- Contributing.md should refer to `script/cucumber` ([#3894]({{ site.repository }}/issues/3894)) +- Update contributing documentation to reflect workflow updates ([#3895]({{ site.repository }}/issues/3895)) +- Add script to vendor mime types ([#3933]({{ site.repository }}/issues/3933)) +- Ignore .bundle dir in SimpleCov ([#4033]({{ site.repository }}/issues/4033)) + +### Site Enhancements +{: #site-enhancements-v3-0-0} + +- Add 'info' labels to certain notes in collections docs ([#3601]({{ site.repository }}/issues/3601)) +- Remove extra spaces, make the last sentence less awkward in permalink docs ([#3603]({{ site.repository }}/issues/3603)) +- Update the permalinks documentation to reflect the updates for 3.0 ([#3556]({{ site.repository }}/issues/3556)) +- Add blog post announcing Jekyll Help ([#3523]({{ site.repository }}/issues/3523)) +- Add Jekyll Talk to Help page on site ([#3518]({{ site.repository }}/issues/3518)) +- Change Ajax pagination resource link to use HTTPS ([#3570]({{ site.repository }}/issues/3570)) +- Fixing the default host on docs ([#3229]({{ site.repository }}/issues/3229)) +- Add `jekyll-thumbnail-filter` to list of third-party plugins ([#2790]({{ site.repository }}/issues/2790)) +- Add link to 'Adding Ajax pagination to Jekyll' to Resources page ([#3186]({{ site.repository }}/issues/3186)) +- Add a Resources link to tutorial on building dynamic navbars ([#3185]({{ site.repository }}/issues/3185)) +- Semantic structure improvements to the post and page layouts ([#3251]({{ site.repository }}/issues/3251)) +- Add new AsciiDoc plugin to list of third-party plugins. ([#3277]({{ site.repository }}/issues/3277)) +- Specify that all transformable collection documents must contain YAML front matter ([#3271]({{ site.repository }}/issues/3271)) +- Assorted accessibility fixes ([#3256]({{ site.repository }}/issues/3256)) +- Update configuration docs to mention `keep_files` for `destination` ([#3288]({{ site.repository }}/issues/3288), [#3296]({{ site.repository }}/issues/3296)) +- Break when we successfully generate nav link to save CPU cycles. ([#3291]({{ site.repository }}/issues/3291)) +- Update usage docs to mention `keep_files` and a warning about `destination` cleaning ([#3295]({{ site.repository }}/issues/3295)) +- Add logic to automatically generate the `next_section` and `prev_section` navigation items ([#3292]({{ site.repository }}/issues/3292)) +- Some small fixes for the Plugins TOC. ([#3306]({{ site.repository }}/issues/3306)) +- Added versioning comment to configuration file ([#3314]({{ site.repository }}/issues/3314)) +- Add `jekyll-minifier` to list of third-party plugins ([#3333]({{ site.repository }}/issues/3333)) +- Add blog post about the Jekyll meet-up ([#3332]({{ site.repository }}/issues/3332)) +- Use `highlight` Liquid tag instead of the four-space tabs for code ([#3336]({{ site.repository }}/issues/3336)) +- 3.0.0.beta1 release post ([#3346]({{ site.repository }}/issues/3346)) +- Add `twa` to the list of third-party plugins ([#3384]({{ site.repository }}/issues/3384)) +- Remove extra spaces ([#3388]({{ site.repository }}/issues/3388)) +- Fix small grammar errors on a couple pages ([#3396]({{ site.repository }}/issues/3396)) +- Fix typo on Templates docs page ([#3420]({{ site.repository }}/issues/3420)) +- s/three/four for plugin type list ([#3424]({{ site.repository }}/issues/3424)) +- Release jekyllrb.com as a locally-compiled site. ([#3426]({{ site.repository }}/issues/3426)) +- Add a jekyllrb.com/help page which elucidates places from which to get help ([#3428]({{ site.repository }}/issues/3428)) +- Remove extraneous dash on Plugins doc page which caused a formatting error ([#3431]({{ site.repository }}/issues/3431)) +- Fix broken link to Jordan Thornquest's website. ([#3438]({{ site.repository }}/issues/3438)) +- Change the link to an extension ([#3457]({{ site.repository }}/issues/3457)) +- Fix Twitter link on the help page ([#3466]({{ site.repository }}/issues/3466)) +- Fix wording in code snippet highlighting section ([#3475]({{ site.repository }}/issues/3475)) +- Add a `/` to `paginate_path` in the Pagination documentation ([#3479]({{ site.repository }}/issues/3479)) +- Add a link on all the docs pages to "Improve this page". ([#3510]({{ site.repository }}/issues/3510)) +- Add jekyll-auto-image generator to the list of third-party plugins ([#3489]({{ site.repository }}/issues/3489)) +- Replace link to the proposed `picture` element spec ([#3530]({{ site.repository }}/issues/3530)) +- Add frontmatter date formatting information ([#3469]({{ site.repository }}/issues/3469)) +- Improve consistency and clarity of plugins options note ([#3546]({{ site.repository }}/issues/3546)) +- Add permalink warning to pagination docs ([#3551]({{ site.repository }}/issues/3551)) +- Fix grammar in Collections docs API stability warning ([#3560]({{ site.repository }}/issues/3560)) +- Restructure `excerpt_separator` documentation for clarity ([#3550]({{ site.repository }}/issues/3550)) +- Fix accidental line break in collections docs ([#3585]({{ site.repository }}/issues/3585)) +- Add information about the `.jekyll-metadata` file ([#3597]({{ site.repository }}/issues/3597)) +- Document addition of variable parameters to an include ([#3581]({{ site.repository }}/issues/3581)) +- Add `jekyll-files` to the list of third-party plugins. ([#3586]({{ site.repository }}/issues/3586)) +- Define the `install` step in the CI example `.travis.yml` ([#3622]({{ site.repository }}/issues/3622)) +- Expand collections documentation. ([#3638]({{ site.repository }}/issues/3638)) +- Add the "warning" note label to excluding `vendor` in the CI docs page ([#3623]({{ site.repository }}/issues/3623)) +- Upgrade pieces of the Ugrading guide for Jekyll 3 ([#3607]({{ site.repository }}/issues/3607)) +- Showing how to access specific data items ([#3468]({{ site.repository }}/issues/3468)) +- Clarify pagination works from within HTML files ([#3467]({{ site.repository }}/issues/3467)) +- Add note to `excerpt_separator` documentation that it can be set globally ([#3667]({{ site.repository }}/issues/3667)) +- Fix some names on Troubleshooting page ([#3683]({{ site.repository }}/issues/3683)) +- Add `remote_file_content` tag plugin to list of third-party plugins ([#3691]({{ site.repository }}/issues/3691)) +- Update the Redcarpet version on the Configuration page. ([#3743]({{ site.repository }}/issues/3743)) +- Update the link in the welcome post to point to Jekyll Talk ([#3745]({{ site.repository }}/issues/3745)) +- Update link for navbars with data attributes tutorial ([#3728]({{ site.repository }}/issues/3728)) +- Add `jekyll-asciinema` to list of third-party plugins ([#3750]({{ site.repository }}/issues/3750)) +- Update pagination example to be agnostic to first pagination dir ([#3763]({{ site.repository }}/issues/3763)) +- Detailed instructions for rsync deployment method ([#3848]({{ site.repository }}/issues/3848)) +- Add Jekyll Portfolio Generator to list of plugins ([#3883]({{ site.repository }}/issues/3883)) +- Add `site.html_files` to variables docs ([#3880]({{ site.repository }}/issues/3880)) +- Add Static Publisher tool to list of deployment methods ([#3865]({{ site.repository }}/issues/3865)) +- Fix a few typos. ([#3897]({{ site.repository }}/issues/3897)) +- Add `jekyll-youtube` to the list of third-party plugins ([#3931]({{ site.repository }}/issues/3931)) +- Add Views Router plugin ([#3950]({{ site.repository }}/issues/3950)) +- Update install docs (Core dependencies, Windows reqs, etc) ([#3769]({{ site.repository }}/issues/3769)) +- Use Jekyll Feed for jekyllrb.com ([#3736]({{ site.repository }}/issues/3736)) +- Add jekyll-umlauts to plugins.md ($3966) +- Troubleshooting: fix broken link, add other mac-specific info ([#3968]({{ site.repository }}/issues/3968)) +- Add a new site for learning purposes ([#3917]({{ site.repository }}/issues/3917)) +- Added documentation for Jekyll environment variables ([#3989]({{ site.repository }}/issues/3989)) +- Fix broken configuration documentation page ([#3994]({{ site.repository }}/issues/3994)) +- Add troubleshooting docs for installing on El Capitan ([#3999]({{ site.repository }}/issues/3999)) +- Add Lazy Tweet Embedding to the list of third-party plugins ([#4015]({{ site.repository }}/issues/4015)) +- Add installation instructions for 2 of 3 options for plugins ([#4013]({{ site.repository }}/issues/4013)) +- Add alternative jekyll gem installation instructions ([#4018]({{ site.repository }}/issues/4018)) +- Fix a few typos and formatting problems. ([#4022]({{ site.repository }}/issues/4022)) +- Fix pretty permalink example ([#4029]({{ site.repository }}/issues/4029)) +- Note that `_config.yml` is not reloaded during regeneration ([#4034]({{ site.repository }}/issues/4034)) +- Apply code block figure syntax to blocks in CONTRIBUTING ([#4046]({{ site.repository }}/issues/4046)) +- Add jekyll-smartify to the list of third-party plugins ([#3572]({{ site.repository }}/issues/3572)) + + ## 2.5.3 / 2014-12-22 {: #v2-5-3} 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 28acaeb5..0d27a458 100644 --- a/site/_posts/2015-10-26-jekyll-3-0-released.markdown +++ b/site/_posts/2015-10-26-jekyll-3-0-released.markdown @@ -28,7 +28,7 @@ A huge shout-out to the amazing Jekyll Core Team members Jordon Bedwell, Alfred We also added [Jekyll Talk](https://talk.jekyllrb.com), managed solely by Jordon, which offers a modern forum experience for Jekyllers across the globe to talk and learn about Jekyll! -As always, check out the [full history](/docs/history/#v3.0.0) for more details. +As always, check out the [full history](/docs/history/#v3-0-0) for more details. Our contributors are the core of what makes Jekyll great! Many thanks to the 132 contributors who made this release possible (in alphabetical order): AJ Acevedo, Adam Richeimer, Alan Scherger, Alfred Xing, Anatol Broder, Andrew Dunning, Anna Debenham, Anton, Arne Gockeln, Arthur Hammer, Arthur Neves, BRAVO, Ben Balter, Bernardo Dias, BigBlueHat, Brandon Mathis, Bruce Smith, Cai⚡️, Carlos Matallín, ChaYoung You, Christian Vuerings, Cory Simmons, David Herman, David Silva Smith, David Smith, David Wales, David Williamson, DigitalSparky, Dimitri König, Dominik, Eduardo Boucas, Eduardo Bouças, Eduardo Bouças, Erlend Sogge Heggen, Eugene Pirogov, Ezmyrelda Andrade, Fabian Rodriguez, Fabian Tamp, Fabio Niephaus, Falko Richter, Florian Weingarten, Fonso, Garen Torikian, Guillaume LARIVIERE, Günter Kits, I´m a robot, Jason Ly, Jedd Ahyoung, Jensen Kuras, Jesse Pinho, Jesse W, Jim Meyer, Joel Glovier, Johan Bové, Joop Aué, Jordan Thornquest, Jordon Bedwell, Joseph Anderson, Julien Bourdeau, Justin Weiss, Kamil Dziemianowicz, Kevin Locke, Kevin Ushey, Leonard, Lukas, Mads Ohm Larsen, Malo Skrylevo, Marcus Stollsteimer, Mark Phelps, Mark Tareshawty, Martijn den Hoedt, Martin Jorn Rogalla, Martin Rogalla, Matt Rogers, Matt Sheehan, Matthias Nuessler, Max, Max Beizer, Max White, Merlos, Michael Giuffrida, Michael Tu, Mike Bland, Mike Callan, MonsieurV, Nate Berkopec, Neil Faccly, Nic West, Nicholas Burlett, Nicolas Hoizey, Parker Moore, Pascal Borreli, Pat Hawks, Paul Rayner, Pedro Euko, Peter Robins, Philipp Rudloff, Philippe Loctaux, Rafael Picanço, Renaud Martinet, Robert Papp, Ryan Burnette, Ryan Tomayko, Seb, Seth Warburton, Shannon, Stephen Crosby, Stuart Kent, Suriyaa Kudo, Sylvester Keil, Tanguy Krotoff, Toddy69, Tom Johnson, Tony Eichelberger, Tunghsiao Liu, Veres Lajos, Vitaly Repin, Will Norris, William Entriken, XhmikosR, chrisfinazzo, eksperimental, hartmel, jaybe@jekyll, kaatt, nightsense, nitoyon, robschia, schneems, sonnym, takuti, and tasken. From 86ea57ba585ddd4dad085c1c5daae204487317e9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 21:12:59 -0700 Subject: [PATCH 161/810] Remove 'unreleased' notes. --- site/_docs/permalinks.md | 16 ---------------- site/_docs/plugins.md | 8 -------- 2 files changed, 24 deletions(-) diff --git a/site/_docs/permalinks.md b/site/_docs/permalinks.md index 7bc46675..e82ecf6d 100644 --- a/site/_docs/permalinks.md +++ b/site/_docs/permalinks.md @@ -183,14 +183,6 @@ Jekyll also provides the following built-in styles for convenience. ## Pages and collections -
    -
    Support for improved page and collection permalinks is currently unreleased.
    -

    - In order to use this feature, - install the latest development version of Jekyll. -

    -
    - The `permalink` configuration setting specifies the permalink style used for posts. Pages and collections each have their own default permalink style; the default style for pages is `/:path/:basename` and the default for collections is @@ -268,14 +260,6 @@ Given a post named: `/2009-04-29-slap-chop.md` ## Extensionless permalinks -
    -
    Support for extensionless permalink is currently unreleased.
    -

    - In order to use this feature, - install the latest development version of Jekyll. -

    -
    - Jekyll supports permalinks that contain neither a trailing slash nor a file extension, but this requires additional support from the web server to properly serve. When using extensionless permalinks, output files written to disk will diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index e29d7624..599d4658 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -480,14 +480,6 @@ end ## Hooks -
    -
    Support for hooks is currently unreleased.
    -

    - In order to use this feature, - install the latest development version of Jekyll. -

    -
    - Using hooks, your plugin can exercise fine-grained control over various aspects of the build process. If your plugin defines any hooks, Jekyll will call them at pre-defined points. From 8f5465dfa410dd74541a2dc1fd1a1fce2e315642 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 26 Oct 2015 21:13:49 -0700 Subject: [PATCH 162/810] site: latest_version.txt is now 3. --- site/latest_version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/latest_version.txt b/site/latest_version.txt index aedc15bb..4a36342f 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -2.5.3 +3.0.0 From cf71c563ab2ce4fe974e2e0c07361c2721a9b334 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Sat, 24 Oct 2015 17:34:29 +0200 Subject: [PATCH 163/810] 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 f57b3ae4..52b65a33 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -118,7 +118,7 @@ module Jekyll 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 @@ module Jekyll # 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 @@ module Jekyll 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 @@ module Jekyll end private + def style_to_permalink(permalink_style) case permalink_style.to_sym when :pretty @@ -314,5 +316,17 @@ module Jekyll 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 553dfda3..608dfef0 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 e5f26b5a36206c5fbdf674bc76cede7be37bccfa Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 29 Oct 2015 15:18:19 -0500 Subject: [PATCH 164/810] Fix test warnings when doing rake {test,spec} or script/test --- lib/jekyll/document.rb | 9 ++++----- test/test_document.rb | 2 +- test/test_site.rb | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 00a0ca7a..763559bf 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -366,11 +366,10 @@ module Jekyll # # 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 <=>(anotherDocument) - cmp = data['date'] <=> anotherDocument.data['date'] - if 0 == cmp - cmp = path <=> anotherDocument.path - end + def <=>(other) + return nil if !other.respond_to?(:data) + cmp = data['date'] <=> other.data['date'] + cmp = path <=> other.path if cmp == 0 cmp end diff --git a/test/test_document.rb b/test/test_document.rb index 9f337c27..a1e0c9cd 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -328,7 +328,7 @@ class TestDocument < JekyllUnitTest end should "be output in the correct place" do - assert_equal true, File.file?(@dest_file) + assert File.file?(@dest_file) end end diff --git a/test/test_site.rb b/test/test_site.rb index 66f1408d..bea2fcc0 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -465,7 +465,7 @@ class TestSite < JekyllUnitTest end should "print profile table" do - @site.liquid_renderer.should_receive(:stats_table) + expect(@site.liquid_renderer).to receive(:stats_table) @site.process end end From a0f3860cfa8a4f22e0d55991f9c535f8e41597ec Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 29 Oct 2015 15:39:42 -0500 Subject: [PATCH 165/810] Update History.markdown to reflect the merger of #4078. --- History.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/History.markdown b/History.markdown index f5dfc16d..50186047 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,8 @@ +## HEAD + +### Development Fixes + * Fix test warnings when doing rake {test,spec} or script/test (#4078) + ## 3.0.0 / 2015-10-26 ### Major Enhancements From dfae4669e4adc2e34ab3a6ecd400ebdf7b5848bb Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 29 Oct 2015 15:43:55 -0500 Subject: [PATCH 166/810] AUTOMATIC: Whitespace stripped. --- test/test_regenerator.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index ebd30aec..52268f26 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -39,7 +39,7 @@ 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) + if item.respond_to?(:destination) dest = item.destination(@site.dest) FileUtils.mkdir_p(File.dirname(dest)) FileUtils.touch(dest) @@ -67,7 +67,7 @@ class TestRegenerator < JekyllUnitTest # make sure the files don't actually exist [@page, @post, @document, @asset_file].each do |item| - if item.respond_to?(:destination) + if item.respond_to?(:destination) dest = item.destination(@site.dest) File.unlink(dest) unless !File.exist?(dest) end @@ -92,7 +92,6 @@ class TestRegenerator < JekyllUnitTest context "The site regenerator" do setup do FileUtils.rm_rf(source_dir(".jekyll-metadata")) - @site = fixture_site({ "incremental" => true }) From 71f4383d18a3980bf70c9848b1d7156a4eaaba0b Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 29 Oct 2015 15:44:38 -0500 Subject: [PATCH 167/810] Fix #4075: Make sure that .jekyll-metadata is not generated when not needed. --- lib/jekyll/regenerator.rb | 4 +++- test/test_regenerator.rb | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 911ca18b..2d84ee34 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -130,7 +130,9 @@ module Jekyll # # Returns nothing. def write_metadata - File.binwrite(metadata_file, Marshal.dump(metadata)) + unless disabled? + File.binwrite(metadata_file, Marshal.dump(metadata)) + end end # Produce the absolute path of the metadata file diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index 52268f26..c9dfb573 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -305,4 +305,23 @@ class TestRegenerator < JekyllUnitTest assert @regenerator.modified?(@path) end end + + context "when incremental regen is disabled" do + setup do + FileUtils.rm_rf(source_dir(".jekyll-metadata")) + @site = Site.new(Jekyll.configuration({ + "source" => source_dir, + "destination" => dest_dir, + "incremental" => false + })) + + @site.process + @path = @site.in_source_dir(@site.pages.first.path) + @regenerator = @site.regenerator + end + + should "not create .jekyll-metadata" do + refute File.file?(source_dir(".jekyll-metadata")) + end + end end From 0f4aed9ccfa0776d7ca8e1548a3202b7d80d1019 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 29 Oct 2015 13:36:05 -0500 Subject: [PATCH 168/810] Fix #4066: Move Convertible#render_liquid to using render! --- 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 57abb7d1..12151395 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -109,7 +109,7 @@ module Jekyll # # Returns the converted content def render_liquid(content, payload, info, path) - site.liquid_renderer.file(path).parse(content).render(payload, info) + site.liquid_renderer.file(path).parse(content).render!(payload, info) rescue Tags::IncludeTagError => e Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{e.path}, included in #{path || self.path}" raise e From 1c4b4ae2717d38d7c0c1b406557e9982c59a1330 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 29 Oct 2015 17:19:03 -0500 Subject: [PATCH 169/810] Add regression tests to Cucumber. --- features/rendering.feature | 7 ++++++ features/step_definitions/jekyll_steps.rb | 5 +++++ features/support/env.rb | 26 +++++++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/features/rendering.feature b/features/rendering.feature index 55a9d3d2..01507cb0 100644 --- a/features/rendering.feature +++ b/features/rendering.feature @@ -5,6 +5,13 @@ Feature: Rendering But I want to make it as simply as possible So render with Liquid and place in Layouts + Scenario: When receiving bad Liquid + Given 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" 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/features/step_definitions/jekyll_steps.rb b/features/step_definitions/jekyll_steps.rb index 27c8692d..9164d549 100644 --- a/features/step_definitions/jekyll_steps.rb +++ b/features/step_definitions/jekyll_steps.rb @@ -24,6 +24,7 @@ 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)) end @@ -227,3 +228,7 @@ end Then /^I should see "(.*)" in the build output$/ do |text| assert_match Regexp.new(text), jekyll_run_output end + +Then /^I should get a non-zero exit(?:\-| )status$/ do + assert jekyll_run_status > 0 +end diff --git a/features/support/env.rb b/features/support/env.rb index 9e9f47fd..76a3e707 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -16,6 +16,7 @@ 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) @@ -36,12 +37,20 @@ def jekyll_output_file JEKYLL_COMMAND_OUTPUT_FILE 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) end +def jekyll_run_status + (File.read(jekyll_status_file) rescue 0).to_i +end + def run_bundle(args) - child = run_in_shell('bundle', *args.strip.split(' ')) + run_in_shell('bundle', *args.strip.split(' ')) end def run_jekyll(args) @@ -49,8 +58,21 @@ def run_jekyll(args) child.status.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) - POSIX::Spawn::Child.new *args, :out => [JEKYLL_COMMAND_OUTPUT_FILE, "w"] + 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) + end + + spawned end def slug(title) From b50056e8df2da8e23b5290eab2703f547f35478f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 31 Oct 2015 03:37:45 +0800 Subject: [PATCH 170/810] Update history to reflect merge of #4077 [ci skip] --- History.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/History.markdown b/History.markdown index 50186047..68210588 100644 --- a/History.markdown +++ b/History.markdown @@ -1,6 +1,11 @@ ## HEAD +### Bug Fixes + + * `Convertible#render_liquid` should use `render!` to cause failure on bad Liquid (#4077) + ### Development Fixes + * Fix test warnings when doing rake {test,spec} or script/test (#4078) ## 3.0.0 / 2015-10-26 From e6afa6f07a59928dab4ee0304ff581792f829bdd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 31 Oct 2015 03:41:07 +0800 Subject: [PATCH 171/810] Update history to reflect merge of #4079 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 68210588..a7d961c5 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Bug Fixes * `Convertible#render_liquid` should use `render!` to cause failure on bad Liquid (#4077) + * Don't generate `.jekyll-metadata` in non-incremental build (#4079) ### Development Fixes From 3c60d63f0b507e03d176a3fc33ba31adedac4c07 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Fri, 30 Oct 2015 21:52:25 +0200 Subject: [PATCH 172/810] Update normalize.css to v3.0.3. --- 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 f6e0b65d..ba2f36c1 100644 --- a/site/_sass/_normalize.scss +++ b/site/_sass/_normalize.scss @@ -1 +1 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */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{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;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 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 From 3b55bd1a5116d56f25193d57143c65c2014c1387 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Fri, 30 Oct 2015 21:45:58 +0200 Subject: [PATCH 173/810] Trim trailing whitespace. [ci skip] --- site/_docs/collections.md | 2 +- test/test_log_adapter.rb | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/site/_docs/collections.md b/site/_docs/collections.md index e55378af..ed0a87ef 100644 --- a/site/_docs/collections.md +++ b/site/_docs/collections.md @@ -333,7 +333,7 @@ file, each document has the following attributes: ## Accessing Collection Attributes -Attributes from the YAML front matter can be accessed as data anywhere in the +Attributes from the YAML front matter can be accessed as data anywhere in the site. Using the above example for configuring a collection as `site.albums`, 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` diff --git a/test/test_log_adapter.rb b/test/test_log_adapter.rb index b6adf990..0160d821 100644 --- a/test/test_log_adapter.rb +++ b/test/test_log_adapter.rb @@ -24,19 +24,19 @@ class TestLogAdapter < JekyllUnitTest subject.adjust_verbosity(:quiet => true) assert_equal Jekyll::LogAdapter::LOG_LEVELS[:error], subject.writer.level end - + should "set the writers logging level to debug when verbose" do subject = Jekyll::LogAdapter.new(LoggerDouble.new) subject.adjust_verbosity(:verbose => true) assert_equal Jekyll::LogAdapter::LOG_LEVELS[:debug], subject.writer.level end - + should "set the writers logging level to error when quiet and verbose are both set" do subject = Jekyll::LogAdapter.new(LoggerDouble.new) subject.adjust_verbosity(:quiet => true, :verbose => true) assert_equal Jekyll::LogAdapter::LOG_LEVELS[:error], subject.writer.level end - + should "not change the writer's logging level when neither verbose or quiet" do subject = Jekyll::LogAdapter.new(LoggerDouble.new) original_level = subject.writer.level @@ -45,7 +45,7 @@ class TestLogAdapter < JekyllUnitTest subject.adjust_verbosity(:quiet => false, :verbose => false) assert_equal original_level, subject.writer.level end - + should "call #debug on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) From e007a14cf162158ad6ec1df79d18b196df576657 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 30 Oct 2015 14:59:28 -0500 Subject: [PATCH 174/810] Update history.markdown to reflect the merger of #4085. --- History.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/History.markdown b/History.markdown index a7d961c5..ca4790d5 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,9 @@ * Fix test warnings when doing rake {test,spec} or script/test (#4078) +### Site Enhancements + * Update normalize.css to v3.0.3. (#4085) + ## 3.0.0 / 2015-10-26 ### Major Enhancements From 6e30e177d1a748241300e0fce4a393570f2288b4 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Fri, 30 Oct 2015 21:49:06 +0200 Subject: [PATCH 175/810] Update Font Awesome to v4.4.0. Mostly for .woff2 support. --- site/_sass/_font-awesome.scss | 6 +- site/fonts/fontawesome-webfont.eot | Bin 56006 -> 68875 bytes site/fonts/fontawesome-webfont.svg | 146 ++++++++++++++++++++++++--- site/fonts/fontawesome-webfont.ttf | Bin 112160 -> 138204 bytes site/fonts/fontawesome-webfont.woff | Bin 65452 -> 81284 bytes site/fonts/fontawesome-webfont.woff2 | Bin 0 -> 64464 bytes 6 files changed, 136 insertions(+), 16 deletions(-) create mode 100644 site/fonts/fontawesome-webfont.woff2 diff --git a/site/_sass/_font-awesome.scss b/site/_sass/_font-awesome.scss index d90676c2..681011e1 100644 --- a/site/_sass/_font-awesome.scss +++ b/site/_sass/_font-awesome.scss @@ -1,11 +1,11 @@ /*! - * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * 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.2.0'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg'); + 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'); font-weight: normal; font-style: normal; } diff --git a/site/fonts/fontawesome-webfont.eot b/site/fonts/fontawesome-webfont.eot index 84677bc0c5f37f1fac9d87548c4554b5c91717cf..a30335d748c65c0bab5880b4e6dba53f5c79206c 100755 GIT binary patch literal 68875 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

    7r8$?kb-D3z%-c} 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 F002TuuHFCu literal 56006 zcmZ^JRZtvU(B%Mw>)`J0?yiFdcX#)ofgppsySuwfaCe75aCZqo0@-i3_TjJE+U~k_ z`kw0BbszenyXuT>0RVfO008uV4g~y9g90Q%0siBZRR1UYzvKVt|6|xA)II+<{2zb| zkOjB^oB^Hy34k}i3gGeI&FMb`0MG#H|Dg@wE5H$825|q6p$2IG$GHEOWA}gFkOQ~@ ztN_mc4m*JSKV%1R0J#3kqy7KXB>#UZ0sxX4a{tedVW0vB0Gk_t&22!FDfaAn?EDf) zuS6P2`B;_|;FDEYD%zOyEAJN`24F0K!GIW>W3mmrcwHXFBEcZLx4N0j@i5D}%!Z`F z*R4fBcS&o8lq+P0Ma9Q~X^a)#=dGUBMP8{2-<{;1LGs%LbADys{5e8>CxJIPb{)eJ zr^9*JM9X!bqQ7zyIQ5z|YEF`l6gj?PyUxt#_f(^Wb#=LtL3sD{W7DXRVf|A_mgtop zEoo94oH0*D{#t{3Z(q*2GV4gH_Lz8EuSv^T&_ZS(*Cw#BZ<7CH@Q+d{9W5?#8Fqqr zlH5!J!`E5%{RaE0`ZML(3V?>a4I^h3$00LAZkA(yQ^;QV-mu2+ry&tN$da0oG%;~8 z)+oY6(3A%W%Q=i*)5==c^bkH% ze15WD0uvEKDI|48q(Z7lWa`YSLimQx`k}GQ0}Mk)V1;PMM(MK?MgH?NURT@^O(&MZ zoFI!|J&eDc(f-_{pLNBN z0}t%Y+#y0|i|g5mqr=+;C216Shp|^K#NV3No{HOyLgsvlPJ*i#;Nx?exEf98dwrwqgz1K+ZMP9|!x9&I z(NEamNL>c;32l85*?GMlLpqIO6&oK6q9tNYA4uBoaO=h zUGy-6HuFwAb_wEM)EyP&Kh#h;eYylr$UR|mdTK3^$p~KEg=TxncA8v0=l4>Yo7MGr zR86fj{4%o2oQye;#{Fp~>MHs5CE)~bK86mjI_l48@x zY&OcOBcD~Ztwi{vU+(*c-zk;=4MV(X`(_REIQ_6TC}#_O^meM;!9({j=p+rFh}QI4 z;TBGMuuPacZl#BdHc?83q*HBcwM#thQiX#(YMF;Zx4%n927(d}L-!VK4dvuYL?Hql zthiQ)x1r^Wp^61Q)Q{=zOL&$bC-@!r&wZ}0U3{_cIvtda;=H=F7HJuVz@`AWBI@{v(XjLqLsw4I7kUTe_&GhyzB z9+TwL8$rlF@gX!2xy=15!H@Jin9+~o8O~tY&l@#MRup+xQy^OBTS_k{2c*e&mlJ(; zm*;qlfdop4QDu{?cyHas+ieKw6`O%nDO-k%A<1K6iZ@`u0ecElVFL#j|Gv-@(KlfP zH8_V)bOj@Y@TYj?*==q_-~7vljXA$dNFhd&{jXq6yHL$9-kdAypXn(k5edW#0P0OE!H)Ip`V({i_J8)@udU^TnvSX~>ggYM?=`Ru* z^y-N@)R-V7`@uD?yyp>htL6x5#|flj%-8Tzt)r+VSDIk2Y-vQIbZ&_**pN_)c=fe( zyKr811aYY&XyjAK;;H~9dbONwou{+#Eq1GZp>tF(1<@lAnQ;iTF3D6-zKDDxo;pF8 zhK?~J{$E$J0_p}Zvp~P!SVdwV)f!pyKJX9L^jnr0FLN4}jXgIa02fypBX$eHKg`9O_mA>UIF^#d;i;X0omK8(=^ znh#cmhf!WiH3QGtS^m^y&BiR>c->ihz(u8i1Z)Dw#L*UA50Tc1Ix$72$00dkdg_pQ z7s!yhP$EB=&wLceJix6^gO2 zs{Du?EW)VYj^KxzjeCeI5~2}=_YO)b9`7f7d)wKk1n|>`9i#Ey{nZ0h9pr8)2x(|` z%Y{bKD`g?WL`s2>7#dW;6%y%~{8XXke;N8UBRq;~n8X&`uoiX+c>A#Ps4jx zv>m3|;>UUND|*zAy_4Z7dK9wl4D}ShoY>|9ds<@#(HRE4iJ7ldV_YOuk;}sG@_^yt z?e|dZu*lTME}%g!{^>S}J1r7|RD$!^J*n7idjfsst=uL6HUw(ZC?(mz z&8TH#%?LTSP?^(_zbNRP2&?^4D96FWa>By@Rivn2ultAy9UVV*R4WQR9%S+>%j@_p z)M=O&$41IZy?mX`Q1y$RRwsl3F}J)9^7_ z4U2wA5Q7wkT!Emf;(kCpFY?LRza(|-ci-hdH*uyUr2R+6^;D8PH9>N}hz7xV5Fo+@ zg5;gaS-+IRqOtU=&f#Li^}zPhcnGu%UvwH?3SWg^0~LmJW)ln_togixj-6_8jVRRV zi^b?K$$Cp+MNz2vr%j>T#-SpHE`XNQH`Xl>TLPh+{T%H}>&k(?y)JBnr@tqonB8ds zG`rPmSGc#)i^mMBt{@^Ha4}HAB5-a7Q&^{eD=so3e@8(-lkvT6kcL`=t76!5Ytfft z$`bT3r9ypXM?=O1$%3JX*O4a|g%{aZsuR8mb6Inbp%;tX;N~h8th8lu!rYQD#3Y&u zKoU45!m_S7V+|iV&~M@ug_dWLx`$>Dp&w0rcxwsm%qX~Y3nv;N882Y7 zj~P3h8Ea8*b+(Iq4|rV{rL$>VFvGx6PKiv1`Z>cw>>8W!N3Z=p+*l0<5#N81!?DnZ zJa2h}&0ksrZ{>=eq36N%tP#ncN@Gt6k+5FP`aUusW&Upry9Cu;H*3*;$05)*8un#z zAgR}04m&(?;!t1tj?!Ht{oL`fOdi4BM3x7)wxGyRCaA0?vXXc`wz#iT*bg5_Ma@wc zNDU!D0up&)=~qD>Vb5i9u8Ox zI4PaPyowm4gCbOl%}<}GwRv>YFWeeCzms8pgOK@R*i?g%shHtth@Unn34#S{<5GKP zlJ=^4#S@C&Megee*@@G=*M~=M2`*`x*#o*n6h%hk)_Kn8Vkwq9ZCI!y5K6Z3IbU0G zv5f&=?#OeVo5kRGodeeOEtbb*R?a#zeJ+pZRt10SVU{rdoOy6B+p=H6_1!ekep2{0 ztXx}hu?h%lR8u=;_qLZx@k=TH2V*Q9C;xPVs7+q?2&HT5tt!RMJ08Q&po~33Sz@){ z13rhnqr*8~{`PZBme-U0DXqSdMzked4&{i^-drlkqHwhLon~_XMBgkohXjLjdF&)A zmS2*}U)p7WFY>f)+Bi?{9+4k{Rw=Wp-noleScq=iATjqvvpZpeKWU9)XS6X{h`}~I zf9#J6;K-31j9Kxsun_H5+g5p2+mo!`*wMoy0h)XyqztQ5^>(7*m`5@PIk8E9>K<$kPb?zP7-@*wnPw0rsRnZjEw%d6yU+)Z(iR{fjl+8>OY7wLT?UNh zoU1tQW(MVjnj3gT5bBDE|5vRDv)--Fu2~%~{cFAP8 z-oNO^v}tkTAzIFK zBG$JM+OFa4pL%#u>d#u4kzdg1X%y*Ti+&J#j>5W`p!60WU}zFW29!p8U`N7b{|1`! zmIZr~OIP~2`a$%43lN(n#v>;WV?BH(@K%8ndyEtw0^6hTU91W*gbXq7N-89c%q2sE zi4$YEum(N7W6-a(Q*rPWeMCc@Npz#^Xi$+tj?R(uvX$tZ5&i+QDkC8VDYzm0kZ9^8 z8`KD5aZIHot4KGJM|N9vS4-u`h|!8Y_vSn5d{PB@qlZ<7Xo|Dga_Gc2KGkAnjAS^g zYlE3a!4dS4Fm8F&$#|mdHk�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 - + @@ -147,14 +147,14 @@ - + - + @@ -275,7 +275,7 @@ - + @@ -399,7 +399,7 @@ - + @@ -411,8 +411,8 @@ - - + + @@ -438,7 +438,7 @@ - + @@ -459,7 +459,7 @@ - + @@ -483,13 +483,13 @@ - + - + @@ -513,8 +513,128 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/site/fonts/fontawesome-webfont.ttf b/site/fonts/fontawesome-webfont.ttf index 96a3639cdde5e8ab459c6380e3b9524ee81641dc..d7994e13086b1ac1a216bd754c93e1bccd65f237 100755 GIT binary patch delta 30241 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 delta 5225 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 delta 64915 zcmXV!190GM*M_^bZM)r?TWoFHwr!`jw%FRXZDVWOHn(p7eZToLbLX5~xpU5wJjqOw z;5YEfFEDg>c`-4NZy^7cuSyWaf8kp*@h^00z`Wsmmbi$h*gs(Kj}rY8F(^F`#%FmoGEvwsX3 z1mxrg$hVkISta5~3sXZA5Rh|;e?I1a`T=c*vSwjn3K;%_KL5afjmeQfVb(2dT|EA= z%zq93HGz7^Cr9_Pu{ZwbyFB<;^Z^6}9P}HI^=fPA@vrgi%Kslr45|i-Z)a$0`j0*T z8=&hyFQ*KttAK;OvkM5w{XZ}KzY{_?azxm2bT>8nH^8q#5D)+a@?QbShHB;afAN3U zXM#6>`d<$6N0~JDzc@o`LhrF=Y+zzwumffU1Bq;4^e;DgMNYqJaT8 z0Mgz7EerCmz~rw#QbLZ%!^a*Kbno)+^mPR@&G}Hsd0nj*^Q1qcmiExX<%#(MTIryF zS)kDOt4cfK1YlXr${jT{MjiDS2P(`^LcfNl8SWVSF$s&v;hM+8cO*EP$qyf2u-v(| zP>b2ITvE?{Pd*8>J6U>2Uq4dhM1>IrDklS;$;lNXq?MEser2K;k{>H2hc=o*6A7&d zp*xcQ5`yGHSLkOix5$k#99gEQvYiWeU?G{o0)>&*FiJp{o=ZsXL@%PlD3g>12M>)P z7>xH1VXGf42xp-w&4W0d3D3QLtm9jN^3uOP-CVM{&+}Y8S$un}=s-Zc=iSrBp@kZJhIeEVC*ELj{_jEVkaptk-)ICqizy@Y4*$))L z%t6Q1TzqmT1wt_h_7(^vTNKce=J1X0v7f>^i#?VLz%GuQkJPBM>ki;3A%RG#gUF0- z6JE?RmK&Xas)8g1iRMSnx2V$zci1^w>P{}7L#^If!G-S*=jqNvHvuE)@++!1|3;j% zvw-WMdhygsGfM#q%9Slh+)cwl7*6hS$E2Sg&bX^g2GcYFCS`PT&Ew_l564vC@&c_I z=7?8;Ujpmu-lfpag92cr*f77^d7|Voz_MKf-j<5y7O; ztKTuh{)QeUme0Jp8(23rs@odUiytl*wto2cK8tf!xIWDWX?%R`pwN_?mr3D8K;+|X ze{4h57P?6{S(>ltfucn96jm<qH%H+_8^9vgSpkgXo!1*JZ703uo(DvyDye<&*B|Srh^ddvTL}HMQjcO*E>W)8 zc25T;k>Il#W;S@}g)@xTT6m84ISE4>L*#|w(EKj0NSN|mWX8z8d*AvATjW-#5?r-i zrVs7j>{;8Ld2E!jdfgrd<*P2{9W z>&%|4z_YcYkgo50YdbE*Q9;&;*aN{*_3&6m2tjEb)MokCR>7x??tRuZvT$2k1d=6% zEt$ZNXkT6|uu>X9iE{DW{hVCdKa37Pn30=IL4`hhW5~knc!;^c(zx*2AASGuIgU{M zemw2qm>2`kOwjUB{us`%&(GfcdDZPL?lsUX4KSwT*voMY==&Urrr50ueC7`Ij5&(6 z7n5t%U|885dbQoRMzvbE>TdXMpl$RxXU5BkW+(<}gyC1qfgAWD@+T-OLOvFm`VWr) z6A#Db_U}eQFQqA$Hi%hchT<#_1LlWYRzAn2vPV>R#j(WS``P5eh>T?MEXQW zYx`CtTU&(UT(9`9`#w!IsX07X1tpbkKmmyJ9Mr4lkS4xs0*vr`v@oK5s^tix(nVjWLi}t?>fc2N%o{&Q!Oi#S zY(q1ept63)|KP}~r5_;MEf;n`&O<#Kk`48|%`_rZoA7Uj2ZLof!w-skETI}0xw+Bg zD!YGDl~}vac%>4YD}OUN+|XGEG!@=v*YxRTv>dPYo6?(}$XXg*uA*Gp*qtmRaSVSU z30Tj4_x`c()FCnkT4jz6g6~s@3I1HLZd&5q+$^lj<9!VC=zjL42Dlp?{{ov-Ux2EV zJ?CItb$@T#fBS8tw{3#3U~k3kP?$=z!U+O!etl1OI)*uTTToZnR{bUoIL~7QK-6rv zq9h1c$8dCa6FZ11H&8evzq05lnBcLQ;jz7=(QxjaboYwV?Bsuw6j^$2^hJA_ZF|q$ zRH|KB1v})=_O89C)h}V88t=QW5j`4Sh^fZQV}#2SJgF&370=C{eKBAgUfhuv#S;mm z6(oUPDgkHR^T&bd!^NNgp5?U>{;*Rj3PcW5pFuzKf;SO!W7qmO9L|te?!oVTRfg5( zZfXit1+e5=G(kurA3(MKbh(?!OMH%>d|)3!NjINa-nwSd{3~nOlvdQPubnx{QFTig zv}n}HPI+2+f6?^&%d~klno+}Qj}^h|8jPXA(`L{6QLW*$nMwKrXc98I$Y;kFQvX;x z=9%23fKLB)~Sp)(*{Zm!80rvL4AdAG#H8c9eHdo!0B27ZnP zTDr8exFNbbgxSO#2;b~KLMOC9b@wB;uR~2BQxT|l;>ty8vgCIgw_8yG;a9yk z2RR1S!Fbx!djPy$%#4;Wpd!I26E&9$1|Z)DddqvaSLdFSzwP_u=7!UYy38`|p}ZF1 z4zXgM)CHTPe+h@x`UT{vg{gaW@jp{uX0+eZCL!fsR=GrCSa4-(gEUP!LKkW$1kGY+ za%nLJ*54!mj9Y~KLsKdVaY(O!a|s|5UkT9KMF_wL!}gz^A@@t}+4O=NeqLo1ZK;|I z&C8Zt@MKaohRW87Xp8X2VqIXNg^;3 za!q4_T10|dBciyKu|iCb#7W49Vk5C6b^|`J>6bLZt-NRShGzTpKF`;zY!(6%CGweZ z(N?=&1u1XCm#XMAw-(x2X>}qeN%T0uSvpf*OOV~9AQ-`YnmlT60tg2K3EbD&EP|Y~ zR=6%qdv*P!^TkYFV|C}p`i)?JHsPe_z4Tb1xKZZ;2}10)yJKw^=}(NSm7JnNUNv(l zY_#3DYF}g+94mgWqNO^7N~RNPa};Xr1F?2eO(2%vOs?PN33E9_h1@YsZ3q~^U)nnn z0A?rBZLW+DZ%20)Pe4^peEF=I%POed#4EQB&)y6^1U`FUtE;{!1a=05 zm=$C`ju5RaKoOiFuOC2OVkW{oo;_Oih4MYe7aKvMp+hh=Boo;PGNY0^ctC9SjZ(9j zVAyiF(K0wex{?ISVRp#%!@24PJ9#jj@j~FKPUaw3GLCu9hw?A);4>pXWLphT>UbzU zvQ8b?d$l`u7U$&^Ki^-KGuJycB?$vUw+?P6bFi#TKN9J@{iqf2o5z1>6C+oS1R&`? zJfA|iHRUdUN6Cz%b`z!d`5I8;EpPm;xf*3OtA~!juEDfpGX~CkjrL%WBGMgbLW#zc z`Qg9jh^~}j(&o1vv`tT@zb-$OVuQJ_$2+H6BbmNgRxOqiFc#@tXXxyqszDQp`4gBtpIWE3uPjvD|lm9Aat0Zq#2d; zG%V3jr}2>EsCO1za^tM{@^?BDdz^+^=&|XRm7F~dOfI>|dOM7|e%{A7M)NPwEX(@{ zQaI83e)H4J6w(X)J5;>!{bf9WfB>iQ(eYYT!Pp@?8yQ}l)a83`*CW@xP=y>~78dX8 z-2~DQEMr09A{(Kkupm3mxHH2U&E|{v<NB!!4QW9lSKcSZM~@z&>To^Vh3=cph+RaaX$!r>2KK zW-J2Nta0&Wgs?=qOyhTFv=kz2>)jXm_FU;UTd$FVxxB|3vM1-H;q zJv;*~9-)mp4gy}GhASK*yG5sF`_%U-cxvYaW|6$V_~#1MfO3yQY1zjr*=9>+m$#pw zuY9v-!Q)h{dw26oh&E6VF;NYdlGdddkb%W(n@4c`g`1Ufb-k^IZe>NUT~b(#KO^4t z{PeA*$WC0mWG=}n^7pkSHo>aAw#AVD^UsmJQrDXxh+lGsD^|7hit=&yuvTiJ%(*B` z59J~TkuMA*%R1ibF-8T>_7v+zKO zBEQuKEOIOnB!29rwga7-0Tv=IRzQQ6VozbV(OYdeX1~&5nA|)@ET#~&C@Yqgb$q|H z|8zrrv78QWi7Y^FYL=)1XQ&Q)1#>R&a(|3nxm8+{*Cz}p)+{oa2S%#C?QZgsD4kb2 zFEvhBl?Axlij!o6)S8%!P5|D8Dg0c8H@`=teI`otz+&$?&pgRkHL67Gf3Q<`?3wX{8nym7^k7dzKQz&33*YA<(O72wwskIp#_v~BjqoJsy&BNMYdhXZ> zmAf+0qa{r8*Ca8u4K$f}avNTpx7xdz1=fo=QnWX4{YcDOqKI=Gxo<2qAz+uk5ywcl zPGpLI{RTwDJfFqy1iTdMgFd0fbIe}q{}WNyY`FYBC1Qys=p2|Fph*uQ)2>J!&icYiWJpP#lhb$6$H z@Gh;x0WI}Cu3cRt%T)zqUfv<^W$VGZUvqI&QGi=9KY8cm-;;J4LQxnpP}qE-2ofxs z-lLVCh#r!BZsRhS!qnJeC?yN(thl{vaSyVX3w7ty@Uw7{8zj;fHe4x$!h#{0%IFL} za$APQWIlDBWl5I3S9-bRT-4#0g#wG*(Z$5-6;X5*elqDzG`DCD!e0w%~zXtCO^(+s6 zAsRkdfLQjrLNvc_YgzwTLykhp@qjs+6x5w)p z-<-+(GN>F55y{`KH#i8rY^Z8p<9gJ)qg5Y0tI4Ie%G+DGawfu*av!4JU1|l1MgWS< z9r6MoGMC@|T3E58Ad=IYQhMvN>!_*QK{}?P-$PGy;c}Lt6^D2# zcNqrE4%hBM;`)Sd1-A|LdEB>}!hr&BId7lR(%Eb-*O^LqMH@3{iIcqh>Y;Drm7EuN z(K)--^ka|~Y|io4!GsFT@Vy1nqrKFis)p*x&oe(*zNSZFKVGnLimB(zczhA5k`XK? zia4mp_6`f)O;|jlDTnTnY;g@wp?R*;f4E;YcE}woipClywN&mpMH&8<00odsY|yQa z8(_~wk^~wCCKPYMMPB0b8@?g?>46UN&yp1?JG6?5^jf`>OSUDkDZxiPm*l{FI<%we za^3M>TvKNsAsbspVvmyEnRgw4Ot&R$$N^&k6rKzh93%?N` zqJ9agACo%m&c5~gb5*_(L)E zYmT@ws87p;U(wQA%K&ox(2JrnkGb)6s5rLfKcMk*M$Q z^aQqeSGO>jU%n_=k_-E5c%~Qi+QOi3-Xit!KF z1E)$XaNbx7c$A7c+zTdt4Ik$=zmK{5Dz|Poso$KnUGNnpxm`^g^i0k$DXJYX1?Sjn z3l*Dzio?+P&-_JTC#YwAAQcRd+4Yf$Y-9RzNv+bj;ko`$eJwZgrKIlq)s zQJv9;aei6%#RIyS`fzImE!^BY=12^BI+rgy;yCl}22=e{A&Mdocv+abXxBS+$Q2c3 zWItF@Wg}I>4y955{fr-k3nclp(I7?uJG(aPr9*uQq~(naXOfRbf^z3X2WHky#>6}2 zy>=P$S+C(Lo@KDxRI$NjuJzK0d zh>Htc6jq3r3L1kL0wjm)ph`f#OhL_z#ZeXONW3&brAr_nxd~ia@gI)Bi>YBb+47#k zYhMG)sDT6B{FqC87v{ZYsLe$%Yvxg*manBD^&h7wbgeKWs&i=MGbsBpNF1M=#W7Vo z9ImF$oy&iY>vbs`REf#(Q7Vsa^LP+2-1<_D2MYui;~6u9CP;@nYstMilYI}zJkgNa zY|nePUo=SQsob%9O)>Kru$2C$4rkMKKZR$D61vz ziriRp6n-xl^1buV*u5CPjx=|8HCBwg>Jy%RQQ7jfycsvY2tT{*+s7U{KT`!}AVu-3 zZv!YLsW@6c$Ap8Ql_$tR_PirA=*(E29E#XnK18N|^{8gP2j`)g8$aEc$CM2R6}#hq zmj%W8;2;TdVy5?U)u<8w)-_ZKz4PV&s9++?HJR;W*XhlMfKzOQ&ejpfH?`StCMUNt zg1W80f2eSp`ejE1WeJ6&J_9O?9_zcoum_;=X$4Z!fHJ6lF}IiAVyE#q@@DXh2`0a( zP*$EJ8{tz%M5W0#xjmK}uSd0Aj>OuIgj|ly2zpnI;TOQ?Q)(*A^c5VY8n5SwL7@v) z&nP8`!D(>vFAIq$%u%L+$E#R^gJ}*;g+>-!Invo?ZnHF+{z2|JR3SVJWimh`ss;SQ zUC0sDqy_GNq&rC0|?-dH|+~$z%{{ai89@d~l1v5Tx=R11^7&!eU`jn2QK&FCJSS zBtDSl@^A@VxRyyJ%#c35lV8?df(XQ-&ma@ZiO1&Wl@!eK4@o^!)r|SJjyQ4Ah2OE} zN1w{FeM4}eF6Fa0&sw%tMS`3~f1pbjl5)b>P<0lQgD99KMmg4TMU_>QkNx#sv2@S_ ztfK_inQM|);yP_KXy2|7@+H&lE%@vF!do~-eHsQL*PZ$rgPH&}>IYNO77P$GEpo!k zWvYQn41((4i_!w;jHq&aC&@G8$>&ce{#EQZQAV|>dNxL}*My~WIZve|nRR^zSB;U9 z>%$qI9;Deac{Bx?p~#eZbq#zL!hUeS^j^M}Tzw9Oe1<}Ph4i$(eg9yv?TY*g_KO5D zo^K1Dr2{OKU$AH~Y)ZRj0*YWxx}$2prx^67z2mLcJ>Dz{PC%GE zN^%hwxJt*`5*aGUId$RCk`!BFcC54a_r`;SpE@r+6T_lIEgJe=YPot;*)zwVSs+JR z5)Fn(aSai5S0>kgXvCN#=3y%?1Pd%ZZd!#Z**vSdwnB>S>dyAbiwMfriF?1+W6GucwRe90aZj;TfV^HFN>tfy=GB}w}M7kSx z2yQ4{Wo;feeV=k)bPU|ncCN%x($#|@+(sOXi86}GC| zkRQ^a^}u^}V$@fMHv{5iOT_I=A}A3{tnJ%$;@8ujYx6Ey0x$rK(eBYOqKP~MaJ?+zpu<6E2eny zs1M*tKFfLNUiO_Y*hgncfmO>C!75u4bGxA4dCeSaLdLy*GXaW1k{+z4dQn4OGBvr) zu`?p-W5@f!qN~tdxCigPOLLeH$I(u>Te-ZfD%UZ;&GZ>*Q9z2QmUsAdYhZOTIcAbCdZXX!LQh@~JZYC#5AQ z`47)1f=c?I(w)`mFl!0r3!O3*np86-`7>+ao54+eC$X5*uU-wc(ksI3ln)Xnn?}|y z`(?`;eYx5e&ihe`nS{i^nEG4r2KAz{>^IRrwc6Fkm0E+$=<}&gV)v12D{Zv8&M98h zbz6~hD%>v57~C#QOfJs`CnuwVVX`hVG0zxB{=b64#-j9@PiPNQb`L7=Ht$x>m9!Q` z*w2D#R1r20nu7LEPC#}GAbnkphbtrMY;m^3r7jmAW2+o>L~Xi(JV+E6(q2jWk?(88 zy=Gvllh9QoEU?Dte}mP_iy`Fck?LBWy=4(;&UnG(ZFz{e?x6vdXI=xDOu`PfvD-O6 z5e}tKgInE7>TyMGG(G>j?V$bA{;$GkyIb9(g}@!bc?;9(P!>koWY6Eo-1IIu=tYOB zx#((~=>AA^xT#RUr!|a4KXa}8H6mB}DjMu~`fIE*q7^sKSZ?L_yFyb=l3|G}bc>YL z)*QnR@$@j5ki+4qs{<)!^JBqD^FPe0W2nh%s&9tF!lj}SIG6rqgW^VTB zR-!5@xye$C8aNFTQn%|~uGwymO`pPr(CX4QgM*?>0ORDu)PT0sL^A2`M2G2TEy76}fN6 z_RV2PacEyaTA|x*NnYDtS&UqM3;NkOq z1>(PV!4bbQi}b_W!oXR~6#MlFrWmz$j1Fh5^T4ayUZyoFDR0-LH}beZ!hL6T|M=+h zJ8Vn-DLWiGxCTV4gz=r~Gh)7qTVdqUSq+C$h`;qfqIZ}S$={kd`)g|aMwYIeNJ0s? zNL3F8Omd3vpdufB2i2wF55zHyV7JMQ@ij_fNaJdALVVOgUmL0}B)S-!P88a5>Vz=S zNCL~^T~DH0eEpr`Td^DB`y&trcJ&*{AZ(_07e)ScENLW^eN&cF{0Ys>fBOR^EY(pd z&IVznX_tSc$v`@OehXTzb!X&3#6DSPn)*5mlcdPMmdh;Lt9fylJ!m*AepFp?=cOUQ zO@vh-R8gNl{E!xHgWrNe**suWcJnJGK9na;gdn8`FzLO+s$Z@GFv!@S?cMnhOd63_ zUdms!AAyRVB2f8SipGL=_1h~lcl0W(N}ijKlpFnJd~DAf$%TsU{LfHH^;box@&X1g z#G|RgJcJJ>C5kSRA04>*^i|ADsoa=G;fv8K%weRn7W^23)OJxKH=7T9h5WdxKnPqJ z4rdM^|5VWfua86M-})h=V5ra5PTUTI`e6Mmp+%i^Ht(T*aUzOAnEXRAniL)O*Iu&* z4NlOVVqvQEWa_Veh(~n=fGs(8uY-&;C1S?xK^TI1E+=$N5#1^be#q8E_;`+K_(Lex zYNo(xghnII?IxvN5+%itI>L(QBLQQG8&p(jw?lYUCRi=yGroDI*{W6ab>d#Zyu0#E zmvBOA(k4%7?GGD|VPPqlD3sF60!ZZC?Rne|=%8)UzN9D5$FJ~LY3%cWZ`@dl zC*C&b$8?FlWQ2g;*9ldP?lu}K_^K7FBqi-?vL7noj$KMOfs#9}BIQOhrIN!1tj~mA z&@mUbaGP{t$&I%cY`1|C6sAHK?hR*_RB1_XR4ZO|cD|=ZYtho|>$-T)rrH6lrTX3a zv*4C_uWz#;bg$>(8SRUV$}N5VkXMY7)A{aQbiSg*DL`@9!F?J&!z9RQ7o9MTR>C%G zPMi31hC|m<_t+Y-efrCFqBe(H(kHA?5Dgvqh9%fTpmAu|LN0T4}{-Y z$d4D)1`kzAdgXiN1=mNI%~8=ewOSaH7kXYq{u(7a#7;6vU#(F~ydftAL_69H+&Fg( zN8Ez??m~wQ;t77&XrdeP5IVgwGHRoTy_hx#3#RN=$mGjWrAI;`s9C?*!L23lPh`TC z9zvi?C(H|$T+r?MO1cePID{y}d&*I=Wz|{vGR5>8{gz)j&0LVlBiAvJpbz$i(ATj2 zI;z?-OXYgM|Lf84^xJ+An059S?|bNXv07PBXWZy|>z~|w@p&>k6Vh*5>Dh>t!-PFc z`kTI{Rlh6Y`?lxyT*1#GGF!_cW4RXEp}*2~b6SGc|EKzP4Eyrjqy?*Sw{!Hl!M|Op zF4`f%DNR&v{~KxfPXYT0V-*@z<=4WN^HkW&hnofLU=WEZ^F$F#|t+nk{**yoBNhMjKxnLa9xjNtbo$4wha2ka)1kWrkJb`wO zup+^R(RHwrC5KeWHO+l^6eH1T@lpF4Q&DY$fq4Mw#9&Wgk20xbVOT7@YmSp}dJen~ z{;l1VdZ-I0q3n1Bterx zeZ`Z^h{Qt1HH&@mip#H)qyutc!@wrSmAG?wLI=)ClNBETv}jKd`BiA6wV(N&-%!nf zosfIwK6g$#{z>t1+@8WfbSg6L!KM9Fjk$E^{9B-J0QWlNm+5W3K8)8Rwiwdmwm)op z-TB(mvwP~eonq(s>=TRebCGBo_CwDXuWbu<61FQu=PYN-h`UJ`HF;#onO%p2Bk?B@ zG5>m?hVtb;u#S^=N$03e0)f$yOOHsID)#;GmR10c1Z#R_nkRE%*M{vkga{r7qgET? z>mB^o&owv~s&*mW4$JgDyEV%Ur){9hiIXovPw)tC$pqf55AQEj1pVFfImq-z z6=WzQ-HkXgh0=FbhwDgKeGZ+~SxcS>h7&!Q3RTt-F2RREk-JKtcLo1JIV416f%Muf z$%0D(M5VK*P9C%=zie%_hlX;~v}+R~rc4#mhR~Kx5!r036(+T9GV>Z`UYm)CewMKy zuZKQJICns3-1YAyZS?*k5uB2y%+?TnVnRBjUn%G3Ga4KPu|omCP?B4aZ6>sB zo)d+^APkvQu{o78OEe%wMJ6mn=>3G7;m_&-$AeZA)(nQF0yfgos)p5Q&xV`98G+br z6Z6KOkqw8re^6(R9haRmJIIF!aGt~#KVk2S8;R75{=`N_MbBe@|K;6B^Aoh12ex#; z0{L(ukeh8QCM@lzd`@ryNxC)xu4+L5Te8ET6kN1e{=2{#`n=wB&H10lD&aLap++w- zfa^DXif{l5H4#Q5NAMm9EK`KKm50HBGabyNLMg1CM>@_=lpQXK8Z5}BV}Xd+fJZub zFpR{*>Y`U4B{+SGVukL3D=~qE#_&3srD>|5blh+C>ZCyq=)I`TD$<+^vrRT}8j>+Y zr&=d>REZzTp=nm<-vt*cAiQ!2Ru;Os0rvP4Y1aj}-w6r`C-vn-vQDAa+6#*ZFpUfB zQx|%kyRn*DIQyV~+MZvVrsXH6tSgP_LQ$gPeuJLFk&tR`Akc5t!Szh+l_BQ8y4H7P z_HHk(&pE4ZpAkfV#gp;Yo}|QJKMczzS5I#7h`c|yo@RR0KV$hswHD+ndY(Bpd!`#t zYX8J~;Mr4PR!VoQYab0U3hd>rZ+~2b0(jE*RB4zs^L@4Xcao5AaXI8(5{D)~sW`sY z&rn>my$;sXm&B}>=YALeF4C<^2U2i}l-Ox)CEklW5sQEc1&X{;JQ7RJyMZgU!H!6LT3QtMF{W zt0PY0z<3y*r8_gg_@ZV6EMDic7P_M-ZTnKTRE!l+-&aoKX_j88P0Y(m>z2s2CI=Z( zkHBB}ynXo

      pZVF;a4S8u>r<}v#8p96-^nin-gF#u?u>oUZYpuMe!9>EqIM#}maa&IMUSW; zUg0mwHX@{H^YBBg=SqDqbr>qzmCMM>DFO-?R_=KyAZl{ zDhu3Wa+SxprdJOuW{cvb7?-F+-Y6izxPrAy>d#^m7urPv_aJ(b`bqLo=+bn~OU0v2 z)2XVg#%@n*$s8~(A4i?->{X}I$IERKddEka+C(>AgzxXa?Ju{P5G?kKjn~CfbUsCs2(z{TX+|syq4#K7Qic7#$koc<{-=+xRX*$Kox2V`ULGBM1}x6T4{SpGZpQfl zzf%6Y-r3zfg|ht11v&E}OvItGQZr4sW##<4a;CpBnsYR%h)&HG0*!5;3$lSAq)JU^ zon{UQClWL}hW2sVpW_EHVu*_CIX>Mc%k~Gdm20iLHyoYz)inrG@;Kf>GH%RF6>K#ooK@xSLPhP#FQO{66C*IFZ- zi&I+iBqo012E|btWk^bWnDlRw22*w^et9SD&}Qlw*{GJJt%HnnQ{T$GH2Cga?FIBF z3`RfT>RGv_I~rA3zN;NimqkJg7xdh;K~SgjJ@E9PEstIslY^Z`TgpB;aT#jIz<=Vl zSd{O5@Jc-gS12My-}mg<`OG+|5C@UdvrAB?)x|YuSZHTTqp0(Sa3UW5zCP;bR91Du z>D((6Zz63q%^Tko67$Xd?c|#Z&Xb@FVYnm!p@_h>f^ES|=baP@syIumhN)`nHo*7o z(3(P^;^0fpEWuns1QEdo-~V2~yWBJCQ?Z~SPd8y>9iw3PRbs;;VS^F-a&&XXBgo_j z?o|pr?~j(#+CC-8vo*oQA8hJWi)j{0$|;Ms!G)Y(@nhKs?naybL%R+dkS-onIgJ?r zq1PxKm1lQJ7y2(7^cMmjr62qcj`Jxp*ja|qoFGg&3|tFuJ!T5=R0}IV<_(x6KQHI3 zhFnZ5My#F-`#b{*-$bgm3^WhYQ6Gs{H6*PTGF(3K3K!k}B-0xwtU>D7BG}Pkg*~lT zHnA@+-I!c)Qw>kKI>R7sX;mPQo^7xJpkZKGLJJ#WJYmCa=amOt0EN1!S@3Qj$}nqv z1U#CVnZH53vOmPrO*F5-wSa-4lt0b0D6FN5As1yRsLN33HyXoBrF#L!GRDu5$VCo* zR5|2=z;A{lpeVnPn-{qdIJVzV(_`#J8yuIrIPfxEn``|=%1fZf@QX#Be`TlxH40zn z9R#0b)ZLH2e{Qr8kh)g@UgkBnsyaw2RKG-ir9fk>I*9FMd-8AjJ^l24!hE`Vp5>9} z*^7>ZCiPTI3Lgq3_w`A(Me6Z-S$n$DSmA$qgq@mnIcjgM5UZLX_F_#RpXqpk#Q-1S zct}b}nW-TJ4?{4G>x*=$P44ppj980<*xGaEL?z28%k4p7N;MkIB18Gxsq+vKjv%|T zB?@T&h+7v2;~6&#^x~IUySBjaulgDb-h^FPhOy6N<`l<)n!T=i_hTV;d(5k)aLYW& zn;_Yrq#iknXBdwix=&bo+wB`psv%5KVY&JAIDc?oBji}PO{1a)xKP^wj7Oql<%zfN z=AC})?+^il7wL95RS5dE#MpYA^QUXIH&hj}#y0J9(j$RhOlx@gvWPoPb>qSPkXw(4{l=8G@_ADkZ*$t#nX9C$UdjCW z7-m1U3wI;}Ca5^&jL<5oAJ>#yeX4ynSF788EW$m{U&0Ratxy8IWyC2PKa}a=2EFkf zRi9qI2wl^=RSFJZ+P;ngYwDp*r#lTUvHAB42czfTp*`!?$0GAGN7FYEvlQ_|Ww6?~ z!S94vj;(a9xYG{5L8b1}2v+22I82jG)+Vv1jL9`7X@q@B*~=1A?s$-!dg-Gev*EuF z8PfQVUPKjub}_)g-+e1tu7oM1H9OK=R-bsR8t60`j6k0RKqJ5?Iv~FZI7JPZZt5e9 z6#Xsn*PEa`M85F47+kUgD}4|NN|FiF0pGYlc8e9~-~JdN+7fqep33=2;5s#M|K(sX zqI-W!1pN|Za+zL_kyRKxkPSJmCPd24a+V)MFH^$d^{AlYdH`M>T-R2ERh^ZkWrsXevpUp-{z? zt9Kg1=O#I{VRV)-a)WF{N-%+$_UcJ2a4zFS??rpob-JE9f5BD0(L(EjwJC0lw)$Q* zZ}X}K_pDCGDCe@xK@%CJ2^QHFxxvgDAqF9rLu)`1(8Z&I;+M*)PE3|O!CU6O>ilwu#B+y4n1eC#8!UG*oG%zOP$hKVf)(m;aqWkO|otTddD88Y~G(W$(~y1K23bu zy8VHc8EgJb+jO0EnQyAuYN+Im1)X6T--91qzvY$xv~ZYhxJLRs8EZF}KRDj%dE_CP zU#VqE)2uaXHd8hGn+}n7&>uP+?Xb1&`EhpU`M0>SdXKwhv%P*IuYg7mM92K{(CB8)-`1!b@IsFp_hZ{0x1L!nPV{{eX~9W zXzwo6x~`gJYy^OHPKxPqHT$kmcEFdNS~FzNdgz&y+bh#~?b2ec%`Gp=Mr1Chc6dxa zv~H~~aST+saO2BmSb*}htQs&qO=L*MsJH51Slv{3B`QMoG)kg&1uoFQ1d=1?DY9Tg zDB5qBp?YF5u0*fc3=ZbrBg=FPv>;Rh&f`FvNBPNEX3N_<-n71R72nmZN7rz#%14tm z@y_2NoH%UA%BD7E$tv}C@Ztz5d4asf;vuiV2|48J z+VP~d{YcR5ol`W}4=n|B_T!q&l71ZjCd-YY2OiV%5%go@i`#S0Tsyx96Z zjv=KBO{k^lXA4VBvCDFmMCgS%76ibbSs=(=Gnz7J%3$YloK$?7=w}9F&T6;&@J_WQ zJ44(bXUEA0juL+0#g>0Fdz&A)JDJ?h_{?yF&gkh=Ma$07uRHl=e{u0D9LBPvQQzzD zsTXJK_CB7}Vg1ovruT%aJ{bF8YZph$YWoR%9yUKK6nGydajW}!oK45?UzIFk$(xrf zEb6juH;fbT&v{JB%lnv$nLp+K7zjPQTC@wI!_zT(udBO5RLPm{vrqtXJ8*sv&vpee z;!qhi8-MG_#TVh`TZq{3%TF85my>B?3ho>@*{HR%wPjK7(dh9r)cg43X-l%lu~uZ_ zoo{AZC0ZXAJ?o#mpjkYfX&0Yqv7_zn7*wQYZ!hn{MdvE(Gx@+Zj{hsy<8nM*#9OHz z?}L27jWFRJZuuN*`8WY+vR<}zz$Fj~cA2++F6NFZpq;f_Ue?0B*|J9Jlqevb$l`GIc_>1S02;!L>z;WaOAALmOk%Wc~tY)$9)O;C_`WUbOA$ zZ_Pl1-xsZLvR{oWX7-gZ>%~MapxpW~ce%-8g3A{bWQYUNe3ESY7rrUTDU!b?Vs_0c z`VP?s%joApJO6kB4(;?h^A`4K{8fG>aO)He#1mGMiKqLX_R2eS`V1CC#fJEBHiDgE zzveouE*E2T?A&@T_ckfsG?PYBQBtNmp%Hjq+h6ym%fBAYN?#_At2woZ9@sf-xj3yA zxAVVq5{Z$HlmeVOj+?Om`W5N=?$$vg7AF~)eLBq|0l>mhiZw|&bd!oY{F0pfcGO4xR#xH&gD$cc18|(y(e$W#2IwL!Jf*)3&1d#g);)`|Uj)ypSH~9GwXW$v%cvW;>X^n8EM_e4QMG^3lpQsELM6}tdh3s> zA(I6L)IOT0cj1>hL(DoHT92l}i)wXCL;{%u?(|=@|jVO2o0zyYKiSLcF??@q)&P30e zWBK^bkT2)83S8xZX3_NW1=OI<#6_;??qEGxgo8!A1>X~~1aqJH1rRMXl_lF)2y=k^ zC*B7^#2V$3tu6;$&yR-cxV57Rq(ZU&1Bl0wm^1wh>}^W-P_$FtB$OR@NMeWYp*3s@ z=^zkXT#KMk3~p=Kj=k`2^CZP@5xf?ybsbh?WKZ}WfJ{|*6{?I~aA=Xy;KZM`p9Ki1#>DB`6D5{%I_D%5kA1_Y+8Q#;VFzMO z>#gMI5iv$9J;BE1`e`?B=_?x(+Kh#JekOaGvPT&NY`3b!xVmp?E_41sn2P%os>_y9=g6j=Xm2wc1F8J6 z>HZcI%4|uq{gi*sGii%I9cKdSsq!d7vx%sHhLN~V?OGrN*@?lV)491tx zcWgCp9}dXeEUTM)h`eZc9Sy8>wv=aZ8JW`54QngE9qXTR$#w5%cU&58`xh zZ+2r&AeWU}M7*`}_KtuV_=~y)ZeBYu*uuAa&TC0F2pE*xgiN^FD}#ki-Ud%iuXbZY z7IpvC{qFMTW1J@}(mmVgEv_D*3$2S-$L|5re_pu7q=4GrM{=LNGk=;FO zZhkP$&vz0E%24#B0h@JF^={tOtn)2v%lj*UTPL$wi-zl66SOczIdOrncN{a0j$No? z@>qL;aWS_mCYynOC{Nbky}^0E7ix#fB|d}|RfNREZVAbA)LN97|_L#~RSKNjze zQce;X1+aic$dwEcH}n20nlf(lu@&0H?DDz(LUbhtb(8sOEXwqU-=_u6*^G)~MQu|P zxz1Ud4*OaAN9k2LQ>&a%@tif_t=xX7wFs69((S7=nC6zbXDNL6D$@SEzo$ygQ&Hy4 zC(NYEy%SDK#ly9ZOGx$~@XF}wtT?NwtxGpQgsp*#zw8!hoPCb?UGnTSRC69Y)!$!d zAN~(UK)Jt=R6PW_z;XP;bs$;WxD@?x64fPyMpbk!Src7}EXr1E>7#S>r0LCjy4ohtCQ+Emf985bR3b^lwMTPN@X852#?iwJgeuG%8+Gz zt1e@$wNKKQKjOLC)yjseB3!8{VmjQ2HEWCw5vqqdLC@`MRL*YKrK7Vv0Ss_wK1`3y zh<=VeDoFMCj$Ugd>cOl}^IT~{XNVkty-)PiUY4YbG% zEs$Y=E^3TUbV-!%q{LU0u_~zuli@)q6_m($EZK}^1Ulh|idbwY;nFxU%wCfoLLDL= z5@q}@D)UI`;~vC9k&6i$gj~?BY$}>{Wm)C0>(O@hAd_7}A|vtfSf*q*QL+#>Wx_Gb zkWolr;i(H+;%68iwW$by<269YER&)_nF9kCNRvK8vjGQ_@qtCM4-Z zQKw)R0?a{~51lPg6$14eESlWIjR ze-}8yWU(#r$@}GVHb0&7c**Nwc2Ztm$-P)%dG}H=zrnrLYcy5YD z@v+#$_zidK+xKY7G#$I9*lg;rzAij?lin(q?izjv$s<=%El_-H{ljQ~Y~~%$XpE(x z-`HS0HoTdvnd{)Hzh|lGLDa(O+6mN4e=r?H<=;8JgF4>Na}@Pg^E@{KE-I0SKawRy zX5t?HMsj7=7d0R8`^h|%{uY4#zDeMioTp2wn2DnbyX-ql3E?KWUR9WNxHFuhD)a+N z0@uX!WH6g3hwdrjRqpZ1|7Af1=4$*JO&*e>*Cc23-P~*jK0u-YB!6MSeSRK7VXnE^0uF=AtQB z-7E#ITTnFFM2^`Am$_-&bZ!Q>j9bGv<&;3NY21V?HA+447obZVy7HHxndt>4^TPyi zAuleaz)POI{EnqtZWjA@bk6J(__3diHuNpNQ zXJREC`jYY$<+He%OL)%rf0{4eRzb;Qy(Jrwd1f1%f79TCqXtf>NkaND zDean5@*^q#<`bt2uwCA}6{9I9A4jNj&fum)jki6E@=v@8d+45DWqj6?Xv%Z<_8i*O z-|PPo&>Pponlm%~^dPmE&Y&)FKiX$+I-TD%yB+-_S2j%* z_2$%f)c5fJR^M~ve^*_wYu5#&2HjT@?7DWAx(t1;K7#I3uZ?Ki4l2nvO57rDEw_o= z!QH{_AGMb+AjV^4dmKZ~Ev2Q-aP}k+f>lDH0hMVm|2p}@n~Ax!h6!o7cIYO;NJA|db581e7(7TdHUXg&MRZ*El=IM zux%RR`_OKkl(U7xj(tsglAU4tD0U|IG=kSxALDEDXZ8p;3pX<>%8s&C3eECGNyxpV^?(?& zDOKfne~wEp-2C{qJ1-si$F*-f@%Z)lLPNLBY$!f?-esE(3=m!K(%kai;)~vfx@Zl0 z#L#0i8Pv;quUopR8_&M<;cbs!N_5wM>WN=pTYS=BvUMBqMGFsYx?*7DAHBu`?OS#wh? zjebmrBl*0;p#H(oX4P)x@-W;4hFi^7Y1ZZ|-}Pj}@A1Xihkf#vX$DkdaFi9}Pji~3 z1Z@yhaO~Byc1OqVwlsUeAKNnaSUY)>xvQ*S|9&DT ze>>v~618KX-Lb{EEX8Qb8esPF&EdG(xkuf?_N|&)=gaBZ4Ko|<2&WIPy56(^=bi}Llgm@hQ`|MR9i7SP%jPDQf3;+5 zy40_0V`i}{7m97$*qVESx8W4Tc=We^>6Npc2>$}Ea zvzx#W!8IWdC%lj?#^nS^ZWaG_|>> zbAGOW;ndb84LCpg-MU<8>cwlG&+k%9;ppOoZ6)jezZ{JJW>=q2>l1xbmvYKD^$ zPAGr#O@=`lZx^sFq9f+ouGF4}6-&4J+x-Z4<+>CzLKbmqsC(4~8&|eBx5;7IDOrK$ zRvMZwwczEi4(tG0e`;*LXeBy}=(KvH3;H)-b>Nw8+q=45Hn~PvVYiHaf?Nn?{@{wvna&WxWQBp4anvk%Ovor& zy;9t$sCRzzs)3dn9n%BBme&4(?Ta5n3ty@UpSry~H+GIQROC3u+vLBGdqT6gP~CTV zoFDxU`^VQe{`;Er8{bu*cdv4fjZwMD<34)IYBwc!nLL6(#my=<0nxn`r#k8+mWh8t z&zYdAFtn)p>zs5Su08W;$)1D4bPk)Tg$y8kQJBe1w^r>2wjcDo?b_o?r%U+?$B58eE&Z*_ISkNmn6QhdDRATP4KKh4m*kTpZ|+FyBq zMf%sPBP?Inw~FgZA=qDXFy2G1g8zTpI1jh5>Xx0_Ql=zcMYTnCSomm26N+F@K)^J@ z4-lCiLJcZ0^AehgdL|OD{s844H|xKt7c>!hG@w%~K~s!SqLfmyITAAkEs72Zcf{)z z^D9bk?NHRq10|!$)MG#vA-}o!dFJH{Bb?Q3(G!HIyafFrMD!N7mD&W=Wn6!)wGB{+ zx1cHDkK!;3Ds~L$Mnp+_s;0w?{1B=?t6f5rz96Zgl=S;^>5~4an}}{|?||O!i1a4z zN7robRP<9Fo4Rj&dE@rq+bJCo>HQFDpR zpHR!zH?Uk7rDxEZ?bTe zWrO90X*P##icK>HOvi#is1AfqVvi2zpXv_1v8hUqL(%yHwTkYm1$SlU@B{zS(d)J=(zg*bt z+rHRU)3#-PXSLWfdBak0!KbfFUZ8y4W)#T%+1l|Eu~w#XWbi#@<+6B93<=cE7%W1|qC;=pdC|R}FKqH|U+AiyxOwi> zYH{W2nVUo=k2e$7j}0~!Dav1pz(wsq zOM*`bM54YZ5{XO^Q)IM2OE+(yQ#yNUMa`VKMx{G?uCQZph-BtC0rdczCP3QKvl{7SzxGE}Kl{Mh(WHN#NgXD<7&XyUSLa?JE z+~Lzf;NpsPPO}Rdnr6@6Slhf{$-pa##NLI=&!>xR6*cNe@uEoiqzb3n)!a9+dQNS5 zWkqQ)+!=0~9T9&M_}+tXl(5ZEZq#10&^R;!=^edD8l*5d2A)?LlBI|Z6tRGWVI)O$ z5Yju&C-JF;YNUx75`t;mY=YEmm%2?jKIM%RXXaS*g zbzS$(v9`pb)+?4w-8!W)(c*E`uWh(wXLrccxF)=AU3cy94ffie7TW}Wl_jj60HM}j zx4d!khQ@zldgI1F|9RuP89OV+flyOLR0YwN2{kHbiQ$AMKN5#g7ehS^^(bJFMmd}! zWb)LGne}jnesaroGs`sC_F6V`*P&fA%cKP?>pyfniN_`;dFZpC{d;1S;V@`%vKOTG zbp?##(8pICxM0?-3l2yNu?$l90+IaEi99D!FoS<*z#tuv(quDo2xbB*215yA0waPZ z1VYF}FCps!NC~xBJaMF2Q*=VQR^k$u5)ClO$uPk+NMT%q6d>^=f|L{>U7Mhi5Tg)i za?HIM_ylbI$Ulfl6y8V3@--)6f+;Ao1XgGPFhR;JJqxG$WD6h6Ja=RsPccPBJS2uR zfcbwW$I2h*dq^h*_RMq=_Da;;IhlY-9v{>QZl?EmQea*#JWa?Hr?9l^@kk zBilGQs@eWj&=TXcA$bmZ+-cw4h#O_DrKwCAPxJ2R(a+82E!#1|aelBfTNsNIHbN2~ z5Qt%TGK$kO<&Y#c_(S3B1kO>CGohj$^k08kKjrKQ0Fkq&)ZY)L)|apB6faw*oLJr* zvmg;B)?7YOxm3L0+j7?2nQUs}3c6wVW0D16uMYluRasSabyeB+ z*w6F+;wmojg|+P3)>(Z$wdhNxmtX3&VttYCYAUkQjI_-G?q-OX8)Wy`=9As`Pk%r1>TF@8-Q@_ zt)S=?x=4Ip{OFbQuGy=!$@eRuaz!6H{WWyel(zi^-i?daY&!21RK}7MCfVQFcQCG% zX9O@VPK0&JaAGl=+1J95v}@Lq=|W){Mkru2_BAa-Qd`&%#@Ef_&Hg>Gf$)F&ULPz! zLG99(XrYPGGjh6!cBt&UT~ksd_7y1NuT6RyOFSzsfW@%2?e zLJoo%`sKr5m%UQ!u#3CdnN2hImvqf++M<=tc#$l&OXsD;<9{hGejk6xp1?P`>TB__ z?6@G|dYSS3M+g`tV_d_gZ>+1EXB1pYZQmm=J@U!E&rbvC zaQwT|qdA;^&g*D=04FH=0yKtsBww}Uq=^fx+$n#kS)^FC2N36XQk`4yv-n2iq$J&A-~A{ zkv3zb7R(d5hH?jz1^-$;Uva$xdgkP11fu0%>}>=h|uwH|kCMlF=KN%CV!FU078 zC3S@~Vj#YG z;fOmhYLiT65(Ywy!m|c;n*meM%aPmB$s1q0F<2X%wR)DPh4u&I9hoiz|R;=x%=xNK<7MWjH+g+4RxA8*l8x zB23M!Sv9aj71RjIaClmi(l0X@WPWASw8HgpSSe^&_#`k~)^+V)_e1!`N(fhCp_Iw_ zp5&AjNlnaYT zfAQosi)mt=4%eW&xo6Z)yZ>P~CLRH8-Kf>@~M+uAZ^ArYIJ0I0CiB z7HhbsqPDi8CTz77*W!J#qMEHUsyE-V>VeG@CvJX#jQRo|y_oQFg%V~x z@>iUVJ@U5#x^c>i{zIj^?}5Eq9`q7l*dTvl*&IaGTA_ZE`001Q7k6sj1QkCy&~m7M zMvLq9v1JUA;BE;EBNwY2$)Hc1w2b&Ms1@!|78LdrWgOJvnxOO5YAr94HU_(JJvy4sExjjNlx1_rvCR~uh!arO1NS`vr)7Z;b|kGrgRF~;V| zZ*}bODkr*X%LLuht%r8e?_`2ra`}JlQd`W-OL}pn{uqpm+mA_6GBl>dHAcP&^e){o zDPMuu&7`-7)0Iuq5h6*{y=cSBn@!6OkAl;kuGDFa9&2Pv$->Uh1{-F>Iu0({ggr| z2b}3ck^N|xIJy^yBeJP<5`7lK-{6mcR-q3CN)WWYBw%rH^!oRNmji#I(VKSfJu3Oe zr5qmt%?1+A?p(r}U>Y5Wz!^N4cNJu2cmo&#WfP3DqdcXfJ*VtZ91D_(PDqyY7VQP+ zDAnTc)L<0}0iiIkaTeZ2%fq4UTH#(^%j_-cEjgaVcaf1ug%0tuVl}8&ALAJciv!0f zx;N`s(+=i6peLyOI?jJM&tc?`^|w7l{gQf>`hfZhNl-fA0+pb7EH`#^)HXY6J1`Cx z_Nk5s{vW&kbmxz*FGd|VWFu0?;67pQ>YSLC#{{SH>n94<>67d~@qh7rc#{1i%ZxEv zaoq?A7gfkGKa{KKzs6R)U|;%Qq$F9ZTrbB;{09Oz)jV+L;_-3A@ z{!D%IfB!4_pY+mP>`Fm@wSg?BfiF5TBC8ohOk*+hBc7ZF^M9mw|Iprd0&Bu(9K`EV zFC>Qw%9G68FWWak0*#WGYbWu)t&g6jM-5-gB;9zxb{|iYenqFGg7)_2g3qM&%KYa8 z$Q9yH5D6WL99Mrj_D?rat44aL2~=!WoD<0F%P~~=vNRQ@+}o_lz+jDVVh4!_J0|(B zbJH*}yNNG?>`iKMu?jCa=yb8nE{gd@>moe z-J8POL>PaX1Of@nZo%3COt{fMq=#u0ZZJ6HPPygQq*acVLtxOYz?xvf-Qc6KoR`SN z=*UnnB;E-u=9)awIBCyN+!Oa8F$rUOPmeNaVn`+rf0%HCAvc|JCvZ;62`V~WOr%n& z4-W(E$W6J2heq(SVs@20CF`izPzgqbU@eY8AtHaVjv|%k#)VmS)ryyQqr@eQYA*0Od^a;NTnNj0c;pqFo@*rne@My z2$JGTu|_+ZZ{%byq&0A zC#~){yWx?sFBhGG3pUPfJQkt;1-Fv-h)aK^0HZ0LQAf(0J)+;xUyR>aWPC$?1J2Fe z^9Of=lf7+n&zV5OMCiHFJ^zCj2+lm&JHhv?MEBg9FXs^odmECOa^#t2(ei$*|W1PtZ^0o#rb z3L1ty{&)%-LI)*yt3i4|uOHOw0VN@oN=UnOZ{ENy49_LT>RvQUyhebds1r!4qevamZwfcTAeb(c@oL6(0^IY)I? zNGUY_2{bj(B__KDu#2C}W{LhobtOYx19b8v2Ves49_WH892!8TzC-;;_?1o{XFoM= zxwWuB%|WsrnWqb>kWPI9O^qqoKo>~ja-ZY?lS(H>ml%)|pJYE(fM=Vc6qJFom~UZ!=DhANpKPAy(42p zR8nkdwpYqVBei7WJqtSD2u@sJq%q7y1~?Um;<4o;1Fh+9CT;e~&+PR*(HIs?o4 zT2^kp>6Vq42v?*8tTUny9RB{!C>Z>)_*c$rR~U>sg-_NIUo*IUe$1uDdCcTA{DYBW z#WOF-;nz~+JFBJ^;gMepykSsFnEMLWEfU(6HzdW3I%!OSMhiwx%lN!uCY1GrNp^B< zMkmHzn6x#|YqsGZcvF9F_38a*m)<<(!6`SEpS?e^^57-i_jX@$aAjhsIe6){zdE#R zR`Q9r83=n&Z0fjE4A9n z>3e|u)eB}0H2D-Vp|oZ7#PeVK;&At(ZEI)G^SQfct=+b8&ftH@@5qARLS~%9U&$#) zTZw@Qsov>C-rbCeXvdH;4MB1&k%L-F(}>woM1HAA*ByPw-)N15RLSFA@TWHffvLV0&=U} zRwcJxdhew+`Ggv)sFY%7ByKG*eeDBZh{Inzuof)=^TmGyACD$)fBD?&t~(dq0Nti* z)v7MLRbK^OEgxplUr*hWNKAqvs>l3 zu44Q@t6RiYrO#GNj&6gh3Kjp;x~WJ$Lpk>9XX6fW7yIE=N(Sv|qF=(KT@3zbHIbZv z;PL;c@EL!(4lSfCjP@U95n)EfbNTg@&l~c|Bv=ej4V~b%DPEh@@=_K^b`>TvmB}o` zH{VPheD7fDP4P`o@g|*o6QssmgICv)>SQ9i-V_&!ZzhwV0^AEQGrBHk2f<^p56NJS z)D#l`zJc07?ID)dA5o7IuRW?08V*oB;sxuWf^~m%4tj5B9n~Um@^enR|77cI;kqHW z9>v=NVLTh{1JL*C(f_1=NRR$!wirr3j08lwSD(%uCkrtCW_Br3neF@%-F5(9@I9JV zr$@ghn4%b26bz6vzApGpe?4ZGIL=090i;Fdzc@(F)8m}n;UxaU52EoemBAO4Y;$I+ zj9PzyrL$}-5N9A9Bm^%3jB*oZyn)$_K^$1hgYe6^|EH)Sq+wOkXkaZx#Dc-(pifCHJQr7ELZnOde=hD}J*=$LsZOmv7;fcXbZ@ zdLS4%@2FYfa=F0YVc$}Bb^OBgeVcUwn?rwVrZ@W<49B&^-}X;K19oC>PqQJOWw!aW z9%s>_28CP*z>j@KQ+ac+B`yr8Sv_yW`B2%qv#1A`Q8mz>+HIV4liMKUWV$W#nN|D_?S zkR3HZ?wO_XXUo8s|Fed~wj?B%5PN}NV)z_oFEATN=j6i9@eBw`rjpkV6UQfwN3GKF zttMh+K{g`p!<8ql<>oS9kmuKDcuRjrn$yfi1)9+@`5Fcnz%bh5789-?&$_0Blf=sz zi@HUlVZe521ztIB1@?_^d15@rzCjlo7>kBgNh|5T@hg{)h5tEa!Z<^~l!ffU6~b7a z1jNs%r8B@5JPywrb&?4^0g18%)khMyi%Ub|RzZ+yyyej%ncOI&ZLs|M#9M!Nj64V2 za`Zm%+sPPlCL?>}!0$=o799CMv*CuFJL}X2Ah&}9cTbtEIX>z<@mSHXj!3d9JaI&} ziyfkrR0*m>C2D)xU}5Qy0tf`xHbD54Fq={glPMtyTwtAmxf1~K);8ziM$pov2H%L+ zFJR3UgGFo=ThYSIE)cJC^Ob+#-ya%_i%cJae^>Ib{aCHC3A7D2yY2<6+CWsiT~vDl z>d!w{2RxXE$sOk~4O6LD-^s;un8ZmEQ%vPS{5@U_f(Il#5cb@3(on)G&5m@+>{Iea zmeS}QypCgjbe!@*)@OzZM@5MeCOJV{n#CW*vN=SfNgZJfPymnQ@yma?^*ou_2}!Zd z6I;ho@56RG668_|=cbeB?+BC3x+aDPM|djex&KD}MWOhXIC9Xbe?ot~1>Ow0x4@(E ztwMp${`c?^p33llFcL;FW}cj$x0~>zV#IN*k;Fe!42Z!?%EZc!b0$3YA+eZ^W_AEK z(Nd-V@F_`Ut*wAV9hZM5=T_7rm9(}Zvxu#ZPn=N}GLTIxxrBL&ET)p*-rB`B@xu#) z>l>7KoQ4WAgjpy71Bs8AOkV+mquX(9QIYs1?=yj}dFdOz62HoT z3;`bP6Ccjt2!UB9cvZn|(*Klh4Q@C=sjRsN0>uf6^aVf`k%A=UA#(oUIT$<$%r^OW z@kLa%WM;zOEj@aMOGQTn3q4qN3ktx)Q25yj+lPwxZ9%b^MFq2;zK0NDA|OYpO_NHevw zmdvVcERBS<=Joc#-1TQ&Ry}>uj5z(tJ@*WkDb#-^qxIN5zz6jAe#8V7YK6M&qkF|~ z#CPC5uQ-bMM1Om0xWyB!4yhc=0>u+|tg7p2Y$$K?bV>b<#qnbFZd9kqKcr6V$?HV_ zz&d@N78!bEow_!jb=jm4ksvfFPN>uyr&Ey3&;RuXq`su1aFXudZ!l+Qx&CNv}Djy zvhlq~#?QW7{<05;M{*`Fr-c#g)g1QZ$oA#?@k zLo2!hVYL73`CS{)S@W6`pHu;s1y)~0rMbSktGs(Dcw!DdbV2CG5Q{_&WwbufQQ28K zd-2ll@~-N7b7h6k3K<9iV5m`-W=c{Yb&h&kMiyg|gc~nHzCVgH{8Un769 zu2b&JI-UjGWEOCnnWXscy9ACgV`Bi+yW+dpWI(_s(aH(xsQBGc9Air-lJAR8TlY!< zlzXjU%KOp~A>mjOw4k*jwfE@Jy%7K62wEh|Y$Y+R?RYjvH_R1B0i;NI4mEl~A;(l8 z#1&#cn2iA-fx!da8k~l~tQT)Mx;K9w>pf%R)1a+7K5smcSN+t6KS&HYSuRXeV z?cH$pnsu9`3Phn(ydk;wsL&h9RKz}_s+tZ_iLSKcTi_+S1FqrOxmak4i^(g+GNA8L zFc`HgA<)cWvNH)Wv7_hjsrFU-w(W}Q)kSK3bl0|htJr81g^{-V!I+drW^LgJ2m$w{w-dabQZbkuj9$H5P-K73wCgue0^+?a_j;Rs~WtgRWwwcit92 zLSD7j^6=JSGBwfe{`;Jpsv4(x*hbN;=V}9&l8YIFgu-@>ynNEXpayJq0WDTmLBv+dkD_A?Df0EM;_4>IqL3vNqpob@xSozP0a9`pEfp? z!Q*L`PSm+Q!&B&|@gJBnr?c~yBV%3gfI|i1v09{6Wik6@B;%yey+dEQRuIIOK|~PN zVlA#g5WsJRT6oDQOXijMD2Sl*Y6W~ngLE={`=mJY((}=yLm7Wyev2Xlf?xQ2_%eE& zbUSog5D{M{1)(R8em*W0E}B%#m(h9niqkzG#ADfv7KsW#G3xoul?AmC@|6Um8vsZx zFuJhd?Xh_Fp&& z{A@K?1>KK>w~np6^G?!#)h80N|IT3Pc@$9aa4fp7;E8*Hz&Z5>fOr%VDVt&_{mpjXQ?ACs|Zcu*WP%b{ZV)%VPK24jKjh>ZLo4 z@KPeJ|Hyy4eKL-CoV?xpBeElXu5stm)q26mOW!|{8+>E<#&FCg>NFWeCn~Z3GVVOV znL8sHWT?;bZZLw0oFLq0Pver~r;DkPJ}gPEC(=qD@i*v}>CJ9RPi6j2<_D3We1SQW z-vrJOiP4{!{2x4xBLsdXLHC{kT0X?r!+E(&E7E_vPV3DfHWVbXC+RG%*cc6wJzczX zvaW=*Qwm3Uj=xU3vuor2d&4TPVGrV+QEC(c%!h*s58u6)5v_^yG=J!;9*CaJYa3Q<) zr=Nd{AKt80D0$6GVA<;&IiOSlS7G#{l(p~u1WeTcBRb9l)q6K<3`Wh(!1d`**RnvV zBzw8n#k*e8@Ja>!^5~ezyx-0-iV1`a<%Fb&=n`YtA|AnER4$L(t=AiLV;BU|H}KPV zkPvtwkWK~!xdOe**omm@MfL?E%b|CvVDo>o1sm4z{L7xF&mMh(3E~w zd={*S{b)eO94zTWXx#4SWAx?2+XEW{yXpo8>vjeL^yO${C*If*3YI+XCpK!2xvMh5)@kfG$ECI|Ca=w2P$ck4{S-Ctg(wilvj|MyN_Ag^_;| zsq_f$)T(hT3a5$P!bZtqV&$PFM7w;@RT-|=ZO0MczC6t^eT*+j;lwJFT&^Be=s_Y?!W--$!MC7S?x61uU@Iwa)TLA~ z83?#Q(rgx!ZZel4IT$^I!o5w%+G~F@;ewb}(cmExV$6+0yiz58hnPY)6;pNtdZd`r zss=R*1xpFq;X9_eMRZ?~bOi%2sY+>$!bn-bUmy#BP+k@o^BEq2YcsQZRiaU3X(` zT`zb;YY^WzXtW04Gl<8bTO3Lc(aB{+MK>086)l5!X1fVYe)==1A)xsH?@((( zqq==BKuScYv>2a9S`M8jum*ovR#=jJIRZEzT9F-eih)NuI1uILZndqs&_ZHK`T&GjfcAB_aP*hMlJYF*KL-kPSz zKTy*OD_FUswra4$WX5WQKRauOd3FaQIZyg??qa0DF}PS$_Gi8Ufcy9>ey z#{?OIR5A%>r~m5&g*5W_Ng$$hHe4}kO3rgOVN|Qi3?_&4(V%7+JyMKrCFWe-BBq2k zK}=bALkUcl+?a{w)X)Sjp|FYQOt{29{qQo8SY*lP8?%7ZmMMYn?~|VO=R*JI zsLp*yK~oxV+onIK$w*ADpkFC06OljZf1xt4D=xh;i#Z8i?oUj%>+k^X~hmk`ZXV|RkJ^?YK}Y z+rb$_YnQ1MGP;~LYZyjnv^iYbUC-BmH}wi7ZDk#zm8QXqIwT=jA+Hj5PI&P`-tQ_h z=^0j|QUC3*+Jxz9WGu@v5U}qHn#~%aegd!EqUGNJlm$Isa~Qj10nN}fOb)2k+Aa1# zhgz*0Q0cbsqZxm6A%HB$W%O}+7_~=hK5}-XC0{~v!OlONqJ??KB$nrFYOo<|$)Sf) zlXqx&L373mT+2+FId;zFY)zO4JX4Jft0smIqTl%4VP1QwMrb>~tHZ_`bn7_1P60RX z4g}_$?+kR+#zK{|s@h7!Hp8>G37Si_eEo*@CSGPx&ynl28rl+XSy;B>979=PdblcD z*BhS{u!DaUH@$Cv2)D*Vii*mJ6+P=xC4?%t$}V3pyQs!nYBA|~pQEC*zHwUV{@0w3 zVYuvvWnNF2Ud9^_>Hw{zd0(+*L5IB}RMwSY5cSd&9k zC>J0c&j~QWtQ?+A_bvx!3--?J=C$`)-n{=F;MadD<)+{072+!x&tqWk9cFPpv8mlw z|A%XE(P;AheOhIB0BM6|Yqk7=$Bd7NH|u#`4K}@`&|Ihy7IgDkbYQcfxfq{|R-5PY z1h^218icc*^7t}@1{o-lTz8X1jv9=ue1|j2;L-hWXG~$qa-A{%>Eza= zQH>FH_v6g1ey}P1y!asao)|1SL32;mEuDY$RYS+~^t$IS5EI}Iao2yJJvw*|?YJJ5 zeY=(~;9-(eY9#I0&}e%W>KTGhFdHqkF(K};cp@Pm-hq@LX@{gE(xk`GK3ZbcrgNpu zkB4;jy?BHXOEX933=SOj&%-%~rvm`C`Na3!;Ev0ElfmIxcg{h3HhILi36A+&cX5B# z!&dIcuit}~DgzvR4cF%(&sBJF=3-W<)bF#iOTfA_IO{Gew-TJWoVD-ME0yfhP56{+ zypN(WV?HQH>NA6x&K^uAlWC+%i*KO~wChMR=|;UYeWTS1`_Qje3HykwEm@YqBArHU z6>kK6R_Rx*(TVqFPQdzY-3f~M1hs!-gqlilh0K@$M$2#}U(_2i`3zq48O4zlWQYWP z1{{=VsfkA;rdS01IBB{z%y-;vg z42nMiG^^IzyG}O zUJ4O`x#y=-)tC~HNq?;re}$tX#1yu~rAYh=4t42BKLs|c6_`9u&3|$ZjEh&xbSkaF z^xYfc(DbT*RZSN^oc!^fA2WS_s?sw?;8h=YW`Umcf{`Wg8pj6ti$7fg4ZK1@1A6P< z7N@_I^C}484*H`0{sVsp`upLbbid^LDXe!bu6H0`Z}z112BT_5pRyf(K)r7pQ9I$J zt&pqse~njbaX4Q+=E5;ephWW54%C0W8EiDHm(^397$+`pidQ_+VnF|g+i+<7Dl_gv z%K}#QlcXaj$%ZHqPNc}j35sl>-`??RT>ydq&(o|*(_Oayx_p2AN7piNidR3%f^wQ| zW<&)<_xP;=2S?R;L~G>R$(^gpmhqYbY&m@ckUr18lIip9I0`sGoczRdfAT&bFluSS zdJ&i8(6|rtGiET`@dtoG3XqI|11>Nx3){A+v9_hNqh@mY_LEflOM6|{_DL;aD<9J7 z1HpM~^w2b?qW^!A181Ipms2di2S85Fw{)k@|Dd&h+Ljry1>@B@-m>G&?rOc9+srYV z?F%hMSFc%r@EKUOWea$iv$A@%hHqH#bb1RlrtWbP0iCb=smHld)e}zD96zA$uNBts zH>YR_CR6$2_m5Zm;nCG(BjdJ578^2=vBNIQzI7>JW3+$WkHtuWX3k7F)npvTUj~G} zn7EAz>>!3*g%WD7$%x6(AcxIMRM74S1RVC@V9+iSA1`p*gUn!DM~4jtT}aW8xY$3# z(01#>ndkfLLBGw~SKZ;^?Ft2_Dl!W8aA%cArvQS$(^@$LOtZESuMN5oQ z3ipiWy5@iSz`&##(B-g~0}!yoi);Z1w8S3r+Wdb(yYKv&3vX>R%0w1z=-}u zS@eIGapFZX=6eI1i4j7lVDS-K8BE43TMil!N#JWS@R^M0?All@=61q~88x7m(DQlR z1c5XIaOo!f42kz#$VUJ#O%Y7^N@BH;xFi|wFxZA6Qx0FI9AgZ4HxwK6dPDJ3ZEfl2 zx~9znKWz^MJPKJG09vCNv~ucFpQpXu?Js{-bH^dAc0_B7O~&H24%5Y6s|<)2B@)mi zDBH>}6F(QfxU6EL(r8ppEZ+x%`^wRJTC-$&Bsxp(=6tGYz+)<|jyOyvN2I#g^muza zfvj$qsnFfQw}l3tPj9Qy59uH9Mk1d~78iqiChrojDXA>d2Z2}orxog4z`E&Rt*L*k z)DOP6qomCAgrZn$=1YQ(#)}#q!C+CtjENCDP@7bA-K~+xt+i?Tr*kVBS)Gn;tXO#D z;d$jvc)h879^D8^e)Aj4GRwO7@6XxYP#g>vH;{#+32YJn=F&qe(2IW#@Qz9#A8Ery zUk4g5|AxlPeE(QVt)g~P`>0!}hlqckj*$q_yJnHlQ(F^=V9Z=Y#52xo$-cZO>K#$? z@&ZvG=`hV8GUmm`G1HG1ZPpMbU{2;HT?E5|qh8@AJp@E(baxDp91*g8PwHp5?*+!` zq4bL(i`i@mf$k+sh8s4B&#zw%+=~}G9Xt&d%hlltF>pj-h}D!YUR*gLW>9~C?xkp0 z3qR@zwRePyibIp8B1HwJ2Nx`WuiCYX8lFnqp8!!nuD@zntg)l@#wX#&WPRAa_T1Il zsz6cy6!1h*U{ZUqs3_PzDNqDvFOAlOHS(o^<{eJp|3kYORGK@&;f_N+J?Y$KO!-c7Hc5RW^5=4v8J|D=WMW(OjX!0aPv5p_5e^snETH0h1W z>4l$dYwVJlOtP-VfiLkoXEbtXozaS$#eV?ZwEgSmiQi9tXb!qM*!55szDc*JiMIr- z5wKsp#skgeV5byAiTQ*7O$j)|AIKyPIxf_NvI;Y{3Y)S<84v?_C!DYR))D-F%4Afg z0k}i0Qdqt!vC}W8ROzolmrAKLe^q7`kMI!KLjN$+Yj|;5*o(Od&@0sGD#2>KX?O`p z-()oCD&bjf`l`x2&jKEs1j37lkxa3@2YV1qw9JB|u;PI10cJq9Vj+OUaLX9y%Py1a zDPGRWcRs67$n{UV1Uk+ce(n^1#5G9WHoBkUIk`d{1~;5`8UpucP^E)6B&mlHe*YNUG;_>B^YsMMD+mj}rAW(>OO6e*Y2 zn~F_=(ReS*`{}AwwF#bfP|6fgXv_Dmn%Vk;!tYi-4i=k z%WXFK>duLGZydQvNqAMV6uY1JM=_hT3w_#*37A4$6zTowf83-{Bc=OG@qW?FR)}V# zQ(LYD3jhEM({sQAkr#i$hC#Pz5$^*F!KdO+M4oOIUlsofTE&kxihm~D@_~)Lpa?U+ zi61fVh<_Dd16uK);y=WHUx8wJm-s93pI`#Pxu@7&B<@a^D~%6F?y^x};7pznCZqHi zG=K{TEcyeS0&*ZAa5O!bZl)gt$FK8&bLqk1cVJ4BZtaE-gwpe0fM?819|n(ut1b{X z!?ts;Kljobzztw&y4{D$Gn76A`xi|-G!eY<W?|8yFugO?6*tOuo1KIq?(Yl|DODY4eL8 zJ)XSq@y9Prg4aume^OjRetxoT&hhk*@3w5Ja$!ST_k0|&)d zhTx;=nS-EuyjEJD0_qK6`5r>XESc=fq;;VIn-qs=YjKY;Ne zlT81(eLh=%QSKQQZ~pF}&ZJ>EsPLKW3cA=^=XdTr3eE?mw>0Siyt{RV+tA%@;MI+W z4O=RT&YiS0DVN^}&vW<`@~Uc1>9rU66kKtUT<#m@?Q7aQjT5S9gWTwi`g)($E3Ugv z=B=Zjx<|A+Yl{rKf{p=oajBzLQS$%T zBXD(f`^!OjXx=pWqP_hzj8{&+`UzuusN$CUDuV4MP1x)F?He9{O`VF>-68hfsb=lE zs@uMQf7I*LU8*pY54JBy{x@@kYc$F@n^CZGNML6Hx{O6jHO8O`s6fqssPP?89XOu~HLDl<+3-*vrjdjbMg57O z^Lb1jgVBjvkbbz!^6=umBLlNM_fFl?F~P_Jj`?peQ+!0@Zl5sg)h~Q40M;!#=bQ%U ze%roq`KE=HEGI4+P9JmDMx6i_`p+eX+K|jA3&W_v6UBiN9O~sr(8AAZ0b_iO11%MQ zjs9Aj5`YubQ8{33(KQ{r%NO3VYSN|P&cgPa{-haLN=hx@s$YZ2%8CVj3v73bJ@woA zCqgiRsT%2Hq)#MZ8r2;m-k8T%mEkvfjd-V0qg9HxY2*rH25S!~LwYf(RDz^l5E$YM zIG&BwpkSI!;d^G{L2{78@l3uIOy}-@W72Ct557BCrC|i&I0=kqhJt#4ZZ0PE8D1zr za}=E>_sk;5XYu1L5)cJP;S!806dW4)jFnnagA7jkc2lA=@t}K6C?8zlUcITEGBhs2?mlRCpKd>k|^yV;(NnMi#Tc>M~J#` zcmPhi=E#?k`7mnC;C;8n;x>b$ZnN2K89rXt)VQFjiJ6_KoZhscX@66Hd07*f7EZvQ zY)B5TN^YFOsWsfx6>qMX%4yUbIE0Tkm6bO!#TI-Y>Hn)uWny=EQ&TzkNm-MSUK>vQ z6>t4j`b~u4&EWd@bKAE+7vH1dWa_2)MX4Y@ufuht#18X8^!xH5dUfE94=dVU=35(qXQO!!n1PRj626p*D7ZDk|)@7@8FHwlYJ|>v5Ph z5XxjKPD2;Xj+sqmW*Rt)HN0iE90Hl#8_3tu5mfs>hUSTFXJG zW#o0NhSn*66f6ya5;BZjD+hWlj2q36vswc7pgg#u$gnoZTa;dB#R6f5v0{opQdE3b zLP+?_t*p`u02;oP+64xu)f9C{yb28u)hq+NH0?EB1xXelqJd86{&2_2Ox1`T|? zlamL`LE~9kH3MtALKCC?{`yHQk`Y$L7weFyp;9`395FBN;1ybE4)S`VpsZU`(%9S? zouCT2Jsw&Mv^u-q!K?uSkfEvo9j(&H#BLxru&i7OfnG_=@#}`-&Ae4-bLfkeUap*- zaF)^7dgrzh$W)#e4mG)WHE8K}`pu?^UODXqpr#hkZ8ky2F$vaLVp7oZT{;ELaP@5f z)Vp+l6)s4t6rflzJ3*PB(P`BdptZAdi%tcg0jL!Qg;s`2Ld#r?z#!?9VRRM%)Otau zU=)yL85zw1ZIfNCYH=xO&el4iqgZxtJ-=3NHMv@giUhz;T%&d~mP-}7a0#tztPWc{ zCJYVjygDo7OM3^8vSiiY_zQAylwHXZ*FCqZwK$;{eph8Nd&z z3~~Tu05A@k{T#~VPzN*`8KYrkG-@`$9D81EvzW~WqlRaMX%0QdD~ipi8>5$0weU75_PHmh_UT7yDnlgr#%T2@gzF=Y5f?KH1{ z!m2kHW2W%6u@2+awFAFha(=l96g$cecdXd4d41z+3#+G;KgkT6?MaGgAP~&7Qu@O=EWh)`n$FAFTnNRoB zXM3AXZt?fxA+V^c=Gy(|2LlYh?wkwur`#Y+zxT%P7M5FAU5q%ISjP28RPO=G5LHlP;?r4gZJC)~+(!u=rN||Zq!mDPg4#8`yTb6Tw+6z8h zy!e)$4y^{Te|+oiiT}Let0vc1A5Z@qeI@|c+$G%qrhQVZ$s~F|c?76!iTci>Xqn7{ zx)+T!0~S6%9*$wA{aUCVtb2s%Du8*JBQ=--HJhB(L61qg3F&PAoOzKIqn5muo; zKPGsKOJ;hE;>KXE4$jP6A8J^CG_$(TSyaaB4wQG4_$%yH^#c#~b|g2o2d6D)I=IB_ z?wS~xQ(ab5Tod{4`#LY#)CM+uczAc;%+9OD-m%oy|*|0$RUWYb*&x+?AE?rpje|0+Y8NIQ(Ike$z95fW5kNX5VgU zLp+W*h%KuE=?yQE{E$|vgJdyfeGGAe>s>=Akb?!D!&qFV#9R0y&vmlwlFf8*-_&W|DjRH#U68~IzFSD zK4(S3d^^)JlbQ8vi`Q#^JpL$pK(Ad_tlQmeLf4iR2OM8^iaW*M8O){%vr(xK9X3v3 zp26;pujua|{>%XC!Jd&ex=eg|U`+JmX|O@Dub0TnU?}4S&20?^?Z=3lgGIk7hWJp2 zDMESy!)+;hQ1NZ$UyCCpb$UQ`t^>(+oq*Ddy?cJPXV1^TP)S`m zn7>zCqvP#C@#}C~TNvnrc3uZ=*(*L!URP3V1<4H?#H5w(#TV?6%F5uf21s;kM$q-0 zWGS^-4(E)j>#9qCv@L5Re`tN63nse;#351|Iw4B@a=pU?q$ID26Y!EgAQG%RFxWLP z0A9|QBWv^W;F$InY!=9}!9gTanJxZ8;|>dY^oHW9k_F9He^aC1+Pt7NTx`%Yi$)DF zpMiJH(|TQYB(0Q`6nTN&)jQ36)i`5B1=20vWKW=e)QRnXriADW4G1+YAb^GyoI4f@ zki2Dd1N==D2Hvw^>A_>yoqblROUr$VY7=`Rb$640_>;GHfAPTD^MCW=zs`FF6y16g zu)MTW21`p_vtHeL-LZoa-lZ*(Fv4W1jGwqX6BS4dot`nV@niBu5(S79aBblijE)>5 zM`V~k>cH~b5mpr8Mc^!EBk2ZcTtuIRHw>$? zl!dK-AVZeW2n-?oeYgnHP6lWPcyMyQtT$*MYJW`-_!$3N)|hBpIUyNY)7hxiJ!vem z3Ic6-p+SPoI3fgVg(LKgBSLLZI5K1xC#RD?2g;wrCAGl^cDyds3WD$)t1oriG02)D z6w+v4HR<`N@vmD3am9kth0<-rKSAo^pZ^?xec&ffP=MRXOrb6zad|N zDSE6dh-OC`jr$fOA&pjL=@R7E4mjXDrJ)|T)Ch*;xV&~TJD%qSE~(1I?rr>^0P7{FXxbsq^*iA zT5(Ya3^mW1KW|2(!CLUJ9+ef{m|E5##tJ}L0FAM7ZZ|S{?1Y)Lfc64mWY%Eq*!=h@)+=6z?5Y( zV*b8$PQ5ss{%X!v=8wnAvVU9W(6i=j1&+4)JH&qh&5rqPVDbs-1el6`u4r$cw_`_v ztZ75iQgtTpW?TwT^GTAXm}G_oG)qt^k$~QJsst){)i_*#pbwlXk!plooGI%_CeuP9 zQ~so7#eAQ*fO#5I%mO-i%EAt1iU?XUtEj|gDxNrHX~)R$lFc+yWh8ONpe2$zQ;{KEIj^ z&!}C0I?Ln^Tjxw%XS~Q4NXU^SbzKoB_e0tOi}}*HCVb_=$SS+qWSTj6If#JZ2u~cy zaZzAh+6Wm*rOO2XwSs8jdNxf8i9p3jhGb3I6+?{59AuKuh(~`psO8_LWlDv{@@aO- zYtc@yLua>$J2H!-fFXNf>X+itXLv1K)dpmLN`2BIpRzo+b_{E%k8fj*c~ni%JT07)aE@I0haK%N`;LWkO)$Xp*$xOk9tQ^CCePXhAukBQ>;t zPr$Ibz{x~dPY`ZA>-HoX8n}j;GaEQTlStlv7PGkQBK_j?Dl5-htiPyC7LCs7=r}%~ z{`TFk>IWP};*foDW$*Ih+iojf-Wy(I2X01NRnzGQ&krlMfx$$g%44-bgVg|SR!>zT z!I^1Yq{3ej(a~mZ*gxQRPPlG@_{U&>*#xT!X{* z595y>Ynzfc3Mr`h)hua3E1>hMp-h-5(pK}U8Q?k85JEf#0yN8h)iQVagLT}z#;TdR zxcEX`KCh{2hAw_nv8j1ZyyDjNx7y83-SLXsqSApFh{fdd@yXFUP3ETgO%=C)t-s4U zJPcy%#TVdrbDGcaG~Q#fH!g@(-rawf)q+=k^#9TJ9)NKa*B|iC?C$OL-tTm$>!&VV zRoAIl&FXTMo7{Wv{oDWp25j5_g9Vu0jWHMu5j6=tF(iRM0VjbZ5D2~4)~&yp*^?|A z@`rr??^D^GwmY-CQ{J2R-tR?!B^?#$+9)WAi97LKqKD0<^3k!pzPWw4NIdt}xTw7> zuSpf-UnmyyXXk>l`IqkdWD);vm*|=RP1>1!2}rw>52SnSUusEJI&>t+W@D)53pzTV#&TP;d%sLc*qJhj)b+OLM zxzpg7M{nHZ9Wf$vZKl{S=3B6XgPB>S#X(=YC3Be->LeP(xv)}n(!mE!?bM)5lGp~Y zs5duIozzrnDMjhfO6Z3Kv63c2B)>}7AHiIhZYas^_r$!|jkaKdiMR$0;3cmC2wbA7T(3KU%hbVpOI#hT?wgmjlI(n`^=17yiwPS(VtvwD6zgXX}(Y-D@K^ z%QYfeCGS{sH~-Ic8kZ@Z3%Xyr9?0fOwwc0_0kq5{UUHcrl$AOznGWUTr%UT#qFg-L#^Sy~-&&%7Ynl7`Kk!HRKitn~VWlx*WIBxJ z`WQKrT9H#MswypoQi-ZxC6U6?(rVdQ{!ycm=|$O0FFeV=Fk;mR^asix<2b0!7xRe6 zeBFK1OmEYF2tVJhl%XFbc*H-V$^XXsIpTaV=mmi9L(jkPe3HFh(2W5)EbP$vDTrkw zh+Wf~D(N^57Gc0SdV-=dCo7={^5-9(R2s^utJ?K!wr_XOnu1ugxYVBTv`P2C+Ej&1 z2A>}RUIf9bRI0_Fp_WyAeEn-RMXu ziq2l#9V-|)eP+0H{)G5Scjdf9cBeI8pHneD;_I|Tmw;P$ZXelFR6n99(K8`Y)WH9% zZ~I4orQY$)+kht1X~;M3eWkIg<*gSjh28>FzPu1ZrMGxeS@FcOER8iXnLb#yV`Epq zRW>t!_Ux{R%T^2<$5mb3)405$EaCQ!sO?C$P3T&;yt}uovGdCOE^StIRxpowc5l~> zv6{q?4afR zN?>A#9M1a#KAIs;<|(2-7>fWsVuG=t9aMq{dV^>ZL$f|XB+B$+G-V?3!XAS3>Ao7l zn<9vsp{qKJOS-z3bb@_LI&qM$s*JEZw`}Bp_0YrouQqJi$rhGwpWI#j0~mK1V^e{D z3C2mqtqT{nwk!nviz`6G$BD6%xAUL%BoaM|Gri%WZQlIKvFz`ctX{oj1^+ghrrusb z!icJ9ME}>8jIAv4ZA*P1%QVWSzX#u&E;DAzT2I20u)MgV12q8sl#tM*$~g{~eeM5@ z>KZ$?Yt*~zGJMXNWs|qZZxMmJlq$M^D^$7g#zhNSoB2J;gQeTywghfNYD#VHwmFuu zsqsxuzI>u-WM}8drV}qei36}IzoBxheJ(GP8C|mJ(`7EBtTnyX2y3Vj@y*#(DYbxF zf$4VPZ9#%1Oan7LRs;>p$+Jsol8MvbL0Id5k(j192!|sgi>jBGIbJadO}-WmO>DR5)J@Bt@b6h8c}nt{9X^ z`QI}ObDF}w3Y8^e+Fetp-Zjm(gWPEtJ>o#~07jdRr-9anRD}q1f}jSJ0oZ6-d8h(# z0R!&K7pbmJ>sisa!tS>nSl-pS+@{yrz|Q^n)Kk9Vw&kGnQl9dJt+IW8$>MhYBfZV0 zU$d@j+0qVx2ot+5_QASMdYfIh-fCapv1}Q5;8IQ#&-b@;Np=!xH^G1s8ZE#HXmHDh z8qKk;!5mXu$YT8Eqsj*!IeHE>qCo1QhXV!F^wSbN>~8rML3m9X)sEVIZ$4<-f`M#xm`t@m0+VF7WtEo>x<9cwzYp=c51r4cxe}P8+37l{v)T5jR z{sd@P&-{HL3!XrEOZjV2nFe?QI9`2~|LZ{4?OjKN#G&9YY$XZ7fi1+olPIzkq7gj5 z4TjWdkaA8F$961`#63dfM+~&FC7NTiXGi&O(*d~Y;f;EoDL!_?sc_B4yB^utT>Ipy zc*REAbdh3fU9v}i1q>R{nVf*nsUjeMhHfjJB1&z~dR+(SqNsP^2^0iBT>O5eRMvS3 z_ZpgBwo)glm#NpO_o%;7|DZmmKBKTUSzI&-ToK3(~MGjz*&QK!s)I61&L2JDh5> zMhX5dmKk(^HkL7oR95bGiN>N)9S7hJW5IO=@d9aG4%=0k8_(7oq-J@D4(5441*_qd zA}J?fIF(gfpxiV;9jvR$Xb{UYGmUcN_Z#fFSr)g_Bg+wUFspswn6fxmL+5-SI1!WB zGE5e@c6~*HKU27{3EWD1O2WkqXK1gs^CNmi(mc6;?vzuSMXv=A|4yL`>Q_%~ES?vy zaKx+BzC#b3+&2|6tc3M(8FGikXLMPsvRY7|kgA={Mny@50a~MzHr=3StV@h)m5H9G zG%BPF3xOh2<1=bhMmngrKHgX4b<=vYTC2-#vSzAjrNZk>*e$^zl&Su}8pJ9QVum2i zfE-e6BM`P^)Yg~mU$rjN+E(45_Y`E>Gol;baw zh=wYqN+V+Apum`yXYU>bf~BQF0B)MOB%;?;wqq#1{A$7SUjuvJ z_`5bN9hu0GihcT^**?DWCVxhoO<^8?(YR{UebjKAF$Y>Dd#E*NK2Sj=2n^aT$NjM? zVB$o2lQC39(U-9XZd{@s^I*07pv*VN@52S57T4H37uSe>9knOM zs!+q$PHWZ|oZB~g?c@e~ZXGFqGACW3Bk{m!*>c9zxE!pM@^unP_wCd)K2Plyf@}AAg=fVf`V-ztv4F?ug}fl>X_QvPBY`AMJ$5A|`q6x8I4rRshJvBtV20)Z|Nx<{S9Q#I|}6 zX9C+VHc(?xPgqS|P931`q8_LEhjz_|oZYe)!?R=h0sF2pTxwsY`I-3t-{o}zh?+|S zGV$JU5+B&prSzF@EYpgow%B%n_J@c^j*TYhg}usD@ul9OvLc#FQ> zy=p{?nzw&)jfe^s2T?P6gXfY%mjUHZ1$pKFwE(yVP{qMMp2FVAv0a0RO3Tx#sCG05 zET%RS4~Y*^zoOotK0uV%d7uJLPyniaV)t~&38e7eHUDLQoc=Gr=P&6Wmx31kU+?$- zW&2p7M08Hj9_qi~V&Q*3B!6ka3kOII^SktmuL9J6Uz3RPThEX^LlHXi!{Bwl`nllI zpMiV&>EJo#5J(LCFD@HU{=ce??DZzjtC@bbmvDcSI~D^k%C~>`Au9cmpzSz_pDy4cXAtRI zC*C0wcpgMIVx9yDK5;;L`D8QLQc8>d66Ixe92Xa97pj)O}u6lWKl{e92vJg2sw*{_^#$__zVgXdP9* ztpy*LVEO#E<%gQ^@ut+Nj#Y~fHFvCDd~?C`{Kw1lD>7s~4fmXz{9!=9?E|d${uy#Cw7U0b5dMOdItJjYn;V{mZ80L9eyn>Vz%r2}{DlCs+vCbkOC`@qnY~zuy!y zfqqX8IO@&r?FXetmOSvl1F2nup*42^>5(N*KmBy7g75WKs!uDGry=^mXLY3)^!XEi z>LZcKP7ltl3Vtgo} zM{+K`(dP<9BOX`Oh52-k%ZELxp&VfY+~eYkc>vB2^ehp9gW5Z*R%!k`gFo?y6kuP! z^0k>TwP^Xd7zn=hYyS7Z(l+54et`df7wj5)#mcJtm#rx3UY4v+-ON0&f&cy7p664K zC*u5TK>Wuyf$oa;cWNAq*M{yo_Doajb$_(iZkq5|SLU5-N3I`LYE6H`LHVHrjs9Hp zBn?Ds;gXe5M|Pg@z5?E4pgmDUrRvis7L{?uq8Ct%Fa#4FGI`L@Loa2xMDY}VzYA~;yK=Y{9hi_j!^~BQ~ptP7=H9*=r$Y*hbc>V#5 zAu!~ff$Y(m2K500m?{UukeK3sdddUH98!SB6;WrxfW4F`|Js+Yz4qnQu03;XwmGfU zPUpcELzg~tRl^+m%||zFe)Q4Jn;zZIe|wT2DSvMJ+9xf42Rqs)D~uS2LH5*1AY+{P z`fJZU^X48=w(~$sYr-jZiOZYl4>moDu0MKo^V9ry{Igq*9$YaIJaBV=Ap{4W0%HDK z>LR{TjGm{KYEAp~z+0!3zzGT}B&gA`3!7jSgG`4nl>SZ}ji25(XeTbb6U-RCyR2{N z(mr0jqN{kaC6Zsh#$pavbQ$$s^nmas?$=*GWzLOKFn<53Q~US+9{xq58(GQ!QTRaL zU-O$?yJpPXMQ8ObUDn=zv6TPKoy$uL^?G!V@-=1`3l|C>^M(-<*IYe&;MBhTr+&AW ze+KwggSSvR-#25|uHRg<3!|!^A0zslJx?i6zsy5C@<@UXMRPtP#74}M(T2EXS_NpV zaU6>W0JZ=Fh&!Wo_zeIN?F(SJiG#(`J5I@Rev}fYeQ~Tv$i@(VMQ^0*RFI#D#=eYG zN!+k4_t^DSQwyCm^Na>^Vo&?kqU1?=kxtvNSN!)=+`WG-Nd*et<)7F6Mc)xL7kLWJ zh48>zTA5K1^j5g)W$u4~k`33q$4@%o?ix|9(SUuZjyjhSSbKy)oAk z<6q?W`Pw{sx6vro(v4uj^PhF|SLw%$zj0EnLIG%-N>w5Bk%U<2^LS6U_JZ#hoeRA! zOh9r&DZ>qUU4sU_gAP;B`@`MCgjGSn>B-wCPu{+j{$V_SG)q#H#0*)QB=K5h?~=YH z0~9*+Dz)1t+2@*Wn?_U9ZZplbPud1H;X;$aX)sf)(}`0SAxiOxTu)-RqDkS1Xt^XR zef#9inQe;u;*r6Bn>9FO~Mb6z|Btx#|sZ30PW&O;WNo=0$YU_Fz^(KB6=Vb z@h7Lr^HE+rP#uGqhIj)AyNQeACmT8nzLK$0r*LFX`>lKkNWB)m-{O@5K4kUlz@CrD z@kM-0V)*-{&ToAY>_Nwmz@DCnU$e_^@pvr$T^c`s%DsN*kksjTbb+5=NDdd_ujEj5 zM5ibX4kgU;X|woP9HqL3rDl>;9ZL0*y~Lr?3~@sUhN}wBc09}PxG~#iWHYxf{_A}@ zrOw{#`HcVV4f_i{7S6G53o!l8th9I*1UK zK2x`U+%3t`XNYaHWwuX)hF#f;u*D;GZBTfCrohxRvVikBoY`VuU4=Yr!X<(r_97k3 zQmPGmPWrJ<%_Vx6I^WPd>%;r#F-9={4*1EX{(zT75syj4k);%?oyT?T%F@ox(sM?9 zWb=deb4F~L!+c^74x~;(gN!?8>Qd+5Efwts;5# z$D_ATlX2H8&CvYJ7B)F}H|CSl&a+qHJEiXmd4A(=Ud_p5+^*-rim~D zNXs~Wl*5>a0C?Fm;W4m~lMQU3RmxXp@n2DB{-CI}R>q13 z;t{k`(I!ssA?abnY+T52rj@r)1m#G8j?)wGRoHd4F@9-GhzJ-1MKsRE%eM{-+f73; zL~0v#ToH*uT{M=)bs!MigdoKU6p^ie&}u~eDx?ynQVA3iBgmG?6=Jnm0i-gKL@AR< z&V8!aLnYK`pmLnm3dItWNg@W;lNO6i3JnG*l}$F8pj=@vDCE5;t`tf1dWlF0w(uVq z3{p-F5u2yxq?2_znHYsoTr8W0()2nMQHUjSu=6FAN`<%?rBbC=O;;+_Mm3Os%YoXc zdRwWrYJo^3hf;}5%qbx=>&}$}|5j-2qkEqR4o$RV<()^qgfgj8DNTL*rBo3)1)J4k zmKCc-si(oefRvL-I0aac+$51~N=oYActs+8`3(u0RQ~ntXENDm-^$s6Zxo7e1{BUu zzEexM?>-Spcq3fMZ~u;yX}<%18?>@^KKC23O!p0VODD_ZMPC^VUxBj{g(9VapYZT= zsY)sP9Pl!w(!uLLm8sRTPr;{hwVD_IL!s3wmaT-Svq?BstWE7*c?Z-g=xrvcn?KWU zyz_!jNW2Cp5WRy@Vks)q8%NV5mMl~Nqd>aw#_uxSpVNcqFLnznDV6S~USRCDKeH)ztgHEHj z9}Q!n016Y>MOvhP0v^m$&>ljRdeGaZ!_l98%X90G98PjHWN5(B$-_tL`L}weBhD7Z zMew?1*FhFA3}SSr_xyr4MknW|=7W#)R<+nnyCu90?wdcKZ`NB41~yXyU8xTwPLaW2 z)q~^nfAsv_zwG(3If(}Yu43smbOH~K)51&O$djW^S^!9YTu1-x^MgEK89AGkvgj)_ zkmcz4Ex=RP|9ma~ar10OPNPo6h-C9x`1k9ce(o2%f=}knyOq<484<%tm|N$~0~%nR zKmRbNV`y|A`C;@vzTiI^^y4@D`HP7j_%D3}hzk~crX%VIqizC^29H>*(f0GtoCz8x z?QF@eZEvoBD(vE~n+Vv|Ya-6#O6Md8o-4L|=39t`}h0mRarXu!vG(J*#@Ub$Ib4cHL z*taU7S_nqNFIpcAgC0GHoNB~l7=%+D5YYLIY69I82w{({`2eTrNy^W6PDI^^8M*Av zZJ3#V*>L(3M(m`)jU$VDEAJuApqECl^={UWVhGz%g z8bK-zhkkwqBp#x9a-%T+}d^R_pG|+wl|L*eWsMN)Rt9iou#2@;`g^z!WUmM zUBQ2Kt2M7s6J2)gUjPRdz40!8fdBk|rQUl!YXrd){okJIKfD<*@<8V7&apkyCp`Jb zvyyxdfOrtPfEp8hzT~8|Fm>w*OCX0)Lc$ z?Ad4OFbaLmA8iF{w0M1S6=+M{!Mye?{}@oD?x4f&f!7SVhJn}IZaRztC;=>g<`;q4 zA9%NH8F&xuIrhP2$B!SM^Z}U7FXBJn0-*O8*u&qDlX^ePlzLyGfNoP3bZ42M8A^TU{luZH>3KMsqu> ztD8EPRuRHQFkpAP2MNh^8Im>S= zz47F&{HM2z%={PYu9>cHQdZZ-qIKDIU0rqA*REcB%~Z8FSDvT|my8g9(so^JgCgL# zV#}&H@tb;);fObrGhviF5cfyo0g;-@L`Qdk(`Lqq|6kUGCSuO0hcExw`~&v$+wXg> z>)x*C&VBiu-Tqt;tN|N@gqPFqeCZj__4GVv7g0Z9y`k*E7okh>1^4mWQ_qkD;Qxzo zvG}?Bgxd+W)Evcrk5NT`zy-xDtv9X_Q5f$cvl5Fd0@!++8&=oLV9Fo=%>Oy)%0d9$=hj_{{d|I_mW? zZ9G(jMkGTNVF)Awz`zN3Q#Ovxcw$782@{VvlLV9mXF-5Z$Y&6L=My#-Im9L{6!1B8 z;y=B}0&y@=>|&c5Lvvay)#`vWN?e^KZT{@l9 ztuJtm?`$v{%A3qgW_D4QQlaFe!MygOx|~A04$$xOi_V|mkNs;0-2V<(henGyJZtsA zeRnp50&1s59p1KoY=$GlQslCVM9VexR$JlXOy}c|2Gqx>jtR~Y7(`8T1)Mu zZoqy~{9f$g0{tPzjzdSkI&KniSdAQ8#d6VDJP?bUVl;<;4f;e_?Z||>VcZ|!`~lK6 zaV|QB&<)US(4?6z7KnK%H987b>u2s#AaMHrh(2O)GKex;(77bRK`po5j_d_x4ujuKQT2{HL?_L`hF!WMZVSr{qMf z^PfuP$F7=x6J_HHa~I?mjw?G+!)I3)hoBtvfbtI?{fR*`t48$3{qCYr$=$hQxV~PjPm!>;5-V_wloixgzEE*$bDU@r~$fFWxz3qnjs zFgFr^i0Q&)1@T~7hm8vO{vl&H>cMH){R5te!v>FFkpl(=NwG^^)x!Eo^QX=7Hn+BV z{dcyNgv!UPD$Dg}Ee+PS4a54e(oLgJYpn}wA?&{6mirHsm6vVU zuo@`5IqE$df`Pn-F=HC?_Q8Ha}_-`vcA_lfjYK zUBbU&%$-_v>3iGqP=^2WodlijWfshh?>@?~F~3INEQ8=t2>^5)#1cJX zD<)urVrwdlKtS+^2(BsCL>9oS@WwL%*T#w>h(Mv6m$jFNE2H1%0h@tE!$xWF*VhFr z8q`bsz`qaiU*D3bHJDh|YY3N2J(_H3e@PyF4xJ)Wg+EK0m~`k*t8M`bM&Gy8Q`^q( z;>|`EwCOi}{j0~emiLVGWOpphM+5zvLrT_%YGxGa%h74-vN`&oUa4Du&FViLns^AU zi`w+Mh>^h4O22UoU4y-$ikw&jACGHbNK;%G=hVYt{8p2I2$psQM3jb6?-LvXf8jlL z0!4&HFTzWTs)15$Q~-_g#Kx;m?ATG%RUUFX^>Pr`(oE~vfLCJB7-VXI$gi>{eRo_8 z88-3n=W0K?EG_^!^SFI5{WS@0~!H@kd{4NN$ay}83~Bx1Kl7kR*7iP=LinH3(?O_1f%!@K|fq{4}Urtpdf?$ z0~xFVF7CysH5k1RYvY&%U_&*bVvVpal$BFclaobT!a-YJo-G*uv`9#SfA>cMI3*C_ zzjFre;Xl0HG~r(6M*hs9wq}}^G8(w~-B*C~9$>$H`^TxOm2Z!IY@u)0SHSVr zu3cXXG@a-?dNq!;k7&ZrfBI+vhAWEr35?E0utP*2xi6X*ad0mJJ}eaZhpo1v8GjC{~X(;iXM!@u(9v$H@4J%x8)f2jSB{0Rf8{e@?h zSphxWZ#b)Da|T}A2{#Y??V@=oLgoZak6@cg!smvKX)}bhwJF{XPtQvPj+%U2_F_lG z0<43GTK78t;i3EamltwCyi=-Db4_opp7ZpTot;-cJ!jgn`kmN~IG?ckg8|3Z`9OF5 zAz*(!b#_n@@ibAWf1~aEZ!rGb?(I^G_(}MpuFeM+S;lSU2Lxi9kma-P1G_H~gt8RM9A1cj{1RCw zpej*a&!M_@Ao?<`O-E))G=pH#9Ra*F(0Y@DPIG+2O9aq+f5XVuL#B{ugb}_DYtS2X zSls8rbCE6*$cH~&g4|cMC-;%O+=p|`R(Ecx+692Zmzv~P0N_(6LP3kU;6#4Tz1b#< zGb^TYVXQP(tdywA^Sx$s{)znTd$KJScTTa&gD$kfr!43~kG3;xv7lS#+@E8yc=Ae7 zrdwTJ;58>Xe=f`7bTCq>VKuniAY~Y-f!}qFQ7Qr%PHQg5Wt$xiRw^~EDWUV|d|SvJ zFpH#&o#f?O9X2SE8m{8|4KkXR89?GH6fpVInRdWRO;-+dt~N+HnBlPI65hvrKFRRt z9p|QTMTjZQ1!Z&3PzW0m2=?Q#ER2J~`^+K6Dx$rXe+3rrwI1sNtLOS@n`#o{#;sip zLf`|7m#uBeNC1&V7Co1=c)b?pxpS5H48D*Tl&)QQ&7EsjW%;~>ufTnZ8s=*TYeUyk z4cNzvE9(1^*0U?BGkBu-{3GMmOZU-GIqY5(^zwa>xJ6522lfs0ojxt1QkkbOB+|(X zVVF35e|n$~@170=D)a*shg32-fc}|_a(HTZEM1Jufx>w45jnkDl!@OV#&Se6Ia)`3 zxN~NrbTm7$h%;hiO#hCjp5niI3i1ahZbHEwnJ6f&d4i^i&tic*x9>}~{Nh=nqSe}!#kwA65eu4&@L;P*#ni7d5o+^C8# zA^fsp)VPfsAKnDNtn5aCaov?)!c7l@jl(IX)We%f*Qk~1HKm&#MnyRFnv#tVZ!B4( z=EiNLPY)-ZxFKFrgT8eo)k2Mzjm+=;K10z z;}bev9mq{zi0*9roE#-2a`$EjZeY3u(x@`aFQT{Lde_x`X z@4vkAi&^^|p#G{AE5BR0;wn%N-+c2;{$VEh6AbUU##heK<4=QH`Rgqk4jh{?c0YuE8$AEt zTm_OTp5MxEP4Sv=$F4_#0#pL|v0WWu&4n_48=tiKPhar=dci9!zwD<{_xNpFw%Gis z|KbvGr9wIff|*i@DMb9;*60mfb^duMeaRHM4?TnByj=7T;%m`Bl@gCvf*3J|{jvU(e^LjFD4Q6;Z;P2i4p_;e z5w8`j2;+1VYXYQwap;I+4+k)%=YNAH9y8K&Hy_=M{=j#edd6?we>}ct(_a$p=kD$< z%bCzHAw1qb8rIoFjMc*}W~)qf{)TWQL9#sN}u^3;7wzj>L#Y9nA}Dcx)Rt$w8c6Bdu5Djj3jpErMsl z8E7p$l$PJBC=2dY9@LFI8eJS?2^iu)16&*y%j)RlZs^>-J9TahsDB3$%x(OW@4Uk= zTgbHWZQv;WPl(Hj0UjYlVE#oBC-;_3RlQ6>vr!rc@0S(Wz| zC|QlC5UhHoe@$#p^{{27#r$PrTNY?74N7P~yot_G@h{byfhk|tqtC|HHT{Fb=vcp_a$$U~7ifEy>|e#{QsJ8l=F`Y6ux} zG$2r8Usj`7%XCaI(zZR*+I1oYAtl^7yof21G?X5LpL(rHY8E+IGtf_x`= zksXJP@*tWO`$Ixsk5G6T0wEf`=pWOsWW&&<(Q_9;Q@ElG#bXJ7iddbn6psj|3;&3~ z^GE!mlfA#vz+}uq4h7kJMuT@A}$Bk>1Dzy87 zT0D1pZe?Zeeyv=(eb1ilQaMUgNp3!T_+|+%_~fgvK8XurtvF%>MD{d?OR1^|=FoI% zKD8bV&P)6aQvc-{>$?ituEf{kP}*=ESoJV{^5OI?NRGt%65thb;)N4Ea(L_~6X}sH ze{)*UA3u2gpjjb{jwI=omdIHmQD@OHI#0M7|AAM?iGO8y>?adbNpL}`56=r({RH-0 z;5GO=NE%I@rEobBKB7_5g66togtiV7{geo{f#hhBVEtJMSv4ne5hDu>rbxOFR+A>m z>6w%!5-@T5Ut1B{NT$8xk_qH=vally~YvF{#qW)Ev%n@}IIYv(s8U zzn%a7_FGZ>1#dX$l*S8Opxjjm5`f*(HnEid;mEDIPX0x2IFKopvj%TiZ1h)+e_n^@ z_tof`cadk#r^<;fh69Q?vH^hiTYU~@&`SYvzyt+%O{fEiIDY`6NDy#SorBh5XBt2# z7}Lh`>A{k)M`xD$a|{!wPcLOE19g{GUJ34z>0(a3eq>#EY%I6L94yaP7dkj+UX?qm zpc{OQXl4O+Te^^xQO~!HIfTuR>C{4(;o@^82&a3w27LBGKtJru; zUv=lfS?yln-o7E=?ta#iefXMpp8HF0qceDA>FDIOU+TqlMQt`e6+m=80)X^h7 zYkfJ7!e=$r_ddygjeZ}yr7*5`URk>daDO_re{)n+z00i+58A^Cm~q&5f0!9jE0u(z zrhq4grJQjSOQSKvF+So9OBV)oSm$AhH4X;PFbJy5oH1;~D)oY(A?5@=#8%Sbc-UwP zUpl(D$FEdIXhu%U&u%T1CHQY3hy&Ga8tbaY%O3))@6I`Q!h<6^)*k|3Pocj&Fs9yU zYF@ncW_Wc`Zc%=HOa=Orf7QnC9`wA$s%}iSM1COMT#Sy;?Yl-I&6LL1fIv*qK9O%8 zU%xtohj2@36Wpq{t(rWm(d0EaGF`Ik++fX&d36@I!RP`O@lCPRv0h^{{oFZnGnR}Q z_0YTFC@p2Byi^g@PA#CeQv0aesT0)O)Q8m9AOm3E8-f%j<_kw-fBB5Z%?`#RWFwd4 z(4IKw32+`=*yO`t4W9TARc4A{*%x|cg4;fh2zAJ8A8-dEm^CMQdRUHT3UeMTA3%&S z>A86CC2Z1j9t@^Kk_0*r(QEpXXGx}xp5b&y|fvzVU4(Oy&m5HH~&IGjFCm1H^agCGnx;HjXIk|6CCR{a~Z}=i6&>1 zV}YH^fD%?G7K;tK94MxZ@fW$pwAJFUOB}W-@oZ1lRSF4We|U=#VH>8ErdK6)qcdo; z7;I9zF)!LsY<-bYF!?|qFxkTei0(j@iTxQ(yOf+sqba6!(g>q6-CUd#rA--5U)<+3 zuHSub?_<|*&JE=*TZRssuYYXsx!ojfO0I*b!{SAI80GLGLvSmEF(XB@F5b1Pp~h0vsCm>5&j=CDAS+?#1xL2 z!f`~l$3u7@#Q|f3i5ia~fdAZF)MLPFe-w#vLp&scS`rP=R3!uv4=vvg%4ERVe z^y9eEdJ*S9Gr5O!4cwFv5wDT72wLt*q6zQl3~MGvk`p>GM&8R8kirdQ>W(=;+#njv z6A@WLI?n-U&EV@mb2UnJ`;`o#!s6uZL|2c`gVoLTw_kG&sF?nAa8!2|aAkLOf9CL? z;3IfteC~j;W^&2o?Uu_e^(%T8%^Tec56U!lbHJP>+0@Z}o&roq*BcA@Kfm+N!M%Ig zw}ig6*b=wAt6Qpv8B!@QnG#u}C6;2#-`vNKSx%VFj0oOuE=paUlk<}Co;INyt_eFH ziJSNroW;L0)qN5R@wbDq@yIDdf0^?^v6z9H66f9JsXVjMqOCT&M^xWfSjzv)Vz6qe z0b)8$+WN!|MToEX)1MCP-OGPg1HYfOX_MPs6mmy`TUUEMMMa*^&54a0T^3)C&k_x8 zS>-Kl-#c;LcI#!9kz00DaoH-TTqCl1GbT=5IDHvCW`2eTj-~}9H{v706g(T>MgxPuizk<(9;7{;Q;_dBmcxOdL zettp0bf6q#lFI?Cs3vGYL5&cY^nw$G5xEz;E^%&DXrKS93Wo6?Pv!*lRv1ao* zQ&1vtXT=KJw0z^LLOi!srAqT9?=fH`2Mg(j4uU>hjynM%%Wf0I(O@_`Nd>egD>f}j0K4nAW zQ;xV@>`kzmT1VYRJx6^7M8HU>5W*;8`*snF)ox58-%q4r?h#G?ka2-msAQ@zIxCCKBq0|-M4t%b^cl#u1d;xu@rBW<<5+Hl zNtIF>Uvp7C#H#=)Db$0#tzM|bL5EPoNHuX{jma7GCgSE!=ZQ!BKjPPFR5~52*S1!G z?1J?)3s2&>PB$1oe;ZGV6%0#{l8GxVDwU<6v!fs*8Ut~^7b;jOD`r^+N+hg{cG#Px zV!cV^kCr8!p5-_df(E~E5 zoPmwLkf#>we@3en7I0WEl1w)#_?zTOn($@!wfG80D5tgZ_!k}}Rv>EmiaD0&{6h8B5O`SK>Us|KB?P|?0 ztga0>3p2W$+Q#0_!Z2c@dbeovHI=#krp$s&c{bRoQe+lLrQ7yfi`51D_rpbb!G=Us zynVknf3rJW!RO}JU0H4_{c>xA5AIGQ`}b~JVTi< zS_ROW@C(BG&jB_RA*32!6@d{$ykHc&81}bT$zYc#gPUDwu{B|pf041`vz7>-*#Fi( z04TM(Y;@*qCM*WhA0C$4#G_E)NnNOGTt(oMXT-%F#o`UmM8Rz+2j0&g`c0%|-u`{_ ze;&#lU8Yty%@!r3Hp!WL#ZcOd3f!9M&YpPvynCrCAS`63bDUD{z7(78m*66-x+xF$+~!=W=UrRS~~u9-C`!h`=w--X%Kw0v#J zYy4+G{ffJLc2}`_m3mv_)sH-WP2JTJ(Q1)&;OF#V!0QV`Z8>P%yzvT9OKe$7DZdt6@;udDM^j5Q$pmbIVo@Gr& zVUIA3I<=Z|xyiHQITAyW5FARP&Q8SdnH2r%{K-}8rd7nWschiMz~$Y5;lKUk`e&Axe{yxjm8vYIrMh|6 z91%6CzG__Rs`V32Y)+1XwXt*GwJb0;yv=_z>9$u_v7vz5S2L;1tGY<`nuAv24b;`t zApzMtM6gFg*o2l)ZCFheM}%}CtV66#Kmgq32=>`eM=;xkRoYxbzXJOusBJOP3j)j^ zM>y&XmDl07J96r?e=;+?9r<}3UWdUHFne+wc7I0?$?~{KB+o;NU*I+2U9m|t)i zum=(eaG`%O^#g^b0YIHef_|7l!Lvz*8c0Ia=TiMcetG)I`lm)KAcfcz;<*gXW?`KR z`=CMJozc=1bkE~Iy7_m)JoCG!Xm-tlBPr^4Xug4$rQTn#W^ndNQ8)7+&4ahm6q?vB zYMXPgZFs4`e$zjEn?1I)EW6a&yR&n-zp88OxaMLR{m|mJ(S<;6bTC`2c2jdvJ)IDF zGO}z6>4Y!$JnM^1>Db(UnZ0xFxZvWWy?vigsfr$Sd%?k50N6A4O$ta|Bf=dUpnB?z zj9|zHy33~4n@R#B+LPTgkI$o-Ne?c3a*|$Ff1bT;{PKfG<}6u}FZLL-yz%0e?D+@h z4A&$BA3jhcRru^sA%ormmCD-?lV<3bcW~<7aT#KjJ}Y&&<=ngHuQp66olsI2uw4Z|x>#YKPRo)7%+>HE9;CfkDc6P7q&OFfYSn1+ zf5OHUYSc?yAqQZRXyDw@C znfI|O2|8ixPcx#5u=EUl=PIm_E>h#Me-Q{H@*cQ2qlqC-46uCz@o9+Zg-kSsWMcn# z@c>>valb(+m{%iimcwZD2ht%7QWp-vv;0dzkNISEBlZ%q{NdZ5)RusyAd}CWKG(pq zC%2bZJgAZyRR)jt!AU297?ks8_-ptx?e*3CVXf;$)4<&)_%nbzv25l}qP_`|f8f#4 z?+eP8Eodb=J1_+_)#h68CE@2-Jc~dpsP{<3P@dB}FARCA2tH<&0KJW;C>LC;T z2b?glVjKuOu>GqC=YZuQ?>5c0_xLyN`i`GJ{b`)L9mPS>-QR+J(@*|CQ!!$C>}G82 zW*in4Vx+8M)W2f=zbhMIf9&-29~oPejY310|2u!TnUU+JkqVf{Xn42z-?y7apuHR1 z{~1`mLgQ8%nEp$_XRtGi3xVdyzJ9kYh170-xIiIl>*7Peg&jYU*st@Jp4<#h?`rc$fmQe^D8-99>vU+>RBz z9-SGq5S%dZ6GY-pWdRxC$7M&X6Ym= zVmwdM`sduovu6O~$>QJ1VpSd8F&5A#xQax9ZP~{DP^sSla&W z5M?~N2VX-p;iJPh$nlt9g>$367Fope{ z`?o)oRZ@^mS58isO-P(ghq0Yem?7d}}rzBdoHA-70DZ<1jw}-)p*{;NJ%@1K3f&(Eg;Av7z-z z`#%E^A9NS0K*0hqgL%R~0kE161q*(I4?<@JcE?+vFna!(0MsSK#|-JbGb|`zE`aPa zVL{qwe_{t-Da3%j0+$tXwl_QMfN!7}ObQ!M)fB!U2rLIZpB}A6BQGs+NUpGIew`{g);xx<$*8X)Z!{2Lk{d zrsrt@0C?JCU}RumU}0$9t#U*pp5Nvx12;PZ2wYG~(S_0f|Nm#;WMBhvIT)Bg6aXm~ z3Jm}N0C?JCU}RumWB7NMfq|3ZKM-&-FaSl60pmXalqm-B0C?JsRLgD^F%0!QlH5zV zfAk7e3FzhuA@NY}hL>Q2X3-@qyPy&RA+|gu7KpAQK7+66N1<-Z@x-1u=~QK;BWD~t zIksbWk-ihY_K2uCO$aoP4)9HuEo2h`N+9-s3VDO;vMy1QQf;rm2w=D>b^I(uNde@_0VyYo4$yXKUqvFXkI;VKB1p0c#@hEjLp zEO)c-TWY}N4{&^0Y%>_-oac;?^(z;r+@09mxH9i+SJgu7jz>fjN6O{EHj66Xng??~ zbNgWi{HAt;&56r>HG~}B#1Ut0ffZ`-mH}>C zVEWfPdg&JvEBTG-NAniuav$>EApN((|5kikaBMXvB0qATfKTvu4A?hbxWIm;{fTu4 zd4I0nl9%h+`>JbVk?$9($Gsinf2#g6wR_h6hU}Lh!zAlaDw*KxveTM9m<{|6Exe;Oe|cupWr$N(f@ z1R|+LshU(@>Mjz6lpr@x3Qqb_1e6dpiCRO2)39mOG+Ekw+722()6lKx1#~E#k#0!e z!>}-)GKd+vj6g;NTY{Bg9oTRtCDWAY&)mu)XX&!S*`jPm_F;}8=kuxjQ$d^#=g-CE za&y(W-|#d%h@Zx9f9C;t%shMECV@(@=f~x13Q`K31?xltagg|>5L>7%{942~4V+e! zVn`~|G$~XJ7Q2f-m+(u>C2OT6rK6?0WDYrShJWUJnXVjD-d?^~5mUiCD?U3*g;UF@ zI_mz9Y8sqIp()St&w1!5x}I*M2hVfQM;Ml$%9seIk{P_ff4|^k30Pq^i!EjA**3P1 z{k;-b$*7c6da9zU_*Hw=vg);q;Kd0JoMYvLFUc->xyf9R8>$i1jMQxL0G@)k$2b1G zT+6Lptb^8(>vVOi0+c{1a0?FW@%6lVO})K-S4a`6g?{1wW$tBX1EPV{plsN`LcTKj zFA-d%5pDiLe-UHEE>TO3A3ie-*f@2l=2A+-=HgGBxc>bEGcm;Wha+M>DKh z-MrHLcS~7|s>RcC&`N0Kwyv~Aw}EYrwotpE-Q2#@0d$BuEFHd%Lm6K-DhqYycPcx5 za;V%Y4_$A+9_Ye#DY}u}Bi%j)L1Djvy)mi8DkpBDe{b4UxL?U?qFSL|?ZNbbJ+m5^ zhNkK21$w=``&x=tsNVjJpv!u#*kyQvHr2hW69(7@rrTRljWC%iX%pPTfC65SftAezxZ#emg(7b; zwiz=tID-d}g9|vaa|XYo zXg3W0K*hesG5Q$b5g~5TL6@o&8gMa&e@Apm6rfGNf`baG*ri&9I_|ktA}f-cN9)n* z>^37$$R5yJ$AkF#=+T~YcQ7J@%hOD^sSO z1x#mT@W>GftM14bF2%^coL%vx%}wXDh$dBi+Axvhn~M4+WQ{god!qM_Z!TYlf5O*f zA2XJKR^M8pGM;HDEc43KzFJo}2b^G;Yf|5x%PUEx|3{WNp;%2I9hY&%vzh3wDwDoo z7oMmbaYB0T`{Hw0ql!bGdpMZ=SHGKPf29Bb0C?JMR|S;h#u1&WVcNSrV;slKxWhY! z*k_;5j4{QeNSdCJZZwikuyAo4e={>PL(CL2B{4IE6H{VHVhl4?wKRLXFWGn3UES*6 zRbBn7swaU7`S+h?i9-_q=TCkH>XLwoGZUvJPEDMVI6H9;Bq0T9$UqiykcR>kp#)_Z zfq9A36Xzz*g848C3t$CU5mthgVHH>vz5uJi7h!ey608Ah!dkF4tOM)9e|oS!Yyca= zMzAq#0-M5SusLi2Tf!Jrpb9mpLj#)7f^lfWR<#)?900d9nw;9GDr+yb}4ZE!o>0e8Y(a5vlo_rkZ~KDZwqfCu3re|Q)kfk)vncpRR9 z@4$EAd+;PY1y92>@GLwB&%+DwBD@4I!z=JAyauns8}NPj0sIht1V4tKz)#_4@N;+* z-h#K`9e5Xh0l$Rz;C=W2K7?Pvui-cF5qu1vz^CvTd=9^b-@)(U5Aa9$6Z{$e0)K_S z!QbH@@K5*`{2Ts*e+dLcOkxVtn87UOFpmW+VhPJQg7a`bj^YAb0awJ8aAjO2u@0_^ zU%=Jyi?}*|3D>|iaV=aM*THphJzO6*zzuOD+!!~(O>r~a9JjzNaSSV1#TwSJflX}T zIJR*s+#0vRZSl*v9d3^caR=NH7vWC07BN@lAXS-^O?FUHk?965qr3 z@dNx2e}%us-{431F@A!d;(up}^RuCCj*TrGpX zg}(4oUDF!m0zuO~1tvMif^fKET-iGedAvdbK2pqO?}_D&cioqujOxr%>d?UxE$PFz=@29$!+AGjuIcS3$SBwT8FE2;(lF$##?sSUJQZ(%jt&4E6EZ2^7Rb8;x zlnJvVoUCi=LFkE$D{S4g3Io+u*jC|X)DCY*9ws|Q#|+ZGp?`WJts8VuT$=-40lvd;-IdtRik`dBH%p)?#HWhS@Xq|Zm9!x#;jD& z>=NyS+NBurL{3Z-(dahvEa;ZwixPRoHtn8Vo+f|VBB!gCusf=k@l?Cx46?d27|qRwvZl4Ao=Fz6a%c1w}jmX%WIMlVzn;e-w>~+9$?29`Ol73muCxhG+IgV9Hj=1g7-K&%lDd!a|HbNmFSh6Rk~C^|z)AaVj9k%%7bCWg42526#u3F;y?sO7V*!FAbt)*1VZ~7bhS}CQ-4F@te{q zi{%-@<+9JohFFgFNa{vJ+f*rt}UasJPnr!$-@4IWuvBnmxq{ zYW7$rC?gnHjg;>DwG45SQf48_sxgTvGf{P1f%tB^zUj{@NTV}z!=jZ^YJX$3ynOoc z{u!Didq>Q+*OUb3gT$r?XKWiL?_#{1Zok>4SVd^<%CryD7PLY|W#(%ZN?@zl_)SS@s zmxgp>^c*0nIGHY`WlN;E;Q}6*Zqg6=YMae0|F|(HL{bZTIMGi}3R83Fhl5T3XhEww zBG0Z256^S;l_HadHP?!24u5Knbev$;2c8=*P0&-EUZv6|ni(G}N0m)ZC=O3mxv6o( zcQxMNrpZld&4g+UbtRqEU{xM4(v5fw&MV%v5ci+jdZ8CPXom2p+Z zRT)=hT$OQE)>LCnHAd7JQDa0cHg8e9;i5|1%M}c*#VQvy;(xvw_q=(X_o%bhI%}=7 z*1G(_(0UBri4`|kaf7#QFsQ+x27?+5YA~q5paz@TWJHq@O-3{s(Tq)9EWa_R*&=^; z%!@knqRzaiGcW4n gjA%2W%?Kt%y%WudcKyFe450A<0003~{Ijh903CT^vj6}9 diff --git a/site/fonts/fontawesome-webfont.woff2 b/site/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5560193ccc5d768df40766ba54491f1822ed683c GIT binary patch literal 64464 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 o-IM%8o*ehr=#Iq=Q0BvwUBdJ3D Date: Fri, 30 Oct 2015 14:53:30 -0700 Subject: [PATCH 176/810] Update history to reflect merge of #4086 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ca4790d5..2ec4b74b 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ ### Site Enhancements * Update normalize.css to v3.0.3. (#4085) + * Update Font Awesome to v4.4.0. (#4086) ## 3.0.0 / 2015-10-26 From 9d1641f163e6b20507436872336414cf6df931c7 Mon Sep 17 00:00:00 2001 From: Paul Robert Lloyd Date: Sat, 31 Oct 2015 23:58:49 +0000 Subject: [PATCH 177/810] Fix #3371 - kramdown:syntax_highlighter should automatically take value of highlighter --- features/collections.feature | 4 ++-- lib/jekyll/converters/markdown/kramdown_parser.rb | 1 + test/test_kramdown.rb | 10 ++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/features/collections.feature b/features/collections.feature index dc4ea311..d97918bd 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -9,7 +9,7 @@ Feature: Collections And I have a configuration file with "collections" set to "['methods']" When I run jekyll build Then 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 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 @@ -108,7 +108,7 @@ Feature: Collections """ When I run jekyll build Then 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" + 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 Given I have an "index.html" page that contains "{% assign items = site.methods | where: 'whatever','foo.bar' %}Item count: {{ items.size }}" diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index a9dbec96..c9d290df 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -5,6 +5,7 @@ module Jekyll def initialize(config) require 'kramdown' @config = config + @config['kramdown']['syntax_highlighter'] ||= @config['highlighter'] rescue LoadError STDERR.puts 'You are missing a library required for Markdown. Please run:' STDERR.puts ' $ [sudo] gem install kramdown' diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index 7101baaa..b7f44925 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -39,6 +39,16 @@ class TestKramdown < JekyllUnitTest assert_match /

      («|«)Pit(›|›)hy(»|»)<\/p>/, markdown.convert(%{"Pit'hy"}).strip 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 + end + context "moving up nested coderay options" do setup do @markdown.convert('some markup') From 3a225c2ed6893f3370a5b56f047fa1ce06c8070f Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 31 Oct 2015 23:04:52 -0500 Subject: [PATCH 178/810] Skip Cucumber entirely on JRuby. --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 37793b16..a3ecebc8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,9 @@ rvm: matrix: allow_failures: - rvm: jruby-9.0.3.0 + exclude: + - rvm: jruby-9.0.3.0 + env: TEST_SUITE=cucumber env: matrix: - TEST_SUITE=test From e5279d47733d25f88519025ee1ece33bc725d660 Mon Sep 17 00:00:00 2001 From: Paul Robert Lloyd Date: Sun, 1 Nov 2015 23:04:59 +0000 Subject: [PATCH 179/810] Santize @config['highlighter'] to only allow highlighters supported by kramdown --- lib/jekyll/converters/markdown/kramdown_parser.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index c9d290df..40dfa87e 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -5,7 +5,11 @@ module Jekyll def initialize(config) require 'kramdown' @config = config - @config['kramdown']['syntax_highlighter'] ||= @config['highlighter'] + # 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' From f5da607792d1d8990210f8e1c2866bc4275542e9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 2 Nov 2015 12:19:01 +0700 Subject: [PATCH 180/810] Update history to reflect merge of #4090 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2ec4b74b..045a6dc7 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * `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) ### Development Fixes From a5b46821ad94666a6fb49cb3c2236b6a9a178328 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 3 Nov 2015 00:11:52 -0600 Subject: [PATCH 181/810] Put the OS X help guide on the front-lines for now. --- README.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.markdown b/README.markdown index df56108e..b1dfae4a 100644 --- a/README.markdown +++ b/README.markdown @@ -14,6 +14,10 @@ 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? + +See: http://jekyllrb.com/docs/troubleshooting/#jekyll-amp-mac-os-x-1011 + ## Getting Started * [Install](http://jekyllrb.com/docs/installation/) the gem From 3b42be6e391c12de4899f8199709b2e057e8b661 Mon Sep 17 00:00:00 2001 From: Sarah Kuehnle Date: Tue, 3 Nov 2015 07:05:21 -0500 Subject: [PATCH 182/810] Adds a note about installing the jekyll-gist gem to make gist tags work in Jekyll. --- site/_docs/templates.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 3e4cd8d0..7a4ed049 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -421,3 +421,5 @@ You may also optionally specify the filename in the gist to display: {% 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. From 1bfe5a6f953b885732d8efd60f0c61fcdff9f5f7 Mon Sep 17 00:00:00 2001 From: Will Norris Date: Tue, 3 Nov 2015 07:18:14 -0800 Subject: [PATCH 183/810] align hooks documentation and implementation - add site post_render hook, which was documented but wasn't being called - define documents post_init hook, which was documented but caused an error when called (fixes #4102) - add docs for site post_read hook, which was being called but wasn't documented - fix container name in example: s/post/posts/ --- lib/jekyll/hooks.rb | 2 ++ lib/jekyll/site.rb | 2 ++ site/_docs/plugins.md | 13 ++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index 9933337f..a9a5e735 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -15,6 +15,7 @@ module Jekyll after_reset: [], post_read: [], pre_render: [], + post_render: [], post_write: [], }, :pages => { @@ -30,6 +31,7 @@ module Jekyll post_write: [], }, :documents => { + post_init: [], pre_render: [], post_render: [], post_write: [], diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 88c9b0e1..5e9402f4 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -179,6 +179,8 @@ module Jekyll page.render(layouts, payload) end end + + Jekyll::Hooks.trigger :site, :post_render, self, payload rescue Errno::ENOENT # ignore missing layout dir end diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 599d4658..9ff4bbe1 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -491,7 +491,7 @@ custom functionality every time Jekyll renders a post, you could register a hook like this: {% highlight ruby %} -Jekyll::Hooks.register :post, :post_render do |post| +Jekyll::Hooks.register :posts, :post_render do |post| # code to call after Jekyll renders a post end {% endhighlight %} @@ -526,6 +526,17 @@ The complete list of available hooks is below:

      Just after site reset

      + + +

      :site

      + + +

      :post_read

      + + +

      After site data has been read and loaded from disk

      + +

      :site

      From a0bc843d9fa487b7584c707784846dc94b280ae7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 4 Nov 2015 07:13:06 +0700 Subject: [PATCH 184/810] Update history to reflect merge of #4101 [ci skip] --- History.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/History.markdown b/History.markdown index 045a6dc7..d041e3ff 100644 --- a/History.markdown +++ b/History.markdown @@ -11,8 +11,10 @@ * 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) ## 3.0.0 / 2015-10-26 From 6e8fd8cb50eab4dab527eaaa0b23d08593b9972b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 4 Nov 2015 07:13:55 +0700 Subject: [PATCH 185/810] Update history to reflect merge of #4104 [ci skip] --- History.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/History.markdown b/History.markdown index d041e3ff..442b9a39 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,7 @@ * `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) ### Development Fixes @@ -15,6 +16,7 @@ * 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) ## 3.0.0 / 2015-10-26 From db6103bdeeccd46d97fa96319d724c6e2e19bbc3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 4 Nov 2015 15:18:02 +0700 Subject: [PATCH 186/810] Document: only superdirectories of the collection are categories --- features/post_data.feature | 18 ++++++++++++++++++ lib/jekyll/document.rb | 30 ++++++++++++++++++++++++++---- test/test_site.rb | 2 +- test/test_tags.rb | 4 ++-- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/features/post_data.feature b/features/post_data.feature index 736fc936..6ebfb27d 100644 --- a/features/post_data.feature +++ b/features/post_data.feature @@ -187,6 +187,24 @@ Feature: Post data Then 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 + Given I have a movies/_posts directory + And I have a "movies/_posts/2009-03-27-star-wars.html" page with layout "simple" that contains "hi" + 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 + 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 + Given I have a movies/_posts/scifi directory + And I have a "movies/_posts/scifi/2009-03-27-star-wars.html" page with layout "simple" that contains "hi" + 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 + 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 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 763559bf..5af8d610 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -24,10 +24,11 @@ module Jekyll @collection = relations[:collection] @has_yaml_header = nil - subdirs = relative_path.split(File::SEPARATOR).reject do |c| - c.empty? || c.eql?(collection.relative_directory) || c.eql?("_drafts") || c.eql?(basename) + if draft? + categories_from_path("_drafts") + else + categories_from_path(collection.relative_directory) end - merge_data!({'categories' => subdirs }) data.default_proc = proc do |hash, key| site.frontmatter_defaults.find(relative_path, collection.label, key) @@ -75,6 +76,15 @@ module Jekyll data['date'] ||= site.time end + # Returns whether the document is a draft. This is only the case if + # the document is in the 'posts' collection but in a different + # directory than '_posts'. + # + # Returns whether the document is a draft. + def draft? + data['draft'] ||= relative_path.index(collection.relative_directory).nil? && collection.label == "posts" + end + # The path to the document, relative to the site source. # # Returns a String path which represents the relative path @@ -311,9 +321,21 @@ module Jekyll 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. + 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 }) + end + def populate_categories merge_data!({ - "categories" => ( + 'categories' => ( Array(data['categories']) + Utils.pluralized_array_from_hash(data, 'category', 'categories') ).map { |c| c.to_s }.flatten.uniq }) diff --git a/test/test_site.rb b/test/test_site.rb index bea2fcc0..a638a349 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -220,7 +220,7 @@ class TestSite < JekyllUnitTest 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 es publish_test win).sort + 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 diff --git a/test/test_tags.rb b/test/test_tags.rb index 9536cf70..2276b207 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -455,8 +455,8 @@ CONTENT end should "have the url to the \"nested\" post from 2008-11-21" do - assert_match %r{3\s/es/2008/11/21/nested/}, @result - assert_match %r{4\s/es/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 From 61c8ab662b375a16a7d02eabb15ce4f7145ebc35 Mon Sep 17 00:00:00 2001 From: Lawrence Murray Date: Wed, 4 Nov 2015 23:33:18 +0000 Subject: [PATCH 187/810] Update plugins.md. Added Jekyll Flickr Plugin. --- site/_docs/plugins.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 9ff4bbe1..28ce39d2 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -735,6 +735,7 @@ LESS.js files during generation. - [Jekyll Auto Image by Merlos](https://github.com/merlos/jekyll-auto-image): Gets the first image of a post. Useful to list your posts with images or to add [twitter cards](https://dev.twitter.com/cards/overview) to your site. - [Jekyll Portfolio Generator by Shannon Babincsak](https://github.com/codeinpink/jekyll-portfolio-generator): Generates project pages and computes related projects out of project data files. - [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. #### Converters @@ -834,6 +835,8 @@ LESS.js files during generation. - [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. +- [Jekyll Flickr Plugin](https://github.com/lawmurray/indii-jekyll-flickr) by [Lawrence Murray](http://www.indii.org): Embeds Flickr photosets (albums) as a gallery of thumbnails, with lightbox links to larger images. + #### Collections From 455e18624db0c48a0de82357092782ecf25a0a36 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 5 Nov 2015 07:33:53 +0700 Subject: [PATCH 188/810] Update history to reflect merge of #4111 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 442b9a39..b1188f76 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * 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) ## 3.0.0 / 2015-10-26 From 4fa7aa2613697f3bda271cd780d5dfeb2f119ad8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 5 Nov 2015 07:34:58 +0700 Subject: [PATCH 189/810] Update history to reflect merge of #4110 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b1188f76..eb08f73b 100644 --- a/History.markdown +++ b/History.markdown @@ -2,6 +2,7 @@ ### 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) From d1cbea8a37dba6efcdc5a8887d69eb6801c5c883 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Thu, 5 Nov 2015 18:10:08 -0500 Subject: [PATCH 190/810] Fix the deprecation warning in the doctor command --- lib/jekyll/commands/doctor.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index d6b31205..6d7429eb 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -49,7 +49,7 @@ module Jekyll conflicting_urls = false urls = {} urls = collect_urls(urls, site.pages, site.dest) - urls = collect_urls(urls, site.posts, site.dest) + urls = collect_urls(urls, site.posts.docs, site.dest) urls.each do |url, paths| if paths.size > 1 conflicting_urls = true From 1c515c9789620d244317fee992e66b85a7c05687 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 6 Nov 2015 12:31:14 -0600 Subject: [PATCH 191/810] Update history.markdown to reflect the merger of #4114 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index eb08f73b..dd4bf067 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * 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) ### Development Fixes From 87a8695196a70cc2b6d3a9ad95dd3d18ff121120 Mon Sep 17 00:00:00 2001 From: rebornix Date: Tue, 10 Nov 2015 21:08:37 +0800 Subject: [PATCH 192/810] Cache include file to save liquid parsing time. --- features/include_tag.feature | 12 ++++++++++++ lib/jekyll/tags/include.rb | 13 ++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/features/include_tag.feature b/features/include_tag.feature index c7e03ded..427c1bb4 100644 --- a/features/include_tag.feature +++ b/features/include_tag.feature @@ -77,3 +77,15 @@ Feature: Include tags When I run jekyll build Then 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 + Given I have an _includes directory + 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 + 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" + When I run jekyll build + Then I should see "include content changed" in "_site/index.html" diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 92ce7c62..0e944407 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -123,7 +123,7 @@ eos end begin - partial = site.liquid_renderer.file(path).parse(read_file(path, context)) + partial = load_cached_partial(path, context) context.stack do context['include'] = parse_params(context) if @params @@ -134,6 +134,17 @@ eos end end + def load_cached_partial(path, context) + context.registers[:cached_partials] ||= {} + cached_partial = context.registers[:cached_partials] + + if cached_partial.has_key?(path) + cached_partial[path] + else + cached_partial[path] = context.registers[:site].liquid_renderer.file(path).parse(read_file(path, context)) + end + end + def resolved_includes_dir(context) context.registers[:site].in_source_dir(@includes_dir) end From 5f7df357d43c1154dc7f2deb2b9f1a68176c1924 Mon Sep 17 00:00:00 2001 From: Jordan Thornquest Date: Tue, 10 Nov 2015 20:01:18 -0700 Subject: [PATCH 193/810] Remove link to now-deleted blog post --- site/_docs/resources.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/site/_docs/resources.md b/site/_docs/resources.md index a730067a..8ede6a68 100644 --- a/site/_docs/resources.md +++ b/site/_docs/resources.md @@ -44,5 +44,3 @@ A guide to implementing a tag cloud and per-tag content pages using Jekyll. - [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) - -- [Using Jekyll’s Data Files to build a dynamic navbar](http://blog.jordanthornquest.com/post/119506660470/building-dynamic-navbars-in-jekyll) From 056abdf8997c4739336d14b813ebfd075f1c604e Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Tue, 10 Nov 2015 22:17:20 -0500 Subject: [PATCH 194/810] 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 1fb0c64c..9bbc63fa 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. +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. + #### Step 1: Install rrsync to your home folder (server-side) -We will use certificate-based authorization to simplify the publishing process. It makes sense to restrict rsync access only to the directory which it is supposed to sync. +If it is not already installed by your host, you can do it yourself: -That's why rrsync wrapper shall be installed. If it is not already installed by your hoster you can do it yourself: +- [Download rrsync](http://ftp.samba.org/pub/unpacked/rsync/support/rrsync) +- Place it in the `bin` subdirectory of your home folder (`~/bin`) +- Make it executable (`chmod +x`) -- [download rrsync](http://ftp.samba.org/pub/unpacked/rsync/support/rrsync) -- Put it to the bin subdirectory of your home folder (```~/bin```) -- Make it executable (```chmod +x```) +#### Step 2: Set up certificate-based SSH access (server side) -#### Step 2: Set up certificate-based ssh access (server side) +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: -[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/```. -#### 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! -#### Optional step 4: exclude transfer.sh from being copied to the output folder by Jekyll +#### Step 4 (Optional): Exclude the transfer script from being copied to the output folder. -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: +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`. + +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. -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. +#### Done! + +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 294f25b126f6a8e3a75e910c813435a77e24dd10 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 10 Nov 2015 21:28:13 -0600 Subject: [PATCH 195/810] Update history.markdown to reflect the merger of #4125. --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index dd4bf067..93719bc7 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * 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) ## 3.0.0 / 2015-10-26 From 246ff3f9b634c4facad988c9a6030f09d669b700 Mon Sep 17 00:00:00 2001 From: Larry Fox Date: Wed, 11 Nov 2015 11:55:54 -0500 Subject: [PATCH 196/810] Remove Post autoload Seems like this got missed. Referencing `Jekyll::Post` results in a `LoadError` --- lib/jekyll.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 2ac3b3fa..3e8e639d 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -58,7 +58,6 @@ module Jekyll autoload :LogAdapter, 'jekyll/log_adapter' autoload :Page, 'jekyll/page' autoload :PluginManager, 'jekyll/plugin_manager' - autoload :Post, 'jekyll/post' autoload :Publisher, 'jekyll/publisher' autoload :Reader, 'jekyll/reader' autoload :Regenerator, 'jekyll/regenerator' From 55a759357e930203e95a0530ef0ae3cbdedcd17f Mon Sep 17 00:00:00 2001 From: Nicole White Date: Wed, 11 Nov 2015 15:41:17 -0800 Subject: [PATCH 197/810] Update pagination.md elsif -> elif --- 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 2c0ae2b4..f549a658 100644 --- a/site/_docs/pagination.md +++ b/site/_docs/pagination.md @@ -203,7 +203,7 @@ page with links to all but the current page. {% for page in (1..paginator.total_pages) %} {% if page == paginator.page %} {{ page }} - {% elsif page == 1 %} + {% elif page == 1 %}
      {{ page }} {% else %} {{ page }} From 4a91bb669c1339a786aeb8cb88452009f31c43a7 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Wed, 11 Nov 2015 20:33:44 -0500 Subject: [PATCH 198/810] 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 9bbc63fa..51a3a5b2 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 1b3cb4515aed4cb4514a8a49f0e9fdf3adb991e8 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Wed, 11 Nov 2015 19:43:36 -0600 Subject: [PATCH 199/810] Update history to reflect merge of #4130 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 93719bc7..58afbdf9 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,7 @@ * 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) ## 3.0.0 / 2015-10-26 From 95f325898f8ce1539cbf41f8f6d1097f77e54c24 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 12 Nov 2015 23:18:19 -0600 Subject: [PATCH 200/810] Lets see how we fair on Ruby 2.3. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index a3ecebc8..8026187c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,9 +5,11 @@ rvm: - 2.2 - 2.1 - 2.0 +- ruby-head - jruby-9.0.3.0 matrix: allow_failures: + - rvm: ruby-head - rvm: jruby-9.0.3.0 exclude: - rvm: jruby-9.0.3.0 From 45b40782db69e16bcca233a81efe9b3c493f4d98 Mon Sep 17 00:00:00 2001 From: Vincent Wochnik Date: Fri, 13 Nov 2015 16:48:46 +0100 Subject: [PATCH 201/810] Add jekyll-language-plugin to plugins.md I have created a Jekyll 3.0-compatible plugin for multilingual websites which is capable of creating multiple translations for one page or post. Beware that this plugin extends the `PageReader` and `PostReader` as well as `Page` and `Document` classes. --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 28ce39d2..7cd7c3f8 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -872,6 +872,7 @@ LESS.js files during generation. - [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. - [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. #### Editors From eec94cd964932a376dba6aa157f628a137897768 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 13 Nov 2015 14:02:08 -0600 Subject: [PATCH 202/810] Update history.markdown to reflect the merger of #4134. --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 58afbdf9..bc55838f 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * 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) ## 3.0.0 / 2015-10-26 From c984d8c531c4bf8196576bd73875b052f3d3bd97 Mon Sep 17 00:00:00 2001 From: Lewis Cowles Date: Sat, 14 Nov 2015 04:11:09 +0000 Subject: [PATCH 203/810] Updated to reflect feedback in #4129 Included Jekyll 3 specific update to mention that jekyll-coffeescript gem must be installed and the gem added to the `_config.yml` file --- site/_docs/assets.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/site/_docs/assets.md b/site/_docs/assets.md index b4f202d8..1d8d836a 100644 --- a/site/_docs/assets.md +++ b/site/_docs/assets.md @@ -4,9 +4,10 @@ title: Assets permalink: /docs/assets/ --- -Jekyll provides built-in support for Sass and CoffeeScript. In order to use -them, 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: +Jekyll provides built-in support for Sass and can work with CoffeeScript via +ruby gems. In order to use them, 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 %} --- @@ -78,3 +79,14 @@ sass: These are passed to Sass, so any output style options Sass supports are valid here, too. + + +## Coffeescript + +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 %} +gems:[jekyll-coffeescript] +{% endhighlight %} From 5da9333f6990f2b6d32dd7a6b988d2a542ff3fb7 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 13 Nov 2015 23:46:21 -0600 Subject: [PATCH 204/810] Update history.markdown to reflect the merger of #4137 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bc55838f..eaf4b75b 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * 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) ## 3.0.0 / 2015-10-26 From f69c920364d6802bedc26ae123baef2cf3100482 Mon Sep 17 00:00:00 2001 From: Christian Trosell Date: Sat, 14 Nov 2015 21:15:57 +0100 Subject: [PATCH 205/810] correcting typo: elif to elsif --- 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 f549a658..2c0ae2b4 100644 --- a/site/_docs/pagination.md +++ b/site/_docs/pagination.md @@ -203,7 +203,7 @@ page with links to all but the current page. {% for page in (1..paginator.total_pages) %} {% if page == paginator.page %} {{ page }} - {% elif page == 1 %} + {% elsif page == 1 %} {{ page }} {% else %} {{ page }} From 1b91e6d89a1782b0db8021ff3e204715079f3030 Mon Sep 17 00:00:00 2001 From: Lewis Cowles Date: Sun, 15 Nov 2015 11:01:32 +0000 Subject: [PATCH 206/810] updated to reflect further feedback on #4129 @perlun had some more ideas for how this should read... --- site/_docs/assets.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/site/_docs/assets.md b/site/_docs/assets.md index 1d8d836a..202ade0e 100644 --- a/site/_docs/assets.md +++ b/site/_docs/assets.md @@ -5,9 +5,9 @@ permalink: /docs/assets/ --- Jekyll provides built-in support for Sass and can work with CoffeeScript via -ruby gems. In order to use them, 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: +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 %} --- @@ -88,5 +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 {% highlight yaml %} -gems:[jekyll-coffeescript] +gems: + - jekyll-coffeescript {% endhighlight %} From b1f1a5d65f15efd5ca865969390e9044fa598fd9 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 15 Nov 2015 14:39:02 -0600 Subject: [PATCH 207/810] Update history.markdown to reflect the merger of #4142 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index eaf4b75b..5c189cef 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * Update the liquid syntax in the pagination docs (#4130) * Add jekyll-language-plugin to plugins.md (#4134) * Updated to reflect feedback in #4129 (#4137) + * Calrify assets.md based on feedback of #4129 (#4142) ## 3.0.0 / 2015-10-26 From 03d3eb7191a6c5d5b6d5fc8a3f96ef0b8f9ccc92 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Mon, 16 Nov 2015 09:18:24 -0600 Subject: [PATCH 208/810] Update history to reflect merge of #4140 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5c189cef..a7cb222c 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Add jekyll-language-plugin to plugins.md (#4134) * Updated to reflect feedback in #4129 (#4137) * Calrify assets.md based on feedback of #4129 (#4142) + * Re-correct the liquid syntax in the pagination docs (#4140) ## 3.0.0 / 2015-10-26 From bd2c337e5bd1a3532f42776f55f80f4e273cfeac Mon Sep 17 00:00:00 2001 From: Ducksan Cho Date: Wed, 18 Nov 2015 02:16:03 +1300 Subject: [PATCH 209/810] 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 d23da78f..a8bbf24e 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -36,13 +36,18 @@ module Jekyll # # 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 4363aee1..4d4b9bd0 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -74,8 +74,11 @@ module Jekyll 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 6a98ab2a1569f7d515bafcc9067bf7e8dd5c4ee6 Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 18 Nov 2015 10:43:13 +0800 Subject: [PATCH 210/810] Make `:title` cased for backwards compability and add `:slug` for uncased usage. --- features/permalinks.feature | 24 +++++++++++++++++ lib/jekyll/document.rb | 4 ++- lib/jekyll/filters.rb | 2 +- lib/jekyll/utils.rb | 27 +++++++++++++------ site/_docs/permalinks.md | 16 +++++++++-- .../_slides/example-slide-Upper-Cased.html | 6 +++++ test/test_document.rb | 24 +++++++++++++++-- test/test_utils.rb | 25 +++++++++++++---- 8 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 test/source/_slides/example-slide-Upper-Cased.html diff --git a/features/permalinks.feature b/features/permalinks.feature index bc13de88..74f2e409 100644 --- a/features/permalinks.feature +++ b/features/permalinks.feature @@ -96,3 +96,27 @@ Feature: Fancy permalinks Then 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" + + Scenario: Use pretty permalink schema with cased file name + Given I have a _posts directory + 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 + 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 + Given I have a _posts directory + 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 + And I should see "Totally awesome" in "_site/2009/03/27/custom-schema/index.html" + + Scenario: Use pretty permalink schema with title containing underscore + Given I have a _posts directory + 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 + And I should see "Totally awesome" in "_site/2009/03/27/Custom_Schema/index.html" diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 5af8d610..528fed68 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -186,7 +186,9 @@ module Jekyll path: cleaned_relative_path, output_ext: output_ext, name: Utils.slugify(basename_without_ext), - title: Utils.slugify(data['slug']) || 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"), diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 72c332ad..7e2d30f3 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -45,7 +45,7 @@ module Jekyll # 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) + Utils.slugify(input, mode: mode) end # Format a date in short format e.g. "27 Jan 2011". diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index c30a986a..7d2490a6 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -121,10 +121,12 @@ module Jekyll # # string - the filename or title to slugify # mode - how string is slugified + # cased - whether to replace all uppercase letters with their + # lowercase counterparts # - # When mode is "none", return the given string in lowercase. + # When mode is "none", return the given string. # - # When mode is "raw", return the given string in lowercase, + # When mode is "raw", return the given string, # with every sequence of spaces characters replaced with a hyphen. # # When mode is "default" or nil, non-alphabetic characters are @@ -133,6 +135,9 @@ module Jekyll # When mode is "pretty", some non-alphabetic characters (._~!$&'()+,;=@) # are not replaced with hyphen. # + # If cased is true, all uppercase letters in the result string are + # replaced with their lowercase counterparts. + # # Examples: # slugify("The _config.yml file") # # => "the-config-yml-file" @@ -140,11 +145,17 @@ module Jekyll # slugify("The _config.yml file", "pretty") # # => "the-_config.yml-file" # + # slugify("The _config.yml file", "pretty", true) + # # => "The-_config.yml file" + # # Returns the slugified string. - def slugify(string, mode=nil) + def slugify(string, mode: nil, cased: false) mode ||= 'default' return nil if string.nil? - return string.downcase unless SLUGIFY_MODES.include?(mode) + + unless SLUGIFY_MODES.include?(mode) + return cased ? string : string.downcase + end # Replace each character sequence with a hyphen re = case mode @@ -158,13 +169,13 @@ module Jekyll SLUGIFY_PRETTY_REGEXP end - string. + slug = string. # Strip according to the mode gsub(re, '-'). # Remove leading/trailing hyphen - gsub(/^\-|\-$/i, ''). - # Downcase - downcase + gsub(/^\-|\-$/i, '') + + cased ? slug : slug.downcase end # Add an appropriate suffix to template so that it matches the specified diff --git a/site/_docs/permalinks.md b/site/_docs/permalinks.md index e82ecf6d..5aa0449a 100644 --- a/site/_docs/permalinks.md +++ b/site/_docs/permalinks.md @@ -109,8 +109,20 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti

      - Title from the document’s filename. May be overridden via the - document’s slug YAML front matter. + Title from the document’s filename. May be overridden via + the document’s slug YAML front matter. +

      + + + + +

      slug

      + + +

      + Slugified title from the document’s filename ( any character + except numbers and letters is replaced as hyphen ). May be + overridden via the document’s slug YAML front matter.

      diff --git a/test/source/_slides/example-slide-Upper-Cased.html b/test/source/_slides/example-slide-Upper-Cased.html new file mode 100644 index 00000000..24aee8e7 --- /dev/null +++ b/test/source/_slides/example-slide-Upper-Cased.html @@ -0,0 +1,6 @@ +--- + title: Example Slide + layout: slide +--- + +Cased! diff --git a/test/test_document.rb b/test/test_document.rb index a1e0c9cd..6689e506 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -234,6 +234,26 @@ class TestDocument < JekyllUnitTest end end + context "a document in a collection with cased file name" do + setup do + @site = fixture_site({ + "collections" => { + "slides" => { + "output" => true, + } + }, + }) + @site.permalink_style = :pretty + @site.process + @document = @site.collections["slides"].docs[6] + @dest_file = dest_dir("slides/example-slide-Upper-Cased/index.html") + end + + should "produce the right cased URL" do + assert_equal "/slides/example-slide-Upper-Cased/", @document.url + end + end + context "documents in a collection with custom title permalinks" do setup do @site = fixture_site({ @@ -267,10 +287,10 @@ class TestDocument < JekyllUnitTest 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") + dest_file = dest_dir("/slides/Well,-so-what-is-Jekyll,-then.html") assert_equal dest_file, @document_with_strange_slug.destination(dest_dir) end end diff --git a/test/test_utils.rb b/test/test_utils.rb index 9d4a5a4d..d1ec2ece 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -146,23 +146,38 @@ 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?", "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 - assert_equal "the-config-yml-file", Utils.slugify("The _config.yml file?", nil) + assert_equal "the-config-yml-file", Utils.slugify("The _config.yml file?") end should "not replace period and underscore if mode is pretty" do - assert_equal "the-_config.yml-file", Utils.slugify("The _config.yml file?", "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?", "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?", "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) end end From 9bc926be3fcf310d8f884c1ca8ad09a7130abe73 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Nov 2015 22:04:15 -0800 Subject: [PATCH 211/810] Update history to reflect merge of #4100 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a7cb222c..ef21b737 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * 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 From 2b4a3c008ddbdc6d7d8381f2ba6a031ec5efdc45 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Nov 2015 22:19:45 -0800 Subject: [PATCH 212/810] Release :gem: 3.0.1 --- Gemfile | 2 +- History.markdown | 4 +-- Rakefile | 2 +- lib/jekyll/version.rb | 2 +- site/_docs/history.md | 35 +++++++++++++++++++ .../2015-11-17-jekyll-3-0-1-released.markdown | 25 +++++++++++++ 6 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 site/_posts/2015-11-17-jekyll-3-0-1-released.markdown diff --git a/Gemfile b/Gemfile index 3639ecfe..9b64809e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -gemspec +gemspec name: 'jekyll' gem 'rake', '~> 10.1' group :development do diff --git a/History.markdown b/History.markdown index ef21b737..26fa98d8 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,4 @@ -## HEAD +## 3.0.1 / 2015-11-17 ### Bug Fixes @@ -25,7 +25,7 @@ * Update the liquid syntax in the pagination docs (#4130) * Add jekyll-language-plugin to plugins.md (#4134) * Updated to reflect feedback in #4129 (#4137) - * Calrify assets.md based on feedback of #4129 (#4142) + * 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 diff --git a/Rakefile b/Rakefile index fb177f16..ff473e68 100644 --- a/Rakefile +++ b/Rakefile @@ -14,7 +14,7 @@ require 'jekyll/version' ############################################################################# def name - @name ||= File.basename(Dir['*.gemspec'].first, ".*") + 'jekyll'.freeze end def version diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 91ee762b..7907aaa5 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.0.0' + VERSION = '3.0.1' end diff --git a/site/_docs/history.md b/site/_docs/history.md index 7447f334..6a640401 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -4,6 +4,41 @@ title: History permalink: "/docs/history/" --- +## 3.0.1 / 2015-11-17 +{: #v3-0-1} + +### Bug Fixes +{: #bug-fixes-v3-0-1} + +- Document: only superdirectories of the collection are categories ([#4110]({{ site.repository }}/issues/4110)) +- `Convertible#render_liquid` should use `render!` to cause failure on bad Liquid ([#4077]({{ site.repository }}/issues/4077)) +- Don't generate `.jekyll-metadata` in non-incremental build ([#4079]({{ site.repository }}/issues/4079)) +- Set `highlighter` config val to `kramdown.syntax_highlighter` ([#4090]({{ site.repository }}/issues/4090)) +- Align hooks implementation with documentation ([#4104]({{ site.repository }}/issues/4104)) +- Fix the deprecation warning in the doctor command ([#4114]({{ site.repository }}/issues/4114)) +- Fix case in `:title` and add `:slug` which is downcased ([#4100]({{ site.repository }}/issues/4100)) + +### Development Fixes +{: #development-fixes-v3-0-1} + +- Fix test warnings when doing rake {test,spec} or script/test ([#4078]({{ site.repository }}/issues/4078)) + +### Site Enhancements +{: #site-enhancements-v3-0-1} + +- Update normalize.css to v3.0.3. ([#4085]({{ site.repository }}/issues/4085)) +- Update Font Awesome to v4.4.0. ([#4086]({{ site.repository }}/issues/4086)) +- Adds a note about installing the jekyll-gist gem to make gist tag work ([#4101]({{ site.repository }}/issues/4101)) +- Align hooks documentation with implementation ([#4104]({{ site.repository }}/issues/4104)) +- Add Jekyll Flickr Plugin to the list of third party plugins ([#4111]({{ site.repository }}/issues/4111)) +- Remove link to now-deleted blog post ([#4125]({{ site.repository }}/issues/4125)) +- Update the liquid syntax in the pagination docs ([#4130]({{ site.repository }}/issues/4130)) +- Add jekyll-language-plugin to plugins.md ([#4134]({{ site.repository }}/issues/4134)) +- Updated to reflect feedback in [#4129]({{ site.repository }}/issues/4129) ([#4137]({{ site.repository }}/issues/4137)) +- Clarify assets.md based on feedback of [#4129]({{ site.repository }}/issues/4129) ([#4142]({{ site.repository }}/issues/4142)) +- Re-correct the liquid syntax in the pagination docs ([#4140]({{ site.repository }}/issues/4140)) + + ## 3.0.0 / 2015-10-26 {: #v3-0-0} diff --git a/site/_posts/2015-11-17-jekyll-3-0-1-released.markdown b/site/_posts/2015-11-17-jekyll-3-0-1-released.markdown new file mode 100644 index 00000000..71412c6b --- /dev/null +++ b/site/_posts/2015-11-17-jekyll-3-0-1-released.markdown @@ -0,0 +1,25 @@ +--- +layout: news_item +title: 'Jekyll 3.0.1 Released' +date: 2015-11-17 22:04:39 -0800 +author: parkr +version: 3.0.1 +categories: [release] +--- + +Hey, folks! Bunch of bug fixes here. Notables: + +* Only superdirectories of `_posts` will be categories. +* `:title` in permalink templates are now properly cased as before +* `.jekyll-metadata` being erroneously written when not using incremental build. +* Failure in liquid will now always fail the `jekyll` process. +* All hooks should now be properly registered & documented + +And a bunch more changes which you can see over in the +[changelog](/docs/history). + +Thanks to the 17 developers who contributed code and documentation to this +patch release: Alfred Xing, Christian Trosell, Jordan Thornquest, Jordon +Bedwell, Larry Fox, Lawrence Murray, Lewis Cowles, Matt Rogers, Nicole +White, Parker Moore, Paul Robert Lloyd, Sarah Kuehnle, Vincent Wochnik, +Will Norris, XhmikosR, chrisfinazzo, and rebornix. From 6448c0e6a1e2a501e9203a230f30888495b9da8e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Nov 2015 22:39:55 -0800 Subject: [PATCH 213/810] jekyll-docs gem should be easily integrated with jekyll's site. --- Rakefile | 30 +++++++++++++++++++++++++++++- jekyll-docs.gemspec | 22 ++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 jekyll-docs.gemspec diff --git a/Rakefile b/Rakefile index ff473e68..0406685c 100644 --- a/Rakefile +++ b/Rakefile @@ -14,13 +14,17 @@ require 'jekyll/version' ############################################################################# def name - 'jekyll'.freeze + "jekyll" end def version Jekyll::VERSION end +def docs_name + "#{name}-docs" +end + def gemspec_file "#{name}.gemspec" end @@ -301,3 +305,27 @@ task :build do 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 diff --git a/jekyll-docs.gemspec b/jekyll-docs.gemspec new file mode 100644 index 00000000..0a7975a3 --- /dev/null +++ b/jekyll-docs.gemspec @@ -0,0 +1,22 @@ +# 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 1dcb1e9fd7c5df78b8509e759cfec37f745c12c8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Nov 2015 22:40:14 -0800 Subject: [PATCH 214/810] site/latest_version.txt is 3.0.1 homiez --- site/latest_version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/latest_version.txt b/site/latest_version.txt index 4a36342f..cb2b00e4 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -3.0.0 +3.0.1 From cae8bd31c2a9dc976e2c0313739d00f8cca7554a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Nov 2015 22:42:06 -0800 Subject: [PATCH 215/810] Update history to reflect merge of #4152 [ci skip] --- History.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/History.markdown b/History.markdown index 26fa98d8..cf290e09 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,9 @@ +## HEAD + +### Development Fixes + + * `jekyll-docs` should be easily release-able (#4152) + ## 3.0.1 / 2015-11-17 ### Bug Fixes From a168edae45cf6878dfe7408cc396252b8899c17a Mon Sep 17 00:00:00 2001 From: Ducksan Cho Date: Thu, 19 Nov 2015 00:46:46 +1300 Subject: [PATCH 216/810] 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 c30a986a..ab516767 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -207,5 +207,34 @@ module Jekyll 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 00000000..e69de29b diff --git a/test/test_utils.rb b/test/test_utils.rb index 9d4a5a4d..02ebb09a 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 217/810] 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 a8bbf24e..9146e7de 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -36,18 +36,13 @@ module Jekyll # # 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 4d4b9bd0..e4725718 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -74,11 +74,8 @@ module Jekyll 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 0cdf659ebf24e5bbe11ae0a1112147cb4e5765a2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 Nov 2015 08:50:49 -0800 Subject: [PATCH 218/810] Add upgrading docs from 2.x to 3.x --- site/_data/docs.yml | 3 +- site/_docs/upgrading.md | 136 +------------------------------- site/_docs/upgrading/0-to-2.md | 140 +++++++++++++++++++++++++++++++++ site/_docs/upgrading/2-to-3.md | 64 +++++++++++++++ site/_includes/docs_ul.html | 8 +- 5 files changed, 211 insertions(+), 140 deletions(-) create mode 100644 site/_docs/upgrading/0-to-2.md create mode 100644 site/_docs/upgrading/2-to-3.md diff --git a/site/_data/docs.yml b/site/_data/docs.yml index bcdf352d..dcd9ac2c 100644 --- a/site/_data/docs.yml +++ b/site/_data/docs.yml @@ -39,7 +39,8 @@ - troubleshooting - sites - resources - - upgrading + - upgrading/0-to-2 + - upgrading/2-to-3 - title: Meta docs: diff --git a/site/_docs/upgrading.md b/site/_docs/upgrading.md index 51fe67a1..a1280672 100644 --- a/site/_docs/upgrading.md +++ b/site/_docs/upgrading.md @@ -4,137 +4,7 @@ title: Upgrading permalink: /docs/upgrading/ --- -Upgrading from an older version of Jekyll? A few things have changed in 1.0 -that you'll want to know about. +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: -Before we dive in, go ahead and fetch the latest version of Jekyll: - -{% highlight bash %} -$ gem update jekyll -{% endhighlight %} - -
      -
      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.

      -
      - -### The Jekyll Command - -For better clarity, Jekyll now accepts the commands `build` and `serve`. -Whereas before you might simply run the command `jekyll` to generate a site -and `jekyll --server` to view it locally, in v2.0 (and later) you should -use the subcommands `jekyll build` and `jekyll serve` to build and preview -your site. - -
      -
      Watching and Serving
      -

      With the new subcommands, the way sites are previewed locally - changed a bit. Instead of specifying `server: true` in the site's - configuration file, use `jekyll serve`. The same holds true for - `watch: true`. Instead, use the `--watch` flag with either `jekyll serve` - or `jekyll build`.

      -
      - -### Absolute Permalinks - -In Jekyll v1.0, we introduced absolute permalinks for pages in -subdirectories. Starting with v2.0, absolute permalinks are opt-out, -meaning Jekyll will default to using absolute permalinks instead of -relative permalinks. Relative permalink backwards-compatibility was removed in v3.0. - - - -### Draft Posts - -Jekyll now lets you write draft posts, and allows you to easily preview how -they will look prior to publishing. To start a draft, simply create a folder -called `_drafts` in your site's source directory (e.g., alongside `_posts`), -and add a new markdown file to it. To preview your new post, simply run the -`jekyll serve` command with the `--drafts` flag. - -
      -
      Drafts don't have dates
      -

      - Unlike posts, drafts don't have a date, since they haven't - been published yet. Rather than naming your draft something like - `2013-07-01-my-draft-post.md`, simply name the file what you'd like your - post to eventually be titled, here `my-draft-post.md`.

      -
      - -### Custom Config File - -Rather than passing individual flags via the command line, you can now pass -an entire custom Jekyll config file. This helps to distinguish between -environments, or lets you programmatically override user-specified -defaults. Simply add the `--config` flag to the `jekyll` command, followed -by the path to one or more config files (comma-delimited, no spaces). - -#### As a result, the following command line flags are now deprecated: - -* `--no-server` -* `--no-auto` (now `--no-watch`) -* `--auto` (now `--watch`) -* `--server` -* `--url=` -* `--maruku`, `--rdiscount`, and `--redcarpet` -* `--pygments` -* `--permalink=` -* `--paginate` - -
      -
      The config flag explicitly specifies your configuration file(s)
      -

      If you use the `--config` flag, Jekyll will ignore your - `_config.yml` file. Want to merge a custom configuration with the normal - configuration? No problem. Jekyll will accept more than one custom config - file via the command line. Config files cascade from right to left, such - that if I run `jekyll serve --config _config.yml,_config-dev.yml`, - the values in the config files on the right (`_config-dev.yml`) overwrite - those on the left (`_config.yml`) when both contain the same key.

      -
      - -### New Config File Options - -Jekyll 1.0 introduced several new config file options. Before you upgrade, -you should check to see if any of these are present in your pre-1.0 config -file, and if so, make sure that you're using them properly: - -* `excerpt_separator` -* `host` -* `include` -* `keep_files` -* `layouts` -* `show_drafts` -* `timezone` -* `url` - -### Baseurl - -Often, you'll want the ability to run a Jekyll site in multiple places, -such as previewing locally before pushing to GitHub Pages. Jekyll 1.0 makes -that easier with the new `--baseurl` flag. To take advantage of this -feature, first add the production `baseurl` to your site's `_config.yml` -file. Then, throughout the site, simply prefix relative URLs -with `{% raw %}{{ site.baseurl }}{% endraw %}`. -When you're ready to preview your site locally, pass along the `--baseurl` -flag with your local baseurl (most likely `/`) to `jekyll serve` and Jekyll -will swap in whatever you've passed along, ensuring all your links work as -you'd expect in both environments. - - -
      -
      All page and post URLs contain leading slashes
      -

      If you use the method described above, please remember - that the URLs for all posts and pages contain a leading slash. Therefore, - concatenating the site baseurl and the post/page url where - `site.baseurl = /` and `post.url = /2013/06/05/my-fun-post/` will - result in two leading slashes, which will break links. It is thus - suggested that prefixing with `site.baseurl` only be used when the - `baseurl` is something other than the default of `/`.

      -
      +- [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/) diff --git a/site/_docs/upgrading/0-to-2.md b/site/_docs/upgrading/0-to-2.md new file mode 100644 index 00000000..84ec90e7 --- /dev/null +++ b/site/_docs/upgrading/0-to-2.md @@ -0,0 +1,140 @@ +--- +layout: docs +title: Upgrading from 0.x to 2.x +permalink: /docs/upgrading/0-to-2/ +--- + +Upgrading from an older version of Jekyll? A few things have changed in 1.0 +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 %} +$ gem update jekyll +{% endhighlight %} + +
      +
      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.

      +
      + +### The Jekyll Command + +For better clarity, Jekyll now accepts the commands `build` and `serve`. +Whereas before you might simply run the command `jekyll` to generate a site +and `jekyll --server` to view it locally, in v2.0 (and later) you should +use the subcommands `jekyll build` and `jekyll serve` to build and preview +your site. + +
      +
      Watching and Serving
      +

      With the new subcommands, the way sites are previewed locally + changed a bit. Instead of specifying `server: true` in the site's + configuration file, use `jekyll serve`. The same holds true for + `watch: true`. Instead, use the `--watch` flag with either `jekyll serve` + or `jekyll build`.

      +
      + +### Absolute Permalinks + +In Jekyll v1.0, we introduced absolute permalinks for pages in +subdirectories. Starting with v2.0, absolute permalinks are opt-out, +meaning Jekyll will default to using absolute permalinks instead of +relative permalinks. Relative permalink backwards-compatibility was removed in v3.0. + + + +### Draft Posts + +Jekyll now lets you write draft posts, and allows you to easily preview how +they will look prior to publishing. To start a draft, simply create a folder +called `_drafts` in your site's source directory (e.g., alongside `_posts`), +and add a new markdown file to it. To preview your new post, simply run the +`jekyll serve` command with the `--drafts` flag. + +
      +
      Drafts don't have dates
      +

      + Unlike posts, drafts don't have a date, since they haven't + been published yet. Rather than naming your draft something like + `2013-07-01-my-draft-post.md`, simply name the file what you'd like your + post to eventually be titled, here `my-draft-post.md`.

      +
      + +### Custom Config File + +Rather than passing individual flags via the command line, you can now pass +an entire custom Jekyll config file. This helps to distinguish between +environments, or lets you programmatically override user-specified +defaults. Simply add the `--config` flag to the `jekyll` command, followed +by the path to one or more config files (comma-delimited, no spaces). + +#### As a result, the following command line flags are now deprecated: + +* `--no-server` +* `--no-auto` (now `--no-watch`) +* `--auto` (now `--watch`) +* `--server` +* `--url=` +* `--maruku`, `--rdiscount`, and `--redcarpet` +* `--pygments` +* `--permalink=` +* `--paginate` + +
      +
      The config flag explicitly specifies your configuration file(s)
      +

      If you use the `--config` flag, Jekyll will ignore your + `_config.yml` file. Want to merge a custom configuration with the normal + configuration? No problem. Jekyll will accept more than one custom config + file via the command line. Config files cascade from right to left, such + that if I run `jekyll serve --config _config.yml,_config-dev.yml`, + the values in the config files on the right (`_config-dev.yml`) overwrite + those on the left (`_config.yml`) when both contain the same key.

      +
      + +### New Config File Options + +Jekyll 1.0 introduced several new config file options. Before you upgrade, +you should check to see if any of these are present in your pre-1.0 config +file, and if so, make sure that you're using them properly: + +* `excerpt_separator` +* `host` +* `include` +* `keep_files` +* `layouts` +* `show_drafts` +* `timezone` +* `url` + +### Baseurl + +Often, you'll want the ability to run a Jekyll site in multiple places, +such as previewing locally before pushing to GitHub Pages. Jekyll 1.0 makes +that easier with the new `--baseurl` flag. To take advantage of this +feature, first add the production `baseurl` to your site's `_config.yml` +file. Then, throughout the site, simply prefix relative URLs +with `{% raw %}{{ site.baseurl }}{% endraw %}`. +When you're ready to preview your site locally, pass along the `--baseurl` +flag with your local baseurl (most likely `/`) to `jekyll serve` and Jekyll +will swap in whatever you've passed along, ensuring all your links work as +you'd expect in both environments. + + +
      +
      All page and post URLs contain leading slashes
      +

      If you use the method described above, please remember + that the URLs for all posts and pages contain a leading slash. Therefore, + concatenating the site baseurl and the post/page url where + `site.baseurl = /` and `post.url = /2013/06/05/my-fun-post/` will + result in two leading slashes, which will break links. It is thus + suggested that prefixing with `site.baseurl` only be used when the + `baseurl` is something other than the default of `/`.

      +
      diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md new file mode 100644 index 00000000..25d38b00 --- /dev/null +++ b/site/_docs/upgrading/2-to-3.md @@ -0,0 +1,64 @@ +--- +layout: docs +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 +that you'll want to know about. + +Before we dive in, go ahead and fetch the latest version of Jekyll: + +{% highlight bash %} +$ gem update jekyll +{% endhighlight %} + +
      +
      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.

      +
      + +### site.collections has changed + +In 2.x, your iterations over `site.collections` yielded an array with the collection +label and the collection object as the first and second items, respectively. In 3.x, +this complication has been removed and iterations now yield simply the collection object. +A simple conversion must be made in your templates: + +- `collection[0]` becomes `collection.label` +- `collection[1]` becomes `collection` + +When iterating over `site.collections`, ensure the above conversions are made. + +### 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: + +- jekyll-paginate – Jekyll's pagination solution from days past +- jekyll-coffeescript – processing of CoffeeScript +- jekyll-gist – the `gist` Liquid tag +- pygments.rb – the Pygments highlighter +- redcarpet – the Markdown processor +- toml – an alternative to YAML for configuration files +- classifier-reborn – for `site.related_posts` + +### Future posts + +A seeming feature regression in 2.x, the `--future` flag was automatically _enabled_. +The future flag allows post authors to give the post a date in the future and to have +it excluded from the build until the system time is equal or after the post time. +In Jekyll 3, this has been corrected. **Now, `--future` is disabled by default.** +This means you will need to include `--future` if you want your future-dated posts to +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 +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, +then the layout can access that via `{% raw %}{{ layout.class }}{% endraw %}`. + +_Did we miss something? Please click "Improve this page" above and add a section. Thanks!_ diff --git a/site/_includes/docs_ul.html b/site/_includes/docs_ul.html index 7cc54174..34b6278a 100644 --- a/site/_includes/docs_ul.html +++ b/site/_includes/docs_ul.html @@ -10,12 +10,8 @@ {% assign c = "" %} {% endif %} - {% for p in site.docs %} - {% if p.url == item_url %} -
    1. {{ p.title }}
    2. - {% break %} - {% endif %} - {% endfor %} + {% assign p = site.docs | where:"url",item_url | first %} +
    3. {{ p.title }}
    4. {% endfor %} From 61aff2c547b1dbff0d8a43c48402d70b87701c7b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 Nov 2015 08:58:34 -0800 Subject: [PATCH 219/810] Add more resources for MathJax integration. Fixes #4146. --- site/_docs/extras.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/site/_docs/extras.md b/site/_docs/extras.md index 2af6a305..b8b8bb72 100644 --- a/site/_docs/extras.md +++ b/site/_docs/extras.md @@ -9,7 +9,13 @@ may want to install, depending on how you plan to use Jekyll. ## Math Support -Kramdown comes with optional support for LaTeX to PNG rendering via [MathJax](http://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. +Kramdown comes with optional support for LaTeX to PNG rendering via [MathJax](http://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 %} + +{% 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). ## Alternative Markdown Processors From b01b089f69e7ada0aecdf20c4e31f135fcaf8372 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 Nov 2015 08:59:55 -0800 Subject: [PATCH 220/810] rake site:preview should also run :history and :version_file [ci skip] --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 0406685c..e189f0b9 100644 --- a/Rakefile +++ b/Rakefile @@ -137,7 +137,7 @@ end namespace :site do desc "Generate and view the site locally" - task :preview do + task :preview => [:history, :version_file] do require "launchy" require "jekyll" From 970edaf238a43f9e9b92ec5f861c0ce6e1978b7d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 Nov 2015 11:53:33 -0800 Subject: [PATCH 221/810] Update history to reflect merge of #4120 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index cf290e09..5f9a2d54 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,9 @@ ## HEAD +### Minor Enhancements + + * Cache parsed include file to save liquid parsing time. (#4120) + ### Development Fixes * `jekyll-docs` should be easily release-able (#4152) From 90865d5fc173f5ed4af8bff0a975f720326b06d6 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 18 Nov 2015 15:58:26 -0600 Subject: [PATCH 222/810] 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 ca5bb268..a62a9940 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -16,6 +16,15 @@ module Jekyll 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 @@ module Jekyll # 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 @@ module Jekyll # 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 1e4d3da6..625812aa 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -261,6 +261,26 @@ class TestPage < JekyllUnitTest 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 a95e5f16f0c743168130337a513683a034fe36d6 Mon Sep 17 00:00:00 2001 From: Paul Robert Lloyd Date: Thu, 19 Nov 2015 00:44:49 +0000 Subject: [PATCH 223/810] Add jekyll-roman to plugin directory --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 7cd7c3f8..ad7d27dc 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -780,6 +780,7 @@ LESS.js files during generation. - [Jekyll Thumbnail Filter](https://github.com/matallo/jekyll-thumbnail-filter): Related posts thumbnail filter. - [Jekyll-Smartify](https://github.com/pathawks/jekyll-smartify): SmartyPants filter. Make "quotes" “curly” - [liquid-md5](https://github.com/pathawks/liquid-md5): Returns an MD5 hash. Helpful for generating Gravatars in templates. +- [jekyll-roman](https://github.com/paulrobertlloyd/jekyll-roman): A liquid filter for Jekyll that converts numbers into Roman numerals. #### Tags From a729a1f08606dd6838c052c11bbf53cfe1777f9c Mon Sep 17 00:00:00 2001 From: Paul Robert Lloyd Date: Thu, 19 Nov 2015 00:47:03 +0000 Subject: [PATCH 224/810] Add jekyll-typogrify to plugin directory --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index ad7d27dc..4273f09c 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -781,6 +781,7 @@ LESS.js files during generation. - [Jekyll-Smartify](https://github.com/pathawks/jekyll-smartify): SmartyPants filter. Make "quotes" “curly” - [liquid-md5](https://github.com/pathawks/liquid-md5): Returns an MD5 hash. Helpful for generating Gravatars in templates. - [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/). #### Tags From 0ef5ab352dd4d31b134ddfb99ac2fa37d45cf959 Mon Sep 17 00:00:00 2001 From: Paul Robert Lloyd Date: Thu, 19 Nov 2015 00:48:51 +0000 Subject: [PATCH 225/810] Add jekyll-figure to plugin directory --- 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 4273f09c..eea7b89a 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -838,7 +838,7 @@ LESS.js files during generation. - [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. - [Jekyll Flickr Plugin](https://github.com/lawmurray/indii-jekyll-flickr) by [Lawrence Murray](http://www.indii.org): Embeds Flickr photosets (albums) as a gallery of thumbnails, with lightbox links to larger images. - +- [jekyll-figure](https://github.com/paulrobertlloyd/jekyll-figure): A liquid tag for Jekyll that generates `
      ` elements. #### Collections From e9f8b4df749eb793db744e7ba379de9f5bd89377 Mon Sep 17 00:00:00 2001 From: ducksan cho Date: Thu, 19 Nov 2015 17:15:51 +1300 Subject: [PATCH 226/810] 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 9146e7de..ca8a0ca9 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -40,7 +40,7 @@ module Jekyll 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 e4725718..00906352 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -74,7 +74,7 @@ module Jekyll 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 ab516767..54f400f8 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -222,15 +222,19 @@ module Jekyll # 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 02ebb09a..133aba0a 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 5d8be167d9c5ca1353689a561c75c2287e97a300 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 19 Nov 2015 06:57:52 -0600 Subject: [PATCH 227/810] Update history.markdown to reflect the merger of #4163 --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 5f9a2d54..ad92379f 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,10 @@ * `jekyll-docs` should be easily release-able (#4152) +### Site Enhancements + + * Add three plugins to directory (#4163) + ## 3.0.1 / 2015-11-17 ### Bug Fixes From 20a78dcca0f3aca3919c1712a0e1a8aef95d2165 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 Nov 2015 09:25:28 -0800 Subject: [PATCH 228/810] Update history to reflect merge of #4157 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ad92379f..130c81af 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ ### Site Enhancements * Add three plugins to directory (#4163) + * Add upgrading docs from 2.x to 3.x (#4157) ## 3.0.1 / 2015-11-17 From 487d9ffc21c782469690e9d533a9db978cb22a56 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 19 Nov 2015 18:46:03 -0600 Subject: [PATCH 229/810] Slightly speed up url sanitization and handle multiples of ///. --- lib/jekyll/url.rb | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 14b70631..6e8042b0 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -70,20 +70,11 @@ module Jekyll end end - # Returns a sanitized String URL - def sanitize_url(in_url) - url = in_url \ - # Remove all double slashes - .gsub(/\/\//, '/') \ - # Remove every URL segment that consists solely of dots - .split('/').reject{ |part| part =~ /^\.+$/ }.join('/') \ - # Always add a leading slash - .gsub(/\A([^\/])/, '/\1') + # Returns a sanitized String URL, stripping "../../" and multiples of "/", + # as well as the beginning "/" so we can enforce and ensure it. - # Append a trailing slash to the URL if the unsanitized URL had one - url << "/" if in_url.end_with?("/") - - url + def sanitize_url(str) + "/" + str.gsub(/\/{2,}/, "/").gsub(%r!\.+\/|\A/+!, "") end # Escapes a path to be a valid URL path segment From 2c04321d5ae234507719f12f4d5cf18b5e4a0105 Mon Sep 17 00:00:00 2001 From: Vincent Wochnik Date: Fri, 20 Nov 2015 01:55:39 +0100 Subject: [PATCH 230/810] Update plugins.md I have written a liquid filter to make email protection for static websites easy. This plugin contains the `protect_email` filter which encodes email addresses similar to the way GitHub does for the user profiles. --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index eea7b89a..37ca947d 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -782,6 +782,7 @@ LESS.js files during generation. - [liquid-md5](https://github.com/pathawks/liquid-md5): Returns an MD5 hash. Helpful for generating Gravatars in templates. - [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 #### Tags From 9ea8129d85753298af7b129d89b4d6f3f37a1fd9 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 19 Nov 2015 19:27:21 -0600 Subject: [PATCH 231/810] Update history.markdown to reflect the merger of #4168 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 130c81af..1b1edd4a 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Minor Enhancements * Cache parsed include file to save liquid parsing time. (#4120) + * Slightly speed up url sanitization and handle multiples of ///. (#4168) ### Development Fixes From 10b147f42991a20c444cb9d89be56d51b7235a7c Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 19 Nov 2015 19:28:27 -0600 Subject: [PATCH 232/810] Update history.markdown to reflect the merger of #4169. --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1b1edd4a..cbc710e6 100644 --- a/History.markdown +++ b/History.markdown @@ -13,6 +13,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) ## 3.0.1 / 2015-11-17 From c4fe2b0513a38707b39035767b15201468bf391b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 20 Nov 2015 10:51:16 -0800 Subject: [PATCH 233/810] Update pagination docs to reflect removal of pagination as runtime dep. Fixes #4171 --- site/_docs/pagination.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/site/_docs/pagination.md b/site/_docs/pagination.md index 2c0ae2b4..25482d01 100644 --- a/site/_docs/pagination.md +++ b/site/_docs/pagination.md @@ -4,10 +4,13 @@ title: Pagination permalink: /docs/pagination/ --- -With many websites—especially blogs—it’s very common to break the main listing -of posts up into smaller lists and display them over multiple pages. Jekyll has -pagination built-in, so you can automatically generate the appropriate files -and folders you need for paginated listings. +With many websites — especially blogs — it’s very common to +break the main listing of posts up into smaller lists and display them over +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.
      Pagination only works within HTML files
      From 16aea22c8d392c38afcda86f479d61a38718746c Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 23 Nov 2015 22:38:45 +0800 Subject: [PATCH 234/810] 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 bf05dbe0..94f9bf97 100644 --- a/lib/jekyll/commands/clean.rb +++ b/lib/jekyll/commands/clean.rb @@ -10,8 +10,8 @@ module Jekyll 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 235/810] 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 cbc710e6..3d4a5fa6 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 236/810] 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 25d38b00..8bbadd99 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 237/810] 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 7a4ed049..58e06c94 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 238/810] 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 454c09a2..3e64bc8b 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -14,7 +14,7 @@ module Jekyll 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 @@ module Jekyll 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 @@ eos 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 @@ eos 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 2276b207..f263e9d8 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -65,37 +65,37 @@ CONTENT 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 239/810] Update History.markdown --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3d4a5fa6..82caf865 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 240/810] Update mime-types. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 9b64809e..68b1a636 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 241/810] 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 37ca947d..a6154556 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 242/810] 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 4363aee1..70d47e90 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -58,7 +58,11 @@ module Jekyll 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 243/810] 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 82caf865..30f12903 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 244/810] 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 30f12903..ff2eb513 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 245/810] 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 ff2eb513..560b65c6 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 246/810] 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 68b1a636..4f3da61c 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 8d414be7..9550969b 100644 --- a/features/support/overview.rb +++ b/features/support/overview.rb @@ -2,7 +2,6 @@ require 'fileutils' require 'colorator' require 'cucumber/formatter/console' require 'cucumber/formatter/io' -require 'gherkin/formatter/escaping' module Features module Support @@ -17,12 +16,11 @@ module Features 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 247/810] 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 427c1bb4..cab01187 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 248/810] 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 560b65c6..9977b652 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 249/810] 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 7cd7c3f8..a617f574 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 250/810] 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 9977b652..c25fc45e 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 251/810] 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 cab01187..83ae379f 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 0e944407..2e39738e 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -16,7 +16,7 @@ module Jekyll 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 252/810] 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 d6cb173f..d6fba04f 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -30,6 +30,13 @@ module Jekyll 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 @@ module Jekyll 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 99efedea..8eeed7f3 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 253/810] 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 d6fba04f..a37dcbe7 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -30,7 +30,7 @@ module Jekyll 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 @@ module Jekyll 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 254/810] 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 c25fc45e..208ba755 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 255/810] 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 c1040b2b..03b13cf7 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 256/810] 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 111d6709..c26cd48d 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -19,6 +19,7 @@ module Jekyll 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 @@ module Jekyll 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 257/810] 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 208ba755..cd86d80f 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 258/810] 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 cd86d80f..e4b06a7d 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 259/810] 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 c26cd48d..389ae5a2 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -46,24 +46,16 @@ module Jekyll 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 260/810] Update History.markdown --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e4b06a7d..a5adb225 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 261/810] 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 03b13cf7..9dae4a1a 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 5980d248..f06ea77f 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 262/810] 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 12151395..016ff245 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -210,7 +210,13 @@ module Jekyll 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 263/810] 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 a5adb225..e0f8c769 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 264/810] 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 e0f8c769..1bef2ce6 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 265/810] 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 a3e6b5f0..5a1a0a56 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 266/810] 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 1bef2ce6..242810a8 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 267/810] 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 242810a8..86d55821 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 268/810] Modernize Kramdown for Markdown converter. --- Gemfile | 3 +- lib/jekyll/configuration.rb | 12 +- .../converters/markdown/kramdown_parser.rb | 93 +++++++++++--- lib/jekyll/utils.rb | 4 + test/helper.rb | 14 +- test/test_kramdown.rb | 121 ++++++++++++------ 6 files changed, 173 insertions(+), 74 deletions(-) diff --git a/Gemfile b/Gemfile index 9b64809e..19548e81 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 f57b3ae4..a3e80c7f 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -68,17 +68,7 @@ module Jekyll '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 40dfa87e..d1fa7865 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) - end - end - - Kramdown::Document.new(content, Utils.symbolize_hash_keys(@config['kramdown'])).to_html + 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 + + 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 7d2490a6..0b67911b 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -8,6 +8,10 @@ module Jekyll 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 dc021767..281f6871 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -11,13 +11,13 @@ unless ENV['TRAVIS'] 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 @@ class JekyllUnitTest < Minitest::Test 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 @@ class JekyllUnitTest < Minitest::Test 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 b7f44925..21ba5764 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', + 'toc_levels' => '1..6', + 'auto_ids' => false, + 'footnote_nr' => 1, - 'enable_coderay' => true, - 'coderay_bold_every'=> 12, - 'coderay' => { - 'coderay_css' => :style, - 'coderay_bold_every' => 8 + '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'] + 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 + + selector = "div.highlighter-coderay>div.CodeRay>div.code>pre" + refute result.css(selector).empty? end - should "work correctly" do - assert_equal :style, @converter_config['coderay_css'] + 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 "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 - should "also work for defaults" do - default = Jekyll::Configuration::DEFAULTS['kramdown']['coderay']['coderay_tab_width'] - assert_equal default, @converter_config['coderay_tab_width'] - end - - should "not overwrite" do - assert_equal 12, @converter_config['coderay_bold_every'] - 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 269/810] 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 a3e80c7f..c2e74eb2 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -65,10 +65,12 @@ module Jekyll '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 270/810] 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 19548e81..b1c118dd 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 d1fa7865..05b94337 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -6,12 +6,12 @@ module Jekyll 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 @@ module Jekyll @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 @@ module Jekyll 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 @@ module Jekyll 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 271/810] 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 86d55821..1346ab28 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 272/810] 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 7e2d30f3..f3193f21 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -281,6 +281,11 @@ module Jekyll 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 58e06c94..20a3a3f2 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 cf4db89b..59b882f1 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -388,5 +388,12 @@ class TestFilters < JekyllUnitTest 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 273/810] 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 f3193f21..70e93b90 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -281,9 +281,9 @@ module Jekyll 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 20a3a3f2..fd42b6b1 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 59b882f1..5fd9facb 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -393,6 +393,13 @@ class TestFilters < JekyllUnitTest 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 274/810] 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 00000000..29ed62d0 --- /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 d75a4982..6441a147 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 00000000..66b8552d --- /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 e189f0b9..3596270b 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 7d2490a6..339c860a 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 00000000..05f38429 --- /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 83858a07..abc1598c 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 00000000..b209e237 --- /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 275/810] 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 8026187c..82e32e86 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 276/810] Update History.markdown --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1346ab28..583784ae 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 277/810] 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 70e93b90..6efc2e94 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -283,7 +283,12 @@ module Jekyll 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 5fd9facb..dc51252e 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -397,7 +397,7 @@ class TestFilters < JekyllUnitTest 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 278/810] 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 8026187c..6c86836f 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 279/810] 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 | 271 +++++++++++++++------------ lib/jekyll/commands/serve/servlet.rb | 56 ++++++ site/_docs/configuration.md | 36 ++++ test/test_commands_serve.rb | 115 ++++++++++++ 4 files changed, 360 insertions(+), 118 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 389ae5a2..aa8fc6a8 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 + prog.command(:serve) do |cmd| + cmd.description "Serve your site locally" + cmd.syntax "serve [options]" + cmd.alias :server + cmd.alias :s - add_build_options(c) + add_build_options(cmd) + COMMAND_OPTIONS.each do |key, val| + cmd.option key, *val + end - 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) + 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'] + # + + def process(opts) + opts = configuration_from_options(opts) + destination = opts["destination"] setup(destination) - s = WEBrick::HTTPServer.new(webrick_options(options)) - s.unmount("") + 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 - s.mount( - options['baseurl'], - custom_file_handler, - destination, - file_handler_options - ) + # 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_relative "serve/servlet" - 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 + FileUtils.mkdir_p(destination) + 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")) + end + end end + end + + # + + private + def webrick_opts(opts) + opts = { + :JekyllOptions => opts, + :DoNotReverseLookup => true, + :MimeTypes => mime_types, + :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 + ) + } + + 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 - 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 } + Jekyll.logger.info "Server detached with pid '#{pid}'.", \ + "Run `pkill -f jekyll' or `kill -9 #{pid}' to stop the server." + else + t = Thread.new { server.start } + trap("INT") { server.shutdown } t.join end end - def setup(destination) - require 'webrick' + # Make the stack verbose if the user requests it. - FileUtils.mkdir_p(destination) - - # monkey patch WEBrick using custom 404 page (/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')) - end - end - end + 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 - def webrick_options(config) - opts = { - :BindAddress => config['host'], - :DirectoryIndex => %w(index.html index.htm index.cgi index.rhtml index.xml), - :DocumentRoot => config['destination'], - :DoNotReverseLookup => true, - :MimeTypes => mime_types, - :Port => config['port'], - :StartCallback => start_callback(config['detach']) - } + # 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. - if config['verbose'] - opts.merge!({ - :Logger => WEBrick::Log.new($stdout, WEBrick::Log::DEBUG) - }) - else - opts.merge!({ - :AccessLog => [], - :Logger => WEBrick::Log.new([], WEBrick::Log::WARN) - }) + 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 - opts - 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 - 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 00000000..4b11ad0d --- /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 2bb65e82..f6a71ed2 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 00000000..87472c3d --- /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 280/810] 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 583784ae..2d4e3fa3 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 281/810] 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 6efc2e94..2b1bf1af 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -283,11 +283,11 @@ module Jekyll 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 282/810] 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 2d4e3fa3..c87e220b 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 283/810] 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 a37dcbe7..673d9a99 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -33,7 +33,7 @@ module Jekyll 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 284/810] 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 4b11ad0d..cc6d958f 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -18,24 +18,26 @@ module Jekyll 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 285/810] [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 c87e220b..f5ad6291 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 286/810] 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 | 65 +++++++++++++++------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index cc6d958f..fa376f61 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" - 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] + unless typ =~ /;\s*charset=/ + res.header[key] = "#{typ}; charset=#{@jekyll_opts["encoding"]}" 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 287/810] [CI:SKIP] Update Gemnasium URL. --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index b1dfae4a..d8c621d1 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 288/810] 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 f5ad6291..ef9e8f03 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 289/810] 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 e41bce27..04dbb6f2 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -39,6 +39,7 @@ module Jekyll 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 bc541617..11db89d1 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -24,12 +24,7 @@ module Jekyll # # 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 @@ module Jekyll # 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 290/810] 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 ef9e8f03..a598bdf8 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 291/810] 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 8ede6a68..aad76dc8 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 292/810] 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 a598bdf8..3f9622d7 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 293/810] script/cibuild: fail if subprocesses fail --- script/cibuild | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/cibuild b/script/cibuild index afafd7d0..d30fd36b 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 294/810] 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 aad76dc8..b414c90d 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 295/810] 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 42d04921..7eb6559f 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 296/810] 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 3f9622d7..2a9ee75b 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 297/810] 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 bf5d2d4c..58980f41 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 298/810] 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 f6a71ed2..ccff8f49 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 299/810] 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 2a9ee75b..309b9a6c 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 300/810] 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 309b9a6c..19284394 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 301/810] 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 6cf3e99b..c4a1f456 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -32,7 +32,7 @@ module Jekyll # 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 302/810] 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 19284394..b6d01032 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 303/810] 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 8bbadd99..cdc69fd0 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 304/810] 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 202ade0e..61d74a32 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 305/810] [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 b6d01032..1f78cecb 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 306/810] 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 3399616f..1c833142 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 307/810] 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 1f78cecb..92780830 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 308/810] 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 43fa602c..eb33ec85 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 309/810] 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 92780830..dc030d1f 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 310/810] 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 eb33ec85..dee50ac2 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 311/810] 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 61d74a32..66023147 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 312/810] 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 ee02d06b..f16bd202 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 313/810] 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 3fa1e4c3..1ca2948a 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 314/810] 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 fa76a9fb..3bb4af11 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 315/810] 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 dc030d1f..9dd16cb0 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 316/810] Rakefile: alias :generate to :build --- Rakefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Rakefile b/Rakefile index 3596270b..02e105d5 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 317/810] 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 3e8e639d..a90a5a0b 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -172,6 +172,7 @@ end 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 c4a1f456..f74ccf6f 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -170,14 +170,7 @@ module Jekyll # # 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 016ff245..db34307a 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -210,13 +210,8 @@ module Jekyll 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 @@ module Jekyll 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 528fed68..622f1180 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -38,12 +38,10 @@ module Jekyll end def output=(output) - @to_liquid = nil @output = output end def content=(content) - @to_liquid = nil @content = content end @@ -181,27 +179,7 @@ module Jekyll # # 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 @@ module Jekyll # # Returns nothing. def read(opts = {}) - @to_liquid = nil - Jekyll.logger.debug "Reading:", relative_path if yaml_file? @@ -353,21 +329,7 @@ module Jekyll # # 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 00000000..30c9f865 --- /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 00000000..4d7207d5 --- /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 00000000..51257cff --- /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 00000000..c4009da0 --- /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 00000000..1551728e --- /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 00000000..77d6a416 --- /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 00000000..65733b20 --- /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 00000000..047acacf --- /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 a62a9940..0644e1b6 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -117,12 +117,10 @@ module Jekyll # # 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 529ff84b..09763cca 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 @@ module Jekyll 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 @@ module Jekyll 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 @@ module Jekyll 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 5e9402f4..4dc3ac84 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -259,25 +259,7 @@ module Jekyll # "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 6e8042b0..b338c23a 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -59,6 +59,14 @@ module Jekyll # # 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 @@ module Jekyll 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 318/810] 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 3bb4af11..2299c83c 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 319/810] 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 30c9f865..2c447cb4 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -13,7 +13,7 @@ module Jekyll 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 4d7207d5..9319424b 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -38,10 +38,11 @@ module Jekyll 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 51257cff..d7948beb 100644 --- a/lib/jekyll/drops/immutable_drop.rb +++ b/lib/jekyll/drops/immutable_drop.rb @@ -12,7 +12,7 @@ module Jekyll if respond_to? key public_send key else - data[key] + fallback_data[key] end end @@ -20,7 +20,7 @@ module Jekyll 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 1551728e..9dd4048d 100644 --- a/lib/jekyll/drops/mutable_drop.rb +++ b/lib/jekyll/drops/mutable_drop.rb @@ -15,7 +15,7 @@ module Jekyll 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 77d6a416..82c55230 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -8,6 +8,14 @@ module Jekyll 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 @@ module Jekyll 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 320/810] 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 9319424b..c4170d86 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_delegators :@obj, :id, :output, :content, :to_s, :relative_path, :url - def content - @obj.content - end - - def relative_path - @obj.relative_path - end alias_method :path, :relative_path def url @@ -33,10 +25,6 @@ module Jekyll @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 321/810] 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 2c447cb4..8dc8c6b8 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -6,7 +6,12 @@ module Jekyll 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 322/810] 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 9dd16cb0..22f4f05d 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 323/810] 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 8dc8c6b8..b8a1bdd7 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -10,7 +10,7 @@ module Jekyll :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 c4170d86..0da6986b 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -9,10 +9,6 @@ module Jekyll alias_method :path, :relative_path - def url - @obj.url - end - def collection @obj.collection.label end @@ -30,9 +26,7 @@ module Jekyll 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 82c55230..4c632a0d 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -6,10 +6,11 @@ module Jekyll 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 @@ module Jekyll @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 65733b20..6db48f66 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 @@ module Jekyll @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 324/810] 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 622f1180..0a416eff 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -353,7 +353,7 @@ module Jekyll # 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 325/810] 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 d97918bd..1fcc7cce 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 326/810] 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 489f256b..b561c00c 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 327/810] 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 6ebfb27d..0b43c8c9 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 328/810] 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 322ba3c6..61ffded3 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -10,8 +10,7 @@ class TestExcerpt < JekyllUnitTest 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 625812aa..16b9e060 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -9,7 +9,7 @@ class TestPage < JekyllUnitTest 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 329/810] 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 0b43c8c9..2792a829 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 330/810] 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 a90a5a0b..de6b6c69 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -32,6 +32,7 @@ require 'colorator' 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 d7948beb..630cbfe1 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 @@ module Jekyll 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 331/810] 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 b338c23a..a001f44d 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -79,8 +79,12 @@ module Jekyll 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 94da8bd5..a2c6139d 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -174,13 +174,14 @@ module Jekyll 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 e4529be7..578e8962 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 332/810] 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 0a416eff..a1bf6bad 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -12,11 +12,13 @@ module Jekyll # 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 @@ module Jekyll # 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 333/810] 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 b8a1bdd7..ccb3045a 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -6,6 +6,7 @@ module Jekyll class CollectionDrop < ImmutableDrop extend Forwardable + def_delegator :@obj, :write?, :output def_delegators :@obj, :label, :docs, :files, :directory, :relative_directory @@ -13,14 +14,8 @@ module Jekyll 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 0da6986b..81c9bcd2 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -5,22 +5,15 @@ module Jekyll 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 4c632a0d..61ac8098 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -30,9 +30,7 @@ module Jekyll 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 047acacf..163591dd 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -3,18 +3,15 @@ module Jekyll module Drops class UrlDrop < ImmutableDrop + extend Forwardable + + def_delegator :@obj, :cleaned_relative_path, :path + def_delegator :@obj, :output_ext, :output_ext + 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 From 3effae59d8a8ab0b78e3dba19f4d13aa9eea03d6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 24 Dec 2015 15:09:26 -0500 Subject: [PATCH 334/810] 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 22f4f05d..6ee375f4 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 335/810] 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 6ee375f4..c415701d 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 336/810] 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 de6b6c69..686aad3b 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -16,6 +16,7 @@ end require 'rubygems' # stdlib +require 'forwardable' require 'fileutils' require 'time' require 'English' diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index 36fcd11b..f5884d68 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 337/810] 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 a1bf6bad..8c1b77cf 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -356,11 +356,9 @@ module Jekyll # 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 338/810] 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 02e105d5..00c93db5 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 00000000..c04520e5 --- /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 00000000..a78690d8 --- /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 00000000..eb5b263b --- /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 339/810] 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 8c1b77cf..14a0a92e 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -355,7 +355,7 @@ module Jekyll # 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 340/810] 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 686aad3b..e3fca10b 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -33,8 +33,6 @@ require 'colorator' 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 630cbfe1..5440aa00 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 @@ module Jekyll 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 dc5238a0..2b0dbc0c 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 341/810] 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 a001f44d..3f00cfd3 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -80,10 +80,11 @@ module Jekyll 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 342/810] 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 c415701d..7b373689 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 343/810] 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 00c93db5..e3f99c41 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 c04520e5..4fcc6af5 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 00000000..aec162b5 --- /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 344/810] 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 1ca2948a..57f7d515 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 345/810] 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 ccb3045a..009635a4 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 81c9bcd2..f6e03fec 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 00000000..09bdb2d2 --- /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 5440aa00..00000000 --- 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 9dd4048d..00000000 --- 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 61ac8098..ec4f0910 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 6db48f66..3c593ba6 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 163591dd..a2bf6262 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 346/810] 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 7b373689..0e818280 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 347/810] 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 d1cd5367..e09c4857 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 348/810] 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 0e818280..f603cbd3 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 349/810] 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 09bdb2d2..b14581a4 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 @@ module Jekyll 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 350/810] 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 88e0fe9e..32999aba 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 @@ OUTPUT 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 @@ OUTPUT 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 88f35220..11acdb31 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 3af7a1f0..85512ab4 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -19,12 +19,12 @@ class TestStaticFile < JekyllUnitTest 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 @@ class TestStaticFile < JekyllUnitTest 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 351/810] 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 f603cbd3..52d70538 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 352/810] 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 f25a5f69..42d4f3ed 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 353/810] 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 b14581a4..98eb864a 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -71,6 +71,18 @@ module Jekyll 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 @@ module Jekyll # # 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 @@ module Jekyll 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 3c593ba6..26b9104b 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 a2c6139d..c0c56579 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -31,7 +31,8 @@ module Jekyll # 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 @@ module Jekyll 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 42d4f3ed..bf7e8957 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" => {}} - assert Utils.deep_merge_hashes(data, @site.site_payload) + 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_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 354/810] 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 e3c89934..711c0a31 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -14,8 +14,7 @@ module Jekyll raise Errors::FatalException, "Bailing out; invalid Markdown processor." end - @setup = \ - true + @setup = true end def get_processor @@ -33,8 +32,7 @@ module Jekyll # 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 @@ module Jekyll end def matches(ext) - extname_list.include?( - ext.downcase - ) + extname_list.include?(ext.downcase) end def output_ext(ext) @@ -65,19 +61,15 @@ module Jekyll 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 355/810] 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 52d70538..33bc0830 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 356/810] 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 33bc0830..9a2b4aca 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 357/810] 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 7907aaa5..2d2bf2c6 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 358/810] 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 e3fca10b..3d33e52c 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -169,6 +169,7 @@ module Jekyll 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 009635a4..26913230 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 359/810] Update History.markdown --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9a2b4aca..4b2cb3fa 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 360/810] 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 0e4f5759..6bf17766 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 361/810] 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 2299c83c..a2080868 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 362/810] 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 57f7d515..2aff0b95 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 363/810] 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 4b2cb3fa..c590832f 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 364/810] 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 c590832f..b45e565b 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 365/810] 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 cdc69fd0..c01be517 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 366/810] 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 29ed62d0..ae7e3d26 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 367/810] 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 66b8552d..478837c3 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 368/810] 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 ae7e3d26..27b8728d 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 478837c3..1bd98b26 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 cdafdc9b..750c461b 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 369/810] Update copyright notices to 2016 [ci skip] --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 527166b6..94dbfc39 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 370/810] 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 41340ae5..1598d6fe 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 371/810] 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 1bd98b26..345bec1d 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 372/810] 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 3d33e52c..24448c26 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -95,7 +95,7 @@ module Jekyll # 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 f74ccf6f..a68fbfec 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -76,7 +76,7 @@ module Jekyll # 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 @@ module Jekyll # # 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 @@ module Jekyll # 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 02e1967d..8ce2c473 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -105,7 +105,7 @@ module Jekyll 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 14a0a92e..c906e149 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -52,7 +52,7 @@ module Jekyll # 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 099ebf13..12e70748 100644 --- a/lib/jekyll/readers/page_reader.rb +++ b/lib/jekyll/readers/page_reader.rb @@ -4,7 +4,7 @@ module Jekyll 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 279bea46..b95981a8 100644 --- a/lib/jekyll/readers/static_file_reader.rb +++ b/lib/jekyll/readers/static_file_reader.rb @@ -4,7 +4,7 @@ module Jekyll 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 48fa34c5..6f24f7d2 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 @@ module Jekyll # # 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 373/810] 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 a68fbfec..9b9f6593 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -79,7 +79,8 @@ module Jekyll 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 aa8fc6a8..4dad7600 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -168,7 +168,8 @@ module Jekyll 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 2e39738e..6082a4cc 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -25,7 +25,7 @@ module Jekyll @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 374/810] 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 8ce2c473..a29cbf7e 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -39,8 +39,8 @@ module Jekyll 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 @@ module Jekyll 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 @@ module Jekyll 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 e01f798c..21929f3f 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -173,7 +173,7 @@ module Jekyll 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 @@ module Jekyll 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 @@ module Jekyll 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 @@ module Jekyll %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 @@ module Jekyll 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 @@ module Jekyll 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 @@ module Jekyll 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 2b1bf1af..2ba0fac3 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -234,7 +234,7 @@ module Jekyll 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 a9a5e735..74c01bbb 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -67,7 +67,7 @@ module Jekyll } 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 11db89d1..da7bf121 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -86,8 +86,8 @@ module Jekyll 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 4dc3ac84..2575eba2 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -292,10 +292,10 @@ module Jekyll # 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 3e64bc8b..616dfdbf 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -88,7 +88,7 @@ eos 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 5b0d6479..2da26ec0 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -70,9 +70,9 @@ eos 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 375/810] 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 a29cbf7e..953c2623 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -51,12 +51,10 @@ module Jekyll 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 @@ module Jekyll 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 2da26ec0..723eafd7 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -59,23 +59,21 @@ eos 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 376/810] 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 67705b51..26754040 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 24448c26..ad8a3395 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 377/810] 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 2d84ee34..c7d47c59 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -76,7 +76,7 @@ module Jekyll # # 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 6f24f7d2..efa836d1 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -75,7 +75,7 @@ module Jekyll 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 9a9f412e..ea26c8b5 100644 --- a/lib/jekyll/stevenson.rb +++ b/lib/jekyll/stevenson.rb @@ -14,7 +14,7 @@ module Jekyll 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 616dfdbf..13c4e8e8 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -27,7 +27,7 @@ module Jekyll @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 6082a4cc..e3bee115 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -115,7 +115,7 @@ eos 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 c0c56579..d18b41c7 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -31,8 +31,8 @@ module Jekyll # 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 378/810] 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 26754040..297e1175 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 21929f3f..a2e5e381 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -128,7 +128,7 @@ module Jekyll # 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 @@ module Jekyll 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 711c0a31..8e297dca 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -41,7 +41,7 @@ module Jekyll 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 6788d96e..7f5adcee 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -71,10 +71,10 @@ module Jekyll 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 db34307a..b510d306 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -160,7 +160,7 @@ module Jekyll # # 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 8fda510b..d4ea3c88 100644 --- a/lib/jekyll/deprecator.rb +++ b/lib/jekyll/deprecator.rb @@ -21,7 +21,7 @@ module Jekyll 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 c906e149..f3eda04f 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -127,7 +127,7 @@ module Jekyll # # 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 @@ module Jekyll # # 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 04dbb6f2..81248051 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -7,10 +7,10 @@ module Jekyll # 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 32b09cb3..15a802b0 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -72,7 +72,7 @@ module Jekyll 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 0644e1b6..fb46f324 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -8,13 +8,13 @@ module Jekyll 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 6a54321d..8d522551 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 2575eba2..2859355c 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -19,8 +19,8 @@ module Jekyll 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 d18b41c7..d5c68ae4 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -4,7 +4,7 @@ module Jekyll 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 379/810] 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 98eb864a..23237a08 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -83,6 +83,19 @@ module Jekyll 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 673d9a99..edf70969 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -90,7 +90,7 @@ module Jekyll 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 @@ module Jekyll # 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 c7d47c59..52ff5178 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -90,7 +90,7 @@ module Jekyll 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 e3bee115..4152e7ef 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -115,7 +115,7 @@ eos 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 @@ eos 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 380/810] 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 13c4e8e8..575fb57e 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -21,7 +21,7 @@ module Jekyll 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 @@ eos 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 381/810] 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 9b9f6593..5d6b2728 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -56,7 +56,7 @@ module Jekyll 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 f3eda04f..d757839f 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -197,9 +197,9 @@ module Jekyll # 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 a2bf6262..32aae194 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -19,8 +19,8 @@ module Jekyll 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 2ba0fac3..ef40adb9 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -45,7 +45,7 @@ module Jekyll # 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 74c01bbb..a9bf79f5 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -4,37 +4,37 @@ module Jekyll # 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 @@ module Jekyll # 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 c41ef10a..1bf8ca29 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -53,8 +53,8 @@ module Jekyll 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 09763cca..f7bfed3d 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -43,8 +43,8 @@ module Jekyll 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 efa836d1..881e44b1 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -104,12 +104,12 @@ module Jekyll 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 @@ module Jekyll 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 575fb57e..a487b404 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -99,7 +99,7 @@ eos 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 382/810] 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 ad8a3395..6c5d8f10 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -165,7 +165,6 @@ module Jekyll # Conditional optimizations Jekyll::External.require_if_present('liquid-c') - end end diff --git a/lib/jekyll/command.rb b/lib/jekyll/command.rb index f3c89dfd..afe72a5b 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 @@ module Jekyll 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 de0cc8bc..b75194ef 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 @@ module Jekyll 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 94f9bf97..b7f9a953 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 @@ module Jekyll 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 953c2623..ba98e653 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 @@ module Jekyll end end end - end end end diff --git a/lib/jekyll/commands/help.rb b/lib/jekyll/commands/help.rb index 421d87e5..01bf3280 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 @@ module Jekyll 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 a2e5e381..f8ecd3ed 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 7f5adcee..8378cb5d 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 26913230..5f5025b1 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -17,7 +17,6 @@ module Jekyll 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 f6e03fec..69933752 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -22,7 +22,6 @@ module Jekyll 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 23237a08..2ad107e8 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -135,7 +135,6 @@ module Jekyll 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 ec4f0910..4d07ebe8 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -33,7 +33,6 @@ module Jekyll 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 26b9104b..b642bda2 100644 --- a/lib/jekyll/drops/unified_payload_drop.rb +++ b/lib/jekyll/drops/unified_payload_drop.rb @@ -20,7 +20,6 @@ module Jekyll def fallback_data @fallback_data ||= {} end - end end end diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index 81248051..d213364b 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 @@ If you run into trouble, you can find helpful resources at http://jekyllrb.com/h end end end - end end end diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index da7bf121..d4ad9951 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -91,6 +91,5 @@ module Jekyll "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 8d522551..062be42a 100644 --- a/lib/jekyll/readers/collection_reader.rb +++ b/lib/jekyll/readers/collection_reader.rb @@ -16,6 +16,5 @@ module Jekyll 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 fbc2837b..eb57a7fc 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 f7bfed3d..f9c1b88c 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 @@ module Jekyll output end - end end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index a487b404..0a5b790b 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -115,7 +115,6 @@ eos ].join(" ") "
    #{code.chomp}
    " end - end end end diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 4152e7ef..c8f08a6c 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -12,7 +12,6 @@ module Jekyll 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 3f00cfd3..367872c0 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -11,7 +11,6 @@ require 'uri' # 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 383/810] 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 4dad7600..507a8c71 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -103,7 +103,7 @@ module Jekyll WEBrick::Config::FileHandler.merge({ :FancyIndexing => true, :NondisclosureName => [ - '.ht*','~*' + '.ht*', '~*' ] }) end diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index f8ecd3ed..1b459eb7 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -18,7 +18,7 @@ module Jekyll '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 @@ module Jekyll # # 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 8378cb5d..64e69ecc 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -6,7 +6,7 @@ module Jekyll 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 45a20422..92d2528c 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -38,9 +38,9 @@ module Jekyll 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 @@ module Jekyll # 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 384/810] 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 1b459eb7..089c231a 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -273,7 +273,7 @@ module Jekyll 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 d757839f..4ec70127 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -291,7 +291,7 @@ module Jekyll "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 @@ module Jekyll 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 @@ module Jekyll 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 ef40adb9..be3efa62 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -337,7 +337,7 @@ module Jekyll 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 15a802b0..74ec6066 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -69,7 +69,7 @@ module Jekyll 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 92d2528c..bc72c657 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -22,7 +22,7 @@ module Jekyll # 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 @@ module Jekyll 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 12e70748..97748c01 100644 --- a/lib/jekyll/readers/page_reader.rb +++ b/lib/jekyll/readers/page_reader.rb @@ -14,8 +14,8 @@ module Jekyll # # 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 b95981a8..8def1365 100644 --- a/lib/jekyll/readers/static_file_reader.rb +++ b/lib/jekyll/readers/static_file_reader.rb @@ -14,7 +14,7 @@ module Jekyll # # 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 0a5b790b..d0d70882 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -68,7 +68,7 @@ eos [: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 385/810] 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 ca8a0ca9..6c89e2bc 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -13,7 +13,7 @@ module Jekyll # 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 ba98e653..42bb0110 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -59,7 +59,7 @@ module Jekyll 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 fa376f61..7930eb61 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -52,7 +52,7 @@ module Jekyll 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 8e297dca..07675427 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -7,7 +7,7 @@ module Jekyll 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 52ff5178..cd672830 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -119,7 +119,7 @@ module Jekyll 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 386/810] 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 fb5172e7..daf8874e 100644 --- a/lib/jekyll/converters/markdown/rdiscount_parser.rb +++ b/lib/jekyll/converters/markdown/rdiscount_parser.rb @@ -5,7 +5,7 @@ module Jekyll 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 4ec70127..9e588ded 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -291,7 +291,7 @@ module Jekyll "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 @@ module Jekyll 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 387/810] 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 089c231a..353e437a 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -127,7 +127,7 @@ module Jekyll # 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 388/810] 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 297e1175..173a58d3 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 b75194ef..cf6d7ea0 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -11,7 +11,7 @@ module Jekyll 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 b7f9a953..371b7043 100644 --- a/lib/jekyll/commands/clean.rb +++ b/lib/jekyll/commands/clean.rb @@ -9,7 +9,7 @@ module Jekyll 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 42bb0110..32600741 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -10,7 +10,7 @@ module Jekyll 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 9e588ded..5b8c9044 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -32,7 +32,7 @@ module Jekyll 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 2ad107e8..c194a5ba 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -114,7 +114,7 @@ module Jekyll # # 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 0edeb44b..70f7b0d1 100644 --- a/lib/jekyll/liquid_renderer.rb +++ b/lib/jekyll/liquid_renderer.rb @@ -15,7 +15,7 @@ module Jekyll 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 74ec6066..e3e0c8af 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -69,7 +69,7 @@ module Jekyll 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 fb46f324..aaf472cf 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -41,7 +41,7 @@ module Jekyll 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 2859355c..3ed60c12 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -165,7 +165,7 @@ module Jekyll 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 ea26c8b5..d6dd5434 100644 --- a/lib/jekyll/stevenson.rb +++ b/lib/jekyll/stevenson.rb @@ -5,7 +5,7 @@ module Jekyll @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 389/810] 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 cf6d7ea0..d505e2fb 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -65,7 +65,7 @@ module Jekyll # 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 32600741..c6ba4fd4 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -58,7 +58,7 @@ module Jekyll 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 7930eb61..cf495216 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -37,7 +37,7 @@ module Jekyll # 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 353e437a..0229e073 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -282,7 +282,7 @@ module Jekyll 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 69171b00..9574769d 100644 --- a/lib/jekyll/converters/identity.rb +++ b/lib/jekyll/converters/identity.rb @@ -5,7 +5,7 @@ module Jekyll 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 07675427..e6efabf5 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -56,7 +56,7 @@ module Jekyll 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 64e69ecc..fd1b0461 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -47,7 +47,7 @@ module Jekyll 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 bc72c657..2926971b 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -67,7 +67,7 @@ module Jekyll # 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 390/810] 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 881e44b1..72c26741 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -124,7 +124,7 @@ module Jekyll :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 367872c0..950945a7 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -92,7 +92,7 @@ module Jekyll # 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 391/810] 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 fd1b0461..12b4f3fb 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -52,7 +52,6 @@ module Jekyll 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 aaf472cf..019cb095 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -37,7 +37,6 @@ module Jekyll @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 cd672830..1e751f7d 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -62,7 +62,6 @@ module Jekyll clear_cache end - # Clear just the cache # # Returns nothing @@ -70,7 +69,6 @@ module Jekyll @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 eb57a7fc..51ae8d8f 100644 --- a/lib/jekyll/related_posts.rb +++ b/lib/jekyll/related_posts.rb @@ -23,7 +23,6 @@ module Jekyll 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 d5c68ae4..0760d9e3 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -225,7 +225,6 @@ module Jekyll 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 392/810] 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 a9bf79f5..869bcc1f 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -6,7 +6,7 @@ module Jekyll PRIORITY_MAP = { :low => 10, :normal => 20, - :high => 30, + :high => 30 }.freeze # initial empty hooks @@ -16,26 +16,26 @@ module Jekyll :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 @@ module Jekyll :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 72c26741..7938a050 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -109,7 +109,7 @@ module Jekyll @collection.relative_directory.size..relative_path.size], :output_ext => '', :name => '', - :title => '', + :title => '' } end @@ -122,7 +122,7 @@ module Jekyll 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 393/810] 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 d0d70882..027865cd 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -111,7 +111,7 @@ eos 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 394/810] 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 c6ba4fd4..3a263501 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -50,7 +50,8 @@ module Jekyll 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 @@ module Jekyll 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 723eafd7..5b3df093 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -59,21 +59,21 @@ eos 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 395/810] 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 c01be517..e3529f63 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. +{% 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 %} -This can be fixed by removing the following line from your _config.yml file: - - 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 396/810] 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 e6efabf5..bb7b7ffa 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -19,9 +19,9 @@ module Jekyll 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 edf70969..877f517e 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -13,19 +13,20 @@ module Jekyll 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 cbb24be3..870fc2dc 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -50,13 +50,13 @@ module Jekyll # 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 0760d9e3..1d81e0f0 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -164,16 +164,17 @@ module Jekyll 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 397/810] 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 b45e565b..cb91e071 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 398/810] Rubocop: Style/ElseAlignment - Align else with if Rubocop: Lint/EndAlignment - Align end with if --- lib/jekyll/regenerator.rb | 23 ++++++++++++----------- lib/jekyll/static_file.rb | 14 +++++++------- lib/jekyll/tags/include.rb | 12 ++++++------ 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 1e751f7d..bb9284aa 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -155,20 +155,21 @@ module Jekyll # # Returns the read metadata. def read_metadata - @metadata = if !disabled? && File.file?(metadata_file) - content = File.binread(metadata_file) + @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}") + 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 7938a050..0ed0fbfe 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -118,13 +118,13 @@ module Jekyll # 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 c8f08a6c..b92e5b85 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -42,12 +42,12 @@ module Jekyll 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 399/810] 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 5b8c9044..0d23ac88 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 @@ module Jekyll 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 400/810] 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 5d6b2728..ea6a81b6 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -187,7 +187,7 @@ module Jekyll # 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 0d23ac88..7d7e6bb4 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -60,7 +60,7 @@ module Jekyll 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 be3efa62..734457cb 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -223,7 +223,7 @@ module Jekyll # 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 027865cd..5881fa58 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -21,7 +21,7 @@ module Jekyll 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 b92e5b85..847e6638 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -56,7 +56,7 @@ module Jekyll 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 401/810] 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 507a8c71..29408fe2 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -123,7 +123,14 @@ module Jekyll 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 402/810] 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 12b4f3fb..79133a2a 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -7,6 +7,7 @@ module Jekyll 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 7d7e6bb4..42881309 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -278,7 +278,7 @@ module Jekyll 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 403/810] 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 6c5d8f10..8b92a045 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -156,10 +156,10 @@ module Jekyll 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 404/810] 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 b510d306..d9298f4f 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -47,7 +47,7 @@ module Jekyll 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 42881309..8d7c92f4 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -263,7 +263,7 @@ module Jekyll 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 5881fa58..a7dbd519 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -13,11 +13,11 @@ module Jekyll 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 405/810] 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 d9298f4f..c61807f9 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -87,9 +87,9 @@ module Jekyll 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 @@ module Jekyll # # 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 734457cb..9b2cad9d 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -238,7 +238,7 @@ module Jekyll "'#{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 @@ module Jekyll else apple_property <=> orange_property end - } + end end end diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 2926971b..c9ded560 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -68,11 +68,11 @@ module Jekyll # # 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 3ed60c12..fcd4bf77 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -196,9 +196,9 @@ module Jekyll # # 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 406/810] 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 8d7c92f4..3b41076c 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -113,7 +113,7 @@ module Jekyll # 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 019cb095..78f7e041 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -106,7 +106,7 @@ module Jekyll # 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 407/810] 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 3b41076c..38ced675 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -283,7 +283,7 @@ module Jekyll "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 9b2cad9d..36760d65 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -194,7 +194,7 @@ module Jekyll 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 408/810] 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 9164d549..b38397fb 100644 --- a/features/step_definitions/jekyll_steps.rb +++ b/features/step_definitions/jekyll_steps.rb @@ -150,14 +150,14 @@ end 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 9550969b..9045eafb 100644 --- a/features/support/overview.rb +++ b/features/support/overview.rb @@ -25,6 +25,7 @@ module Features @indent = 0 @prefixes = options[:prefixes] || {} @delayed_messages = [] + @snippets_input = [] end def before_features(features) @@ -115,6 +116,10 @@ module Features @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 409/810] 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 32aae194..2815edf7 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -35,17 +35,49 @@ module Jekyll 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 410/810] 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 d4ad9951..502c4a73 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -76,7 +76,7 @@ module Jekyll # # 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 bb9284aa..20522350 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -115,7 +115,7 @@ module Jekyll # # 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 1d81e0f0..6b6e8f1c 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -62,7 +62,7 @@ module Jekyll 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 411/810] 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 5b3df093..6c4c9f8e 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -66,7 +66,6 @@ eos # 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 05f38429..933b4323 100644 --- a/lib/jekyll/utils/ansi.rb +++ b/lib/jekyll/utils/ansi.rb @@ -33,7 +33,7 @@ module Jekyll 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 abc1598c..d431021f 100644 --- a/lib/jekyll/utils/platforms.rb +++ b/lib/jekyll/utils/platforms.rb @@ -19,7 +19,6 @@ module Jekyll { :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 412/810] 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 cb91e071..42e152d9 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 413/810] 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 b38397fb..c9ae0567 100644 --- a/features/step_definitions/jekyll_steps.rb +++ b/features/step_definitions/jekyll_steps.rb @@ -150,14 +150,14 @@ end 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 414/810] 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 c61807f9..746f4bd1 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -210,8 +210,8 @@ module Jekyll 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 @@ module Jekyll # 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 @@ module Jekyll 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 78f7e041..1d29e354 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -116,8 +116,8 @@ module Jekyll # # 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 f9c1b88c..c17ba4b2 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -32,23 +32,23 @@ module Jekyll 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 @@ module Jekyll 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 415/810] 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 b561c00c..5252d562 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 416/810] 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 c194a5ba..af249996 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -62,7 +62,9 @@ module Jekyll # 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 417/810] 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 00000000..a06502c8 --- /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 418/810] 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 af249996..b4a07fc7 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -64,10 +64,12 @@ module Jekyll 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 419/810] 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 345bec1d..aa9f765f 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 420/810] 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 42e152d9..993ed5e9 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 421/810] 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 993ed5e9..b317e8d3 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 422/810] 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 b317e8d3..9e518526 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 423/810] 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 a2080868..59b827e2 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 424/810] 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 6b6e8f1c..b878d4d6 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -120,7 +120,9 @@ module Jekyll # # 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 00000000..595a9cd9 --- /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 32999aba..9a289dd3 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 bf7e8957..7d499f9b 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 425/810] 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 9e518526..715b8bc3 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 426/810] 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 173a58d3..96e15727 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 d213364b..2996d24b 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -17,12 +17,13 @@ module Jekyll # # 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 427/810] 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 96e15727..43364b99 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 428/810] 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 a06502c8..78998665 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 429/810] 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 715b8bc3..343dc08c 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 430/810] 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 343dc08c..454ddc78 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 431/810] 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 0229e073..0f8618a1 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -298,11 +298,11 @@ module Jekyll 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 38ced675..c3fff329 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 @@ module Jekyll @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 @@ module Jekyll @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 @@ module Jekyll 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 1d29e354..a3519f57 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -142,7 +142,7 @@ module Jekyll 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 c17ba4b2..e6a41aea 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -22,7 +22,11 @@ module Jekyll # # 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 b878d4d6..635b5d10 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 00000000..a17c79fe --- /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 00000000..823bb47f --- /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 6689e506..7c6f7bef 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -47,9 +47,7 @@ class TestDocument < JekyllUnitTest 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 @@ class TestDocument < JekyllUnitTest "permalink" => "/slides/test/:name" } }, + "permalink" => "pretty" }) @site.process @document = @site.collections["slides"].docs[0] @@ -245,7 +244,7 @@ class TestDocument < JekyllUnitTest }) @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 @@ class TestDocument < JekyllUnitTest 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 @@ class TestDocument < JekyllUnitTest 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 dc51252e..a2eb5bf0 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -257,7 +257,7 @@ class TestFilters < JekyllUnitTest 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 9a289dd3..39a8b3d9 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 16b9e060..904f5bd5 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -55,6 +55,15 @@ class TestPage < JekyllUnitTest 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 a638a349..970084cf 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -174,6 +174,7 @@ class TestSite < JekyllUnitTest 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 7d499f9b..49844038 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 432/810] 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 ea6a81b6..c7607171 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -186,9 +186,7 @@ module Jekyll # # 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 433/810] 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 b4a07fc7..a8342c14 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -15,8 +15,13 @@ module Jekyll 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 @@ module Jekyll # # 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 @@ module Jekyll 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 434/810] 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 950945a7..09975e3d 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -78,14 +78,14 @@ module Jekyll 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 435/810] 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 750c461b..b253e8bf 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 e09c4857..c065f9f7 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 bbb18087..ceae4749 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 436/810] 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 4fcc6af5..00000000 --- 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 437/810] 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 58980f41..560fbb3d 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 b253e8bf..c694a089 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( :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" 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' - end - - if ENV['PROOF'] - gem 'html-proofer', '~> 2.0' + gem "test-unit" end end -group :benchmark do - if ENV['BENCHMARK'] - gem 'ruby-prof' - gem 'rbtrace' - gem 'stackprof' - gem 'benchmark-ips' +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" 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 b1a21159483401567ebffcc25909a957d8d96596 Mon Sep 17 00:00:00 2001 From: Peter Suschlik Date: Wed, 6 Jan 2016 17:19:25 +0100 Subject: [PATCH 438/810] 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 454ddc78..ec921ff2 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 cf495216..bb4afe5a 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -17,7 +17,7 @@ module Jekyll 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 bb7b7ffa..aed906d7 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -37,7 +37,7 @@ module Jekyll # 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 6bf17766..1b1b707c 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 54c51ae1..ad4ea93c 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 c9a4644c..e19cdb2d 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 6a640401..a99932fb 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 2aff0b95..067fb6e7 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 d4fb5293..33b99fa5 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 439/810] 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 ec921ff2..dcfd3ab5 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 440/810] 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 c7607171..f0e3333d 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -186,7 +186,9 @@ module Jekyll # # 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 441/810] 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 f0c091f0..3720d043 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 442/810] 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 00000000..7af9d297 --- /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 36760d65..986bfdee 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -15,6 +15,17 @@ module Jekyll 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 dc51252e..63e52672 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -31,6 +31,11 @@ class TestFilters < JekyllUnitTest 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 443/810] 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 dcfd3ab5..a1ad1b89 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 444/810] 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 1b1b707c..a12b2e26 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 445/810] 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 f16bd202..47f60f3c 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 446/810] 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 a1ad1b89..7db11b3e 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 447/810] 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 7db11b3e..a1ad1b89 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 448/810] 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 a1ad1b89..5b9898be 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 449/810] 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 5b9898be..d5dad194 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 450/810] 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 d5dad194..5b9898be 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 451/810] 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 7af9d297..d1bc8103 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 63e52672..d2d281c3 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -31,9 +31,32 @@ class TestFilters < JekyllUnitTest 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 452/810] 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 5b9898be..5bdda7c6 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 453/810] 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 fd42b6b1..0ebd35f8 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 454/810] 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 5bdda7c6..03ba1bd5 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 455/810] 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 c3fff329..911cb4e6 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -89,7 +89,7 @@ module Jekyll # # 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 456/810] 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 03ba1bd5..738185c5 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 457/810] Use newer Rubies. --- .travis.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 560fbb3d..7afed906 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 458/810] 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 7afed906..957cd3e0 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 459/810] 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 957cd3e0..560fbb3d 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 460/810] 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 560fbb3d..58980f41 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 c694a089..b253e8bf 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 + + if ENV['PROOF'] + gem 'html-proofer', '~> 2.0' 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" - - 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 461/810] 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 27b8728d..9a8cac63 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 aa9f765f..31c2df3d 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 462/810] 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 9a8cac63..6e860b75 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 31c2df3d..1f0ffeb2 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 463/810] 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 58980f41..0fa982a1 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: jruby-9.0.3.0 - rvm: ruby-head - - rvm: jruby-9.0.3.0 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 464/810] Enable CodeClimate coverage. --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0fa982a1..7777656d 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 465/810] Add coverage badge. --- README.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/README.markdown b/README.markdown index d8c621d1..9ee529f3 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 466/810] 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 d2ff7901..00000000 --- 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 467/810] 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 b253e8bf..04bd73bd 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 281f6871..32363369 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 468/810] 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 738185c5..3259f842 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 469/810] 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 3259f842..5ed950ea 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 470/810] 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 57973a74..bf7c0f19 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 0207314c..e2a95168 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 - descendants + 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 + 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 fcd4bf77..465e154e 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -263,25 +263,21 @@ module Jekyll 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 471/810] 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 | 303 +++++++++++----------- features/support/env.rb | 155 ++++++----- 4 files changed, 252 insertions(+), 211 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7777656d..4bba7a8d 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 04bd73bd..2c0d7e8a 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 c9ae0567..64213ea4 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 -end +# -Given /^I have a blank site in "(.*)"$/ do |path| - FileUtils.mkdir_p(path) unless File.exist?(path) -end - -Given /^I do not have a "(.*)" directory$/ do |path| - File.directory?("#{TEST_DIR}/#{path}") -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 +Given %r{^I have a blank site in "(.*)"$} do |path| + if !File.exist?(path) + then FileUtils.mkdir_p(path) end end -Given /^I have an? "(.*)" file that contains "(.*)"$/ do |file, text| - File.open(file, 'w') do |f| - f.write(text) +# + +Given %r{^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| + File.write(file, Jekyll::Utils.strip_heredoc(<<-DATA)) + --- + #{key || 'layout'}: #{value || 'nil'} + --- + + #{text} + DATA +end + +# + +Given %r{^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| + 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 %r{^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) + then FileUtils.mkdir_p(dir) end 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 -end +# -Given /^I have an? "(.*)" file with content:$/ do |file, text| - File.open(file, 'w') do |f| - f.write(text) - 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 @@ Given /^I have a configuration file with "([^\"]*)" set to:$/ do |key, table| 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) +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 %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 run bundle(.*)$/ do |args| - status = 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 %r{^the (.*) directory should +exist$} do |dir| + expect(Pathname.new(dir)).to exist +end + # -################## -Then /^the (.*) directory should +exist$/ do |dir| - assert File.directory?(dir), "The directory \"#{dir}\" does not exist" +Then %r{^the (.*) directory should not exist$} do |dir| + expect(Pathname.new(dir)).not_to exist end -Then /^the (.*) directory should not exist$/ do |dir| - assert !File.directory?(dir), "The directory \"#{dir}\" exists" +# +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 "(.*)" in "(.*)"$/ do |text, file| - assert_match Regexp.new(text, Regexp::MULTILINE), file_contents(file) +# + +Then %r{^I should see exactly "(.*)" in "(.*)"$} do |text, file| + expect(file_contents(file).strip).to eq text end -Then /^I should see exactly "(.*)" in "(.*)"$/ do |text, file| - assert_equal text, file_contents(file).strip +# + +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 not see "(.*)" in "(.*)"$/ do |text, file| - refute_match Regexp.new(text, Regexp::MULTILINE), 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 /^I should see escaped "(.*)" in "(.*)"$/ do |text, file| - assert_match Regexp.new(Regexp.escape(text)), file_contents(file) +# + +Then %r{^the "(.*)" file should +exist$} do |file| + expect(Pathname.new(file)).to exist 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 not exist$} do |file| + expect(Pathname.new(file)).to_not exist end -Then /^the "(.*)" file should not exist$/ do |file| - assert !File.exist?(file), "The file \"#{file}\" exists" +# + +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 time in "(.*)"$/ do |file| - assert_match Regexp.new(seconds_agnostic_time(Time.now)), 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 today's date in "(.*)"$/ do |file| - assert_match Regexp.new(Date.today.to_s), file_contents(file) +# + +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 see "(.*)" in the build output$/ do |text| - assert_match Regexp.new(text), jekyll_run_output -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 76a3e707..62892612 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 MinitestWorld - extend Minitest::Assertions - attr_accessor :assertions - - def initialize - self.assertions = 0 - end +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 -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 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 + + 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 + +# 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 -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 472/810] 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 5ed950ea..6eb6233c 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 473/810] 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 00000000..826ffa76 --- /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 474/810] 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 6eb6233c..6ad35f61 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 475/810] 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 c4f93701..39aa437d 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 476/810] 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 b8b8bb72..24bcafa1 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 477/810] 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 6ad35f61..176c2d8d 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 478/810] 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 176c2d8d..2411714b 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 479/810] 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 2411714b..176c2d8d 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 480/810] 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 176c2d8d..7318a05f 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 481/810] 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 9045eafb..f399a3ce 100644 --- a/features/support/overview.rb +++ b/features/support/formatter.rb @@ -3,142 +3,176 @@ require 'colorator' 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 13508c84..0f0ef0f7 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 482/810] 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 7318a05f..ab1d5139 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 483/810] 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 5aa0449a..9ccf2706 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 484/810] 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 a99932fb..a12653f2 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 485/810] Update jekyll-feed. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 2c0d7e8a..0abe7065 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 486/810] Remove old Fixme note --- test/helper.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index 32363369..936638d2 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -35,9 +35,6 @@ require 'shoulda' 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 487/810] 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 ab1d5139..8fb5a685 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 488/810] 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 | 102 +++++++++++++++++++++++++++++--------------------- script/travis | 8 +++- 3 files changed, 69 insertions(+), 46 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4bba7a8d..fafd57c3 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 0abe7065..16470f69 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 "codeclimate-test-reporter" - gem 'minitest-reporters' - gem 'minitest-profile' - gem 'rspec-mocks' - gem 'minitest' - gem 'nokogiri' +# +group :test do + gem "cucumber" + gem "jekyll_test_plugin" + gem "jekyll_test_plugin_malicious" + gem "codeclimate-test-reporter" + 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 -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 :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 + +# + +group :site do + if ENV["PROOF"] + gem "html-proofer", "~> 2.0" + end end diff --git a/script/travis b/script/travis index 826ffa76..4d62fa9b 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 489/810] 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 16470f69..8e2d51ee 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 490/810] 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 8fb5a685..14e016a2 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 491/810] 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 a12b2e26..f4327d35 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 492/810] 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 14e016a2..e8185955 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 493/810] 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 746f4bd1..5406f13d 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -61,6 +61,10 @@ module Jekyll 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 @@ module Jekyll 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 00000000..6dabf63b --- /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 09c69737..840fa323 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 494/810] 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 5406f13d..23d338a3 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -61,7 +61,7 @@ module Jekyll 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 @@ module Jekyll # 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 495/810] 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 840fa323..0c5acf1a 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 496/810] 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 635b5d10..b6a05ff8 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 497/810] 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 a8342c14..b13db5ef 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -133,6 +133,7 @@ module Jekyll # # 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 498/810] 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 b13db5ef..35f0df26 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -127,6 +127,7 @@ module Jekyll 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 @@ module Jekyll 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 b6a05ff8..9ffff548 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -31,14 +31,12 @@ module Jekyll # # 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 @@ module Jekyll 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 49844038..d3720127 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 499/810] Add byebug for debugging purposes. --- .gitignore | 33 +++++++++++++++++---------------- Gemfile | 1 + 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 6441a147..1d62ecc3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,22 @@ -Gemfile.lock -test/dest *.gem -pkg/ *.swp *~ -_site/ -.bundle/ .DS_Store -bbin/ -gh-pages/ -site/_site/ -coverage -.ruby-version -.ruby-gemset -.sass-cache -tmp/* -.jekyll-metadata -/vendor -/test/source/file_name.txt .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/ +test/dest +tmp/* diff --git a/Gemfile b/Gemfile index 8e2d51ee..9e4796e6 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 500/810] 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 e4270187..6d42c067 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -47,7 +47,7 @@ module Jekyll 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 2996d24b..69b8d1eb 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -39,7 +39,7 @@ module Jekyll 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 c065f9f7..fc3f3484 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 21ba5764..d1668d2b 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 501/810] 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 21ba5764..5836d369 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 502/810] 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 e8185955..cd35e99a 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 503/810] 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 23d338a3..8edc4bfa 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -61,8 +61,8 @@ module Jekyll 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 @@ module Jekyll 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 504/810] 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 8edc4bfa..7f3702d3 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -56,16 +56,23 @@ module Jekyll 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 505/810] 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 7f3702d3..a8e1d0a4 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -42,6 +42,8 @@ module Jekyll # # 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 @@ module Jekyll 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 2b0dbc0c..36b2643d 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 0c5acf1a..524ecdf4 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 506/810] 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 cd35e99a..6eb36653 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 507/810] 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 2d2bf2c6..66eebc1c 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 b3b4abe80a8ed8731bf301f0f907968f4df7eda6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 16 Jan 2016 12:09:13 -0800 Subject: [PATCH 509/810] 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 e19cdb2d..03d83b35 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 510/810] 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 b414c90d..2ba5f25e 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 +### Useful Guides -- [Tips for working with GitHub Pages Integration](https://gist.github.com/2890453) +- [“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) - Code example reuse, and keeping documentation up to date. +### 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 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 - -- [Blogging with Git, Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) - -#### Other hacks - +- [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 511/810] 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 6eb36653..ba8e9a81 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 512/810] 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 fc3f3484..c065f9f7 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 513/810] 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 a8e1d0a4..383bb024 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -97,13 +97,7 @@ module Jekyll # 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 a3519f57..0a93aa08 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -7,6 +7,8 @@ module Jekyll 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 @@ module Jekyll 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 e6a41aea..5a788c81 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -38,7 +38,7 @@ module Jekyll 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 465e154e..15698b99 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -176,7 +176,8 @@ module Jekyll 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 514/810] 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 5a788c81..b4afa03c 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -25,10 +25,20 @@ module Jekyll @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 515/810] 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 64213ea4..d3695935 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -228,8 +228,13 @@ end # 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 62892612..83010b9e 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 516/810] 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 d3695935..7c9281f5 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -93,7 +93,13 @@ end # 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 517/810] 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 7c9281f5..71a92aea 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -246,5 +246,5 @@ end # 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 518/810] 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 74f2e409..5e1db21d 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 519/810] 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 1fcc7cce..888bd1c2 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 898115c2..031fa434 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 5d7982ec..5a7f49f3 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 d6f99fc7..0f2d0ada 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 a9a64ae2..31aee377 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 5252d562..48b2884e 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 83ae379f..c8ebf717 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 fb95e0c5..128f5800 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 c0eeb25d..3649a6d1 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 5e1db21d..ca0482fc 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 a36c6c82..be01a4a9 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 2792a829..3b4f3cf7 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 c66c527b..7344000c 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 01507cb0..5031ef06 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 379cea4f..5c495356 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 a7fadf34..e3c99a64 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 520/810] 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 71a92aea..151009a6 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -98,7 +98,7 @@ Given %r{^I have a configuration file with "(.*)" set to "(.*)"$} do |key, value 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 521/810] 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 0a93aa08..fde45651 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -166,5 +166,9 @@ module Jekyll 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 522/810] 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 b4afa03c..539c4de8 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -48,10 +48,18 @@ module Jekyll 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 @@ module Jekyll :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 523/810] 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 fde45651..3760410b 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -168,7 +168,7 @@ module Jekyll 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 524/810] 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 151009a6..a6790a15 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -105,10 +105,8 @@ end # 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 83010b9e..d65695ce 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -2,6 +2,7 @@ require "fileutils" 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 525/810] 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 0f2d0ada..e3802fe5 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 526/810] 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 911cb4e6..2911c4aa 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -59,7 +59,10 @@ module Jekyll 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 527/810] 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 936638d2..78b1f78b 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -42,6 +42,22 @@ Minitest::Reporters.use! [ ) ] +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 528/810] 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 30f9535f..bd2d1482 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 6c87d806..fb3d4734 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 904f5bd5..938f2fc8 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -69,7 +69,6 @@ class TestPage < JekyllUnitTest @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 529/810] 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 819dbf5c..43d99503 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 68e19a52..09c9b0a8 100644 --- a/test/test_coffeescript.rb +++ b/test/test_coffeescript.rb @@ -37,7 +37,7 @@ JS 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 39a8b3d9..400ec4d7 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 @@ OUTPUT 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 33bd1044..f0d2a389 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -24,9 +24,9 @@ class TestNewCommand < JekyllUnitTest 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 @@ class TestNewCommand < JekyllUnitTest 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 938f2fc8..2728b4e3 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -213,7 +213,7 @@ class TestPage < JekyllUnitTest do_render(page) page.write(dest_dir) - assert !File.exist?(unexpected) + refute_exist unexpected end end @@ -238,7 +238,7 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 c9dfb573..1ed21211 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 970084cf..e0883b49 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -275,25 +275,25 @@ class TestSite < JekyllUnitTest 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 530/810] 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 400ec4d7..301cd8f8 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 531/810] 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 539c4de8..c7b6042b 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -22,21 +22,7 @@ module Jekyll # # 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 @@ module Jekyll 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 532/810] 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 ba8e9a81..5bd8a10e 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 533/810] 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 3760410b..fde45651 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -168,7 +168,7 @@ module Jekyll 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 534/810] 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 d65695ce..b8334cfd 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 535/810] 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 a6790a15..2e47e369 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -167,72 +167,68 @@ end # -Then %r{^the (.*) directory should +exist$} do |dir| - expect(Pathname.new(dir)).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{^the (.*) directory should not exist$} do |dir| - expect(Pathname.new(dir)).not_to exist -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 + step %(I should see "#{Regexp.escape(text)}" in "#{file}") end # -Then %r{^the "(.*)" file should +exist$} do |file| - expect(Pathname.new(file)).to exist -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 @@ end # 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 536/810] 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 66eebc1c..394cef78 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 56a711f1eea837b37d57a5868e222f435240d540 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 19 Jan 2016 10:11:54 -0600 Subject: [PATCH 538/810] 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 fafd57c3..29b0a836 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 539/810] 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 9ee529f3..577e774c 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 540/810] 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 888bd1c2..90715b57 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 2911c4aa..d4db403c 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -8,7 +8,7 @@ module Jekyll 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 @@ module Jekyll }) 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 00000000..48d2dd58 --- /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 00000000..1d8ea1bb --- /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 541/810] 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 d4db403c..51d0514e 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -286,24 +286,21 @@ module Jekyll 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 @@ module Jekyll 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 9ffff548..6e0023de 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -10,8 +10,12 @@ module Jekyll 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 542/810] 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 7eb6559f..1c509f36 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 543/810] 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 1c509f36..f0b1a9b2 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 544/810] 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 d505e2fb..baa4e88a 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -33,7 +33,9 @@ module Jekyll 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 545/810] 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 067fb6e7..a711fd44 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 546/810] Re-add Gem version after accidental removal. --- README.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.markdown b/README.markdown index 577e774c..4401ed30 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 547/810] Move ByeBug to development and disallow for JRuby. --- Gemfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 9e4796e6..091a7564 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 548/810] Fix bad UNLESS. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 091a7564..4e4189d2 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 549/810] 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 5bd8a10e..729d80b9 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 550/810] 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 729d80b9..f3f6b1ba 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 551/810] 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 4e4189d2..f63529e8 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 552/810] 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 6e0023de..6dd2b117 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -10,6 +10,12 @@ module Jekyll 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 553/810] 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 3b4f3cf7..3692c382 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 2911c4aa..8e0d3e86 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -50,7 +50,7 @@ module Jekyll # 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 @@ module Jekyll 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 @@ module Jekyll 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 @@ module Jekyll 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 @@ module Jekyll 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 15698b99..72d42ad9 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -225,7 +225,7 @@ module Jekyll # 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 554/810] 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 f3f6b1ba..6bab0a71 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 a12653f2..7d1ff85d 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 00000000..88f8888f --- /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 555/810] 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 3692c382..79b92c26 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 35f0df26..9e3ac329 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -46,7 +46,7 @@ module Jekyll 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 556/810] 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 fde45651..eda87f12 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -63,8 +63,7 @@ module Jekyll # # 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 2728b4e3..69794107 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -8,7 +8,9 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 557/810] 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 a711fd44..5f1ba786 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 558/810] 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 9e3ac329..d1bffcc5 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -46,7 +46,7 @@ module Jekyll 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 559/810] 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 6bab0a71..909dccd5 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 560/810] 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 909dccd5..f5b43d32 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 561/810] 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 888bd1c2..90715b57 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 8e0d3e86..b8c162a5 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -8,7 +8,7 @@ module Jekyll 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 @@ module Jekyll 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 00000000..48d2dd58 --- /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 00000000..1d8ea1bb --- /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 562/810] 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 b8c162a5..c6f3cb87 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -289,26 +289,23 @@ module Jekyll 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 @@ module Jekyll 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 9ffff548..6e0023de 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -10,8 +10,12 @@ module Jekyll 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 563/810] 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 6e0023de..6dd2b117 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -10,6 +10,12 @@ module Jekyll 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 564/810] 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 2e47e369..f609076d 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -125,6 +125,7 @@ end 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 565/810] 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 90715b57..ad17a896 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 566/810] 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 c6f3cb87..2840ba51 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -290,18 +290,19 @@ module Jekyll 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 567/810] 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 94def29b..2840ba51 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -443,11 +443,7 @@ module Jekyll 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 568/810] 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 f5b43d32..12834ca6 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 569/810] 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 12834ca6..7f1c612d 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 570/810] 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 394cef78..ee1f0d38 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 571/810] 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 5f1ba786..4bcdd545 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 572/810] 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 7f1c612d..749b0322 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 573/810] 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 29b0a836..5c6e5855 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 574/810] 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 7f1c612d..d03724b4 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 ee1f0d38..b20df484 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 7d1ff85d..b05b18b0 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 00000000..4acec55c --- /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 cb2b00e4..fd2a0186 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -3.0.1 +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 576/810] 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 b05b18b0..e93521e7 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 4acec55c..42768b9f 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 577/810] 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 03d83b35..add661c3 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 578/810] 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 c7b6042b..09815a60 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -168,7 +168,7 @@ module Jekyll 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 00000000..71b9b2e4 --- /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 be3a9320..138bed6b 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 7c6f7bef..1197c4da 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -207,6 +207,10 @@ class TestDocument < JekyllUnitTest 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 @@ class TestDocument < JekyllUnitTest @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 @@ class TestDocument < JekyllUnitTest 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 @@ class TestDocument < JekyllUnitTest 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 579/810] 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 28c16468..15cda096 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 580/810] 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 65c05c57..a0f06de7 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 581/810] 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 15cda096..304bd7c8 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 582/810] 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 eda87f12..6bdfb6bc 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -55,7 +55,9 @@ module Jekyll # # 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 583/810] 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 383bb024..f58796f0 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -28,12 +28,6 @@ module Jekyll !(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 @@ module Jekyll 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 2840ba51..fc3633d8 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -237,16 +237,6 @@ module Jekyll 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 @@ module Jekyll 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 6dd2b117..e5d45c6d 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -273,5 +273,15 @@ module Jekyll 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 d3720127..a2335391 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 584/810] 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 cb849f42..76f0312b 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 00000000..aecfc039 --- /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 585/810] 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 6bdfb6bc..6c402ee3 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -9,6 +9,8 @@ module Jekyll alias_method :extname, :ext + FORWARD_SLASH = '/'.freeze + # Attributes for Liquid templates ATTRIBUTES_FOR_LIQUID = %w( content @@ -55,9 +57,12 @@ module Jekyll # # 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 586/810] 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 69794107..8930095d 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -150,6 +150,12 @@ class TestPage < JekyllUnitTest 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 @@ class TestPage < JekyllUnitTest 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 587/810] 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 304bd7c8..8e1844b2 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 588/810] 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 e0883b49..c06c218e 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -465,6 +465,14 @@ class TestSite < JekyllUnitTest @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 589/810] 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 d8ad5511..8f5ffe8a 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 590/810] 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 66023147..10f094bd 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 591/810] 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 f4327d35..4e78ab7a 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 592/810] 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 8e1844b2..28d061de 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 593/810] 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 e93521e7..ab87f569 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 e3529f63..d3ff4a38 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 594/810] 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 28d061de..e2558271 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 595/810] 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 e2558271..ecbd1794 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 b20df484..925e0b44 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 eb5b263b..2a6f8186 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 dcd9ac2c..7cb85198 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 00000000..d25c32c9 --- /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 ab87f569..7943203b 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 00000000..cddabd22 --- /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 596/810] 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 d25c32c9..8b9ac2c5 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 fd2a0186..94ff29cc 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 597/810] 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 8b9ac2c5..d25c32c9 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 932d6641bcd0ce2ca61f5c186d9e7e8c02234eba Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 29 Jan 2016 16:00:04 -0800 Subject: [PATCH 599/810] 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 cddabd22..18c693cf 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 600/810] 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 601/810] 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 4bcdd545..050cec0f 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 602/810] 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 05b94337..d9c9c222 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -12,7 +12,7 @@ module Jekyll "line_number_start" => 1, "tab_width" => 4, "wrap" => "div" - } + }.freeze def initialize(config) Jekyll::External.require_with_graceful_fail "kramdown" @@ -32,22 +32,44 @@ module Jekyll @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 @@ module Jekyll 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 @@ module Jekyll 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 603/810] 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 8f5ffe8a..8a63cb33 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 604/810] 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 ecbd1794..d928f530 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 605/810] 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 d928f530..e0b87a5f 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 606/810] 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 4401ed30..50ec363e 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 607/810] 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 2a6f8186..08ad12b3 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 608/810] 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 0d27a458..e7cf9db4 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 18c693cf..b5932b0a 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 609/810] Include .rubocop.yml in Gem --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 470781c7..167e424c 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 610/810] 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 e0b87a5f..8564082f 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 611/810] 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 8564082f..4f5005a5 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 612/810] 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 d9c9c222..93605cdd 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -16,7 +16,7 @@ module Jekyll 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 613/810] 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 4f5005a5..cd9c3c3d 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 614/810] 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 f91a5a2c..7dcca1b6 100644 --- a/lib/jekyll/liquid_renderer/file.rb +++ b/lib/jekyll/liquid_renderer/file.rb @@ -8,7 +8,7 @@ module Jekyll 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 615/810] 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 cd9c3c3d..6f0ea19e 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 616/810] 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 d3ff4a38..dbbda9a9 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 617/810] 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 6f0ea19e..665982a8 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 618/810] 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 eb6a0892..f571aea8 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 619/810] 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 dbbda9a9..9b9cedc4 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 620/810] [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 dbbda9a9..86cd910c 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 621/810] 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 050cec0f..e7823465 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 622/810] 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 c8fff908..01da5016 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 623/810] 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 665982a8..40ba3406 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 624/810] 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 050cec0f..5e34b488 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 625/810] 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 40ba3406..850be8de 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 626/810] 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 4a2c638f..8a29ae08 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 627/810] 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 850be8de..ca9cc4c2 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 628/810] 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 5ce0846c..ba159599 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 629/810] 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 ca9cc4c2..122901cf 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 630/810] 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 8a29ae08..d4b105c9 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 631/810] 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 d4b105c9..058152fc 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 632/810] 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 058152fc..33d9c364 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 633/810] 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 33d9c364..330228de 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 634/810] 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 6d42c067..48509f9d 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 c0ce59b3..546f0252 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 635/810] 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 8b92a045..6896bb0b 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -153,8 +153,9 @@ module Jekyll 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 b04a2bad..148103ea 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 636/810] 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 6896bb0b..8b92a045 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -153,9 +153,8 @@ module Jekyll 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 148103ea..b04a2bad 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 637/810] 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 8b92a045..6896bb0b 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -153,8 +153,9 @@ module Jekyll 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 b04a2bad..148103ea 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 638/810] 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 ad4ea93c..7e77ce16 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 639/810] 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 122901cf..6ffe198d 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 640/810] 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 6ffe198d..9dc835f8 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 641/810] 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 9dc835f8..170d6dab 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 642/810] 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 f63529e8..cd21a668 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 c065f9f7..241c5b01 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 643/810] 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 170d6dab..adbfb765 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 7943203b..6514e2c4 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 00000000..f648cb28 --- /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 644/810] 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 f648cb28..a3dd93c9 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 645/810] 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 a3dd93c9..0c260cc6 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 646/810] 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 4e78ab7a..7a602b19 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 647/810] 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 d4ea3c88..21449400 100644 --- a/lib/jekyll/deprecator.rb +++ b/lib/jekyll/deprecator.rb @@ -22,7 +22,7 @@ module Jekyll 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 648/810] 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 adbfb765..36dc54b6 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 649/810] 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 7a602b19..57044184 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 59b827e2..32f7f9b8 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 47f60f3c..1b3e322b 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 5a1a0a56..ddb08926 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 650/810] require at least cucumber version 2.1.0 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index cd21a668..520616be 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 651/810] 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 4695f487..7249a8e8 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 652/810] 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 36dc54b6..9719fd2b 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 653/810] 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 9719fd2b..b4ee67cb 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 654/810] 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 b4ee67cb..fdea67ad 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 655/810] 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 f571aea8..d4ba3ade 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 656/810] 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 7249a8e8..3236c03b 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 657/810] 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 e5d45c6d..5d0dda2e 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -20,7 +20,7 @@ module Jekyll 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 a2335391..eab0ca1e 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 658/810] 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 fdea67ad..1e50da10 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 659/810] 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 1e50da10..d2dc51a5 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 660/810] 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 d2dc51a5..1341cbd3 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 661/810] 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 50ec363e..0e37c531 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 afa54b8f..4fd85b48 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 6514e2c4..c7086d00 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 09bab737..48935106 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 662/810] 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 a8bda742..faa87cb3 100644 --- a/site/index.html +++ b/site/index.html @@ -30,7 +30,7 @@ overview: true

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

    - Migrate your blog → + Migrate your blog →
    @@ -79,7 +79,7 @@ overview: true 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 663/810] 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 00000000..6042d0d0 --- /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 00000000..67760510 --- /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 664/810] 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 00000000..37235ea3 --- /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 665/810] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 37235ea3..3a30fdbf 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 666/810] 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 3a30fdbf..614de1c9 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 667/810] 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 29408fe2..69ea8ba7 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -10,6 +10,8 @@ module Jekyll "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 @@ module Jekyll ) } + 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 0f8618a1..cf499aa2 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -44,6 +44,7 @@ module Jekyll '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 87472c3d..9fd3c1db 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -68,6 +68,11 @@ class TestCommandsServe < JekyllUnitTest ] 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 7897a1842cd97fa9e602b256129a8862a2737693 Mon Sep 17 00:00:00 2001 From: Michael Lyons Date: Fri, 19 Feb 2016 11:27:46 -0800 Subject: [PATCH 668/810] 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 faa87cb3..cda453f1 100644 --- a/site/index.html +++ b/site/index.html @@ -79,7 +79,7 @@ overview: true 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 669/810] 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 ad17a896..ac67611e 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 f0e3333d..11a4f06f 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -78,7 +78,7 @@ module Jekyll 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 00000000..7622ac9a --- /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 138bed6b..1ae8696c 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 1197c4da..d3fac02f 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -12,7 +12,7 @@ class TestDocument < JekyllUnitTest "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 @@ class TestDocument < JekyllUnitTest 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 670/810] 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 fc3633d8..10f1203e 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -217,8 +217,11 @@ module Jekyll 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 00000000..c366b0df --- /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 00000000..84e2982b --- /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 138bed6b..d6d7d7de 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 ca7cd49d..e9035b96 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -285,7 +285,7 @@ class TestFilters < JekyllUnitTest 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 c06c218e..3bb93c35 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -178,6 +178,7 @@ class TestSite < JekyllUnitTest 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 671/810] 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 1341cbd3..6990ded9 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 672/810] Release :gem: v3.1.2 --- History.markdown | 32 +++++++-------- 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, 79 insertions(+), 18 deletions(-) create mode 100644 site/_posts/2016-02-19-jekyll-3-1-2-released.markdown diff --git a/History.markdown b/History.markdown index 6990ded9..14e8e235 100644 --- a/History.markdown +++ b/History.markdown @@ -1,28 +1,28 @@ -## HEAD - -### Development Fixes - - * require at least cucumber version 2.1.0 (#4514) - -### Bug Fixes - - * 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) +## 3.1.2 / 2016-02-19 ### Minor Enhancements - * Include .rubocop.yml in Gem (#4437) - * LiquidRenderer#parse: parse with line numbers. (#4452) - * add consistency to the deprecation message (#4505) + * 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 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) + * Permalinks which end in a slash should always output HTML (#4546) + +### Development Fixes + + * 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 925e0b44..ba9ee238 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 c7086d00..b98ea83e 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 00000000..77544510 --- /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 94ff29cc..ef538c28 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 673/810] 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 00000000..70c3dadc --- /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 00000000..851fabc2 --- /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 00000000..0d103d52 --- /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 00000000..02c373cc --- /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 00000000..76ed922d --- /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 674/810] 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 0d103d52..a86fd4f8 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 675/810] 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 520616be..1aa5c5e4 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 0a7975a3..00000000 --- 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 676/810] 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 02c373cc..9751ff52 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 76ed922d..df8a9b02 100644 --- a/jekyll-docs/lib/jekyll-docs.rb +++ b/jekyll-docs/lib/jekyll-docs.rb @@ -20,13 +20,15 @@ module JekyllDocs 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 677/810] 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 9751ff52..fcb4ed62 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 678/810] 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 a86fd4f8..770446b7 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 fcb4ed62..11699172 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 df8a9b02..8e62f3de 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 679/810] 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 70c3dadc..00000000 --- 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 851fabc2..00000000 --- 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 770446b7..00000000 --- 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 11699172..00000000 --- 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 8e62f3de..00000000 --- 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 680/810] Look for local docs if the dir exists. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 1aa5c5e4..bad462bc 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 7bffb3924417b34669a7cf3c34736027c398db1e Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Sat, 20 Feb 2016 12:54:28 -0500 Subject: [PATCH 682/810] 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 bad462bc..d78513f5 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 241c5b01..fe02703a 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 aaf05217..3ded9925 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 2d12d1bd..155ffbca 100644 --- a/site/_includes/top.html +++ b/site/_includes/top.html @@ -2,7 +2,6 @@ - {{ page.title }} {% feed_meta %} @@ -10,6 +9,7 @@ + {% seo %}