diff --git a/.codeclimate.yml b/.codeclimate.yml index cd70c7de..b3d26d65 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -23,7 +23,7 @@ exclude_paths: - features/**/* - script/**/* - - site/**/* + - docs/**/* - spec/**/* - test/**/* - vendor/**/* diff --git a/.rubocop.yml b/.rubocop.yml index 0324c412..4193f4b4 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -22,6 +22,8 @@ Metrics/BlockLength: Exclude: - test/**/*.rb - lib/jekyll/configuration.rb + - rake/*.rake + - jekyll.gemspec Metrics/ClassLength: Exclude: - !ruby/regexp /features\/.*.rb$/ @@ -32,6 +34,8 @@ Metrics/CyclomaticComplexity: Metrics/LineLength: Exclude: - !ruby/regexp /features\/.*.rb/ + - Rakefile + - rake/*.rake Max: 90 Severity: warning Metrics/MethodLength: @@ -44,6 +48,14 @@ Metrics/ParameterLists: Max: 4 Metrics/PerceivedComplexity: Max: 8 +Security/MarshalLoad: + Exclude: + - !ruby/regexp /test\/.*.rb$/ + - lib/jekyll/regenerator.rb +Security/YAMLLoad: + Exclude: + - !ruby/regexp /features\/.*.rb/ + - !ruby/regexp /test\/.*.rb$/ Style/Alias: Enabled: false Style/AlignArray: @@ -127,5 +139,7 @@ Style/StringLiterals: EnforcedStyle: double_quotes Style/StringLiteralsInInterpolation: EnforcedStyle: double_quotes +Style/TrailingCommaInLiteral: + EnforcedStyleForMultiline: consistent_comma Style/UnneededCapitalW: Enabled: false diff --git a/.travis.yml b/.travis.yml index a06a82c4..3543e9aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,10 +6,10 @@ sudo: false rvm: - &ruby1 2.4.0 - - &ruby2 2.3.1 - - &ruby3 2.2.5 - - &ruby4 2.1.9 - - &jruby jruby-9.1.2.0 + - &ruby1 2.3.3 + - &ruby2 2.2.6 + - &ruby3 2.1.9 + - &jruby jruby-9.1.7.0 matrix: include: @@ -46,3 +46,6 @@ addons: DA4vsRURfABU0fIhwYkQuZqEcA3d8TL36BZcGEshG6MQ2AmnYsmFiTcxqV5bmlElHEqQuT\ 5SUFXLafgZPBnL0qDwujQcHukID41sE=\ " +# regular test configuration +after_success: + - bundle exec codeclimate-test-reporter diff --git a/Gemfile b/Gemfile index 867c61db..b13bb908 100644 --- a/Gemfile +++ b/Gemfile @@ -25,14 +25,14 @@ end # group :test do - gem "codeclimate-test-reporter", "~> 0.6.0" + gem "codeclimate-test-reporter", "~> 1.0.5" gem "cucumber", "~> 2.1" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" gem "nokogiri" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.44.1" + gem "rubocop", "~> 0.47" gem "test-theme", :path => File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) gem "jruby-openssl" if RUBY_ENGINE == "jruby" @@ -76,11 +76,11 @@ group :jekyll_optional_dependencies do gem "jekyll-redirect-from" gem "kramdown", "~> 1.9" gem "mime-types", "~> 3.0" - gem "rdoc", "~> 4.2" + gem "rdoc", "~> 5.0" gem "toml", "~> 0.1.0" platform :ruby, :mswin, :mingw, :x64_mingw do - gem "classifier-reborn", "~> 2.0" + gem "classifier-reborn", "~> 2.1.0" gem "liquid-c", "~> 3.0" gem "rdiscount", "~> 2.0" gem "redcarpet", "~> 3.2", ">= 3.2.3" @@ -94,12 +94,12 @@ end group :site do if ENV["PROOF"] - gem "html-proofer", "~> 2.0" + gem "html-proofer", "~> 3.4" end gem "jekyll-avatar" gem "jekyll-mentions" gem "jekyll-seo-tag" gem "jekyll-sitemap" - gem "jemoji", "0.5.1" + gem "jemoji" end diff --git a/History.markdown b/History.markdown index 3bd4af8e..2958d74e 100644 --- a/History.markdown +++ b/History.markdown @@ -1,29 +1,46 @@ ## HEAD +### Minor Enhancements + + * Upgrade to Liquid v4 (#4362) + +### Documentation + + * Install troubleshooting on Ubuntu (#5817) + +## 3.4.0 / 2016-01-27 + +### Minor Enhancements + + * Add connector param to `array_to_sentence_string` filter (#5597) + * Adds `group_by_exp` filter (#5513) + * Use Addressable instead of URI to decode (#5726) + * throw IncludeTagError if error occurs in included file (#5767) + * Write Jekyll::Utils::Exec.run for running shell commands. (#5640) + * Use the current year for the LICENSE of theme (#5712) + * Update License (#5713) + +### Bug Fixes + + * Escaped regular expressions when using `post_url`. (#5605) + * fix date parsing in file names to be stricter (#5609) + * Add a module to re-define `ENV["TZ"]` in Windows (#5612) + * Use each instead of map to actually return nothing (#5668) + * include: fix 'no implicit conversion of nil to String' (#5750) + * Don't include the theme's includes_path if it is nil. (#5780) + * test double slash when input = '/' (#5542) + * use logger.info for related posts (#5822) + ### Site Enhancements - * Remove instructions to install Jekyll 2 on Windows (#5582) - * Fix example URL inconsistency (#5592) - * Replace backticks within HTML blocks with HTML tags (#5435) - * Add jekyll-migrate-permalink (#5600) - * Fix bad config YAML in collections example (#5587) - * Bring documentation on 'Directory Structure' up-to-date (#5573) * Use only the used Font Awesome icons. (#5530) * Switch to `https` when possible. (#5611) * Update `_font-awesome.scss` to move .woff file before .ttf (#5614) * Update documentation on updating FontAwesome Iconset (#5655) - -### Minor Enhancements - - * Add connector param to array_to_sentence_string filter (#5597) - * Adds group_by_exp filter (#5513) - -### Bug Fixes - - * Escaped regular expressions when using post_url. (#5605) - * fix date parsing in file names to be stricter (#5609) - * Add a module to re-define `ENV["TZ"]` in Windows (#5612) - * Use each instead of map to actually return nothing (#5668) + * [site] Use defaults for docs and news-items (#5744) + * Sort gems in `docs/_config.yml` (#5746) + * Add missing class (#5791) + * Improve template docs (#5694) ### Development Fixes @@ -33,15 +50,65 @@ * Rubocop -a on lib/jekyll (#5666) * Bump to rake 12.0 (#5670) * Rubocop Gemfile (#5671) + * update Classifier-Reborn to 2.1.0 (#5711) + * Rubocop: fix Rakefile and gemspec (#5745) + * Use `assert_nil` (#5725) + * Sort gems in `jekyll.gemspec` (#5746) + * Rubocop: Require consistent comma in multiline literals (#5761) + * Bump rubocop (#5765) + * New rubocop security checks (#5768) + * test/helper: fix flaky plugin path test by removing calls to Dir.chdir without a block (#5779) + * Use latest jemoji gem (#5782) + * Bump htmlproofer (#5781) + * Bump rubies we test against (#5784) + * Bump rdoc to v5.0 (#5797) + * Bump codeclimate-test-reporter to v1.0.5 (#5798) ### Documentation + * Improve quickstart docs (#5689) + * Add Jekyll-Post to list of plugins (#5705) + * Add jekyll-numbered-headings (#5688) + * Docs: move permalinks from documents into config (#5544) + * Improve collections docs (#5691) + * Fix #5730: add gcc and make to the list of requirements (#5731) + * Remove instructions to install Jekyll 2 on Windows (#5582) + * Fix example URL inconsistency (#5592) + * Replace backticks within HTML blocks with HTML tags (#5435) + * Add jekyll-migrate-permalink (#5600) + * Fix bad config YAML in collections example (#5587) + * Bring documentation on 'Directory Structure' up-to-date (#5573) * Fixed typo (#5632) * use backticks for Gemfile for consistency since in the next sentence … (#5641) * Update Core team list in the README file (#5643) * Improve Permalinks documentation. (#5653) * Fix typo in Variables doc page (#5657) * Fix a couple of typos in the docs (#5658) + * Update windows.md (#5683) + * Improve permalinks docs (#5693) + * Document --unpublished build option (#5720) + * Improve pages docs (#5692) + * Added new includes.md topic to docs (#5696) + * Replace a dead link with a web-archived one (#5738) + * Remove duplicate paragraph. (#5740) + * Addition of a sample "typical post" (#5473) + * Fix a minor grammatical mistake on themes' document ### -dev (#5748) + * Correct comments in data_reader.rb (#5621) + * Add jekyll-pre-commit to plugins list (#5752) + * Update quickstart.md (#5758) + * Correct minor typo (#5764) + * Fix a markdown link to look properly on the web (#5769) + * [docs] Info about the help command usage (#5312) + * Add missing merge labels for jekyllbot (#5753) + * Fix broken links in documentation (#5736) + * Docs: add `match_regex` and `replace_regex` filters (#5799) + * Got that diaper money? (#5810) + * Sort content by popularity using Google Analytics (#5812) + * Rework CI doc to include multiple providers. (#5815) + * Improve theme docs (#5690) + * Add mention of classifier-reborn for LSI (#5811) + * Added note about --blank flag (#5802) + * Fixed inaccuracy in "Built-in permalink styles" docs (#5819) ## 3.3.1 / 2016-11-14 diff --git a/LICENSE b/LICENSE index 94dbfc39..e177b1bf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2008-2016 Tom Preston-Werner +Copyright (c) 2008-2017 Tom Preston-Werner and Jekyll contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Rakefile b/Rakefile index 58aecfaf..ab934e27 100644 --- a/Rakefile +++ b/Rakefile @@ -1,13 +1,13 @@ -require 'rubygems' -require 'rake' -require 'rdoc' -require 'date' -require 'yaml' +require "rubygems" +require "rake" +require "rdoc" +require "date" +require "yaml" -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib])) -require 'jekyll/version' +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib")) +require "jekyll/version" -Dir.glob('rake/**.rake').each { |f| import f } +Dir.glob("rake/**.rake").each { |f| import f } ############################################################################# # @@ -36,21 +36,21 @@ def gemspec_file end def gem_file - "#{name}-#{Gem::Version.new(version).to_s}.gem" + "#{name}-#{Gem::Version.new(version)}.gem" end def normalize_bullets(markdown) - markdown.gsub(/\n\s{2}\*{1}/, "\n-") + markdown.gsub(%r!\n\s{2}\*{1}!, "\n-") end def linkify_prs(markdown) - markdown.gsub(/#(\d+)/) do |word| + markdown.gsub(%r!#(\d+)!) do |word| "[#{word}]({{ site.repository }}/issues/#{word.delete("#")})" end end def linkify_users(markdown) - markdown.gsub(/(@\w+)/) do |username| + markdown.gsub(%r!(@\w+)!) do |username| "[#{username}](https://github.com/#{username.delete("@")})" end end @@ -60,13 +60,13 @@ def linkify(markdown) end def liquid_escape(markdown) - markdown.gsub(/(`{[{%].+[}%]}`)/, "{% raw %}\\1{% endraw %}") + markdown.gsub(%r!(`{[{%].+[}%]}`)!, "{% raw %}\\1{% endraw %}") end def custom_release_header_anchors(markdown) - header_regexp = /^(\d{1,2})\.(\d{1,2})\.(\d{1,2}) \/ \d{4}-\d{2}-\d{2}/ - section_regexp = /^### \w+ \w+$/ - markdown.split(/^##\s/).map do |release_notes| + header_regexp = %r!^(\d{1,2})\.(\d{1,2})\.(\d{1,2}) \/ \d{4}-\d{2}-\d{2}! + section_regexp = %r!^### \w+ \w+$! + markdown.split(%r!^##\s!).map do |release_notes| _, major, minor, patch = *release_notes.match(header_regexp) release_notes .gsub(header_regexp, "\\0\n{: #v\\1-\\2-\\3}") @@ -75,11 +75,11 @@ def custom_release_header_anchors(markdown) end def sluffigy(header) - header.gsub(/#/, '').strip.downcase.gsub(/\s+/, '-') + header.delete("#").strip.downcase.gsub(%r!\s+!, "-") end def remove_head_from_history(markdown) - index = markdown =~ /^##\s+\d+\.\d+\.\d+/ + index = markdown =~ %r!^##\s+\d+\.\d+\.\d+! markdown[index..-1] end @@ -88,20 +88,23 @@ def converted_history(markdown) custom_release_header_anchors( liquid_escape( linkify( - normalize_bullets(markdown))))) + normalize_bullets(markdown) + ) + ) + ) + ) end def siteify_file(file, overrides_front_matter = {}) - abort "You seem to have misplaced your #{file} file. I can haz?" unless File.exists?(file) + abort "You seem to have misplaced your #{file} file. I can haz?" unless File.exist?(file) title = begin - File.read(file).match(/\A# (.*)$/)[1] + File.read(file).match(%r!\A# (.*)$!)[1] rescue File.basename(file, ".*").downcase.capitalize end slug = File.basename(file, ".markdown").downcase front_matter = { "title" => title, - "layout" => "docs", "permalink" => "/docs/#{slug}/", "note" => "This file is autogenerated. Edit /#{file} instead." }.merge(overrides_front_matter) @@ -115,7 +118,7 @@ def content_for(file) when "History.markdown" converted_history(contents) else - contents.gsub(/\A# .*\n\n?/, "") + contents.gsub(%r!\A# .*\n\n?!, "") end end @@ -128,23 +131,23 @@ end multitask :default => [:test, :features] task :spec => :test -require 'rake/testtask' +require "rake/testtask" Rake::TestTask.new(:test) do |test| - test.libs << 'lib' << 'test' - test.pattern = 'test/**/test_*.rb' + test.libs << "lib" << "test" + test.pattern = "test/**/test_*.rb" test.verbose = true end -require 'rdoc/task' +require "rdoc/task" Rake::RDocTask.new do |rdoc| - rdoc.rdoc_dir = 'rdoc' + rdoc.rdoc_dir = "rdoc" rdoc.title = "#{name} #{version}" - rdoc.rdoc_files.include('README*') - rdoc.rdoc_files.include('lib/**/*.rb') + rdoc.rdoc_files.include("README*") + rdoc.rdoc_files.include("lib/**/*.rb") end begin - require 'cucumber/rake/task' + require "cucumber/rake/task" Cucumber::Rake::Task.new(:features) do |t| t.profile = "travis" end @@ -152,9 +155,9 @@ begin t.profile = "html_report" end rescue LoadError - desc 'Cucumber rake task not available' + desc "Cucumber rake task not available" task :features do - abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin' + abort "Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin" end end diff --git a/docs/_config.yml b/docs/_config.yml index 6f57710a..475fcdce 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -10,8 +10,24 @@ help_url: https://github.com/jekyll/jekyll-help timezone: America/Los_Angeles +defaults: + - + scope: + path: "_docs" + type: "docs" + values: + layout: "docs" + - + scope: + path: "_posts" + type: "posts" + values: + layout: "news_item" + + collections: docs: + permalink: /:collection/:path/ output: true posts: permalink: /news/:year/:month/:day/:title/ @@ -27,14 +43,14 @@ twitter: logo: /img/logo-2x.png gems: - - jekyll-feed - - jekyll-redirect-from - - jemoji - - jekyll-sitemap - - jekyll-seo-tag - jekyll-avatar + - jekyll-feed - jekyll-mentions + - jekyll-redirect-from + - jekyll-seo-tag + - jekyll-sitemap + - jemoji exclude: - - README.md - .gitignore + - README.md diff --git a/docs/_data/docs.yml b/docs/_data/docs.yml index 4ff28ba2..bb9d3b14 100644 --- a/docs/_data/docs.yml +++ b/docs/_data/docs.yml @@ -23,6 +23,7 @@ - title: Customization docs: - templates + - includes - permalinks - pagination - plugins diff --git a/docs/_docs/assets.md b/docs/_docs/assets.md index 4908a400..7418f984 100644 --- a/docs/_docs/assets.md +++ b/docs/_docs/assets.md @@ -1,5 +1,4 @@ --- -layout: docs title: Assets permalink: /docs/assets/ --- diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 22a86e60..c64abd23 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -1,5 +1,4 @@ --- -layout: docs title: Collections permalink: /docs/collections/ --- @@ -12,7 +11,13 @@ namespace. ## Using Collections -### Step 1: Tell Jekyll to read in your collection +To start using collections, follow these 3 steps: + +* [Step 1: Tell Jekyll to read in your collection](#step1) +* [Step 2: Add your content](#step2) +* [Step 3: Optionally render your collection's documents into independent files](#step3) + +### Step 1: Tell Jekyll to read in your collection {#step1} Add the following to your site's `_config.yml` file, replacing `my_collection` with the name of your collection: @@ -41,12 +46,12 @@ defaults: layout: page ``` -### Step 2: Add your content +### Step 2: Add your content {#step2} Create a corresponding folder (e.g. `/_my_collection`) and add -documents. YAML Front Matter is read in as data if it exists, and everything -after it is stuck in the Document's `content` attribute. If no YAML Front -Matter is provided, Jekyll will not generate the file in your collection. +documents. YAML front matter is processed if the front matter exists, and everything +after the front matter is pushed into the document's `content` attribute. If no YAML front +matter is provided, Jekyll will not generate the file in your collection.
Be sure to name your directories correctly
@@ -56,7 +61,7 @@ your _config.yml file, with the addition of the preceding _
-### Step 3: Optionally render your collection's documents into independent files +### Step 3: Optionally render your collection's documents into independent files {#step3} If you'd like Jekyll to create a public-facing, rendered version of each document in your collection, set the `output` key to `true` in your collection @@ -73,19 +78,6 @@ For example, if you have `_my_collection/some_subdir/some_doc.md`, it will be rendered using Liquid and the Markdown converter of your choice and written out to `/my_collection/some_subdir/some_doc.html`. -As for posts with [Permalinks](../permalinks/), the document -URL can be customized by setting `permalink` metadata for the collection: - -```yaml -collections: - my_collection: - output: true - permalink: /awesome/:path/ -``` - -For example, if you have `_my_collection/some_subdir/some_doc.md`, it will be -written out to `/awesome/some_subdir/some_doc/index.html`. -
Don't forget to add YAML for processing

@@ -95,6 +87,21 @@ written out to `/awesome/some_subdir/some_doc/index.html`.

+## Configuring permalinks for collections {#permalinks} + +You can customize the [Permalinks](../permalinks/) for your collection's documents by setting `permalink` property in the collection's configuration as follows: + +```yaml +collections: + my_collection: + output: true + permalink: /awesome/:path/:title.:output_ext +``` + +In this example, the collection documents will the have the URL of `awesome` followed by the path to the document and its file extension. + +Collections have the following template variables available for permalinks: +
@@ -149,15 +156,92 @@ written out to `/awesome/some_subdir/some_doc/index.html`.
+## Permalink examples for collections + +Depending on how you declare the permalinks in your configuration file, the permalinks and paths get written differently in the `_site` folder. A few examples will help clarify the options. + +Let's say your collection is called `apidocs` with `doc1.md` in your collection. `doc1.md` is grouped inside a folder called `mydocs`. Your project's source directory for the collection looks this: + +``` +├── \_apidocs +│   └── mydocs +│   └── doc1.md +``` + +Based on this scenario, here are a few permalink options. + +**Permalink configuration 1**: [Nothing configured]
+**Output**: + +``` +├── apidocs +│   └── mydocs +│   └── doc1.html +``` + +**Permalink configuration 2**: `/:collection/:path/:title:output_ext`
+**Output**: + +``` +├── apidocs +│   └── mydocs +│   └── doc1.html +``` + +**Permalink configuration 3**: No collection permalinks configured, but `pretty` configured for pages/posts.
+**Output**: + +``` +├── apidocs +│   └── mydocs +│   └── doc1 +│   └── index.html +``` + +**Permalink configuration 4**: `/awesome/:path/:title.html`
+**Output**: + +``` +├── awesome +│   └── mydocs +│   └── doc1.html +``` + +**Permalink configuration 5**: `/awesome/:path/:title/`
+**Output**: + +``` +├── awesome +│   └── mydocs +│   └── doc1 +│   └── index.html +``` + +**Permalink configuration 6**: `/awesome/:title.html`
+**Output**: + +``` +├── awesome +│   └── doc1.html +``` + +**Permalink configuration 7**: `:title.html` +**Output**: + +``` +├── doc1.html +``` + ## Liquid Attributes ### Collections -Each collection is accessible via the `site` Liquid variable. For example, if +Each collection is accessible as a field on the `site` variable. For example, if you want to access the `albums` collection found in `_albums`, you'd use -`site.albums`. Each collection is itself an array of documents -(e.g. `site.albums` is an array of documents, much like `site.pages` and -`site.posts`). See below for how to access attributes of those documents. +`site.albums`. + +Each collection is itself an array of documents (e.g., `site.albums` is an array of documents, much like `site.pages` and +`site.posts`). See the table below for how to access attributes of those documents. The collections are also available under `site.collections`, with the metadata you specified in your `_config.yml` (if present) and the following information: @@ -335,7 +419,7 @@ file, each document has the following attributes: 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 +you might have front matter in an individual file structured as follows (which must use a supported markup format, and cannot be saved with a `.yaml` extension): diff --git a/docs/_docs/conduct.md b/docs/_docs/conduct.md index d68c5ec5..7ba30a5a 100644 --- a/docs/_docs/conduct.md +++ b/docs/_docs/conduct.md @@ -1,6 +1,5 @@ --- title: Code of Conduct -layout: docs permalink: "/docs/conduct/" note: This file is autogenerated. Edit /CONDUCT.markdown instead. redirect_from: "/conduct/index.html" diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 9dca5cea..3f3bfd25 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -1,5 +1,4 @@ --- -layout: docs title: Configuration permalink: /docs/configuration/ --- @@ -221,10 +220,20 @@ class="flag">flags
(specified on the command-line) that control them.

--future

+ + +

Unpublished

+

Render posts that were marked as unpublished.

+ + +

unpublished: BOOL

+

--unpublished

+ +

LSI

-

Produce an index for related posts.

+

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

lsi: BOOL

diff --git a/docs/_docs/continuous-integration/circleci.md b/docs/_docs/continuous-integration/circleci.md new file mode 100644 index 00000000..fede484a --- /dev/null +++ b/docs/_docs/continuous-integration/circleci.md @@ -0,0 +1,92 @@ +--- +title: "CircleCI" +--- + +Building, testing, and deploying your Jekyll-generated website can quickly be done with [CircleCI][0], a continuous integration & delivery tool. CircleCI supports [GitHub][1] and [Bitbucket][2], and you can get started for free using an open-source or private repository. + +[0]: https://circleci.com/ +[1]: https://github.com/ +[2]: https://bitbucket.org/ + +## 1. Follow Your Project on CircleCI + +To start building your project on CircleCI, all you need to do is 'follow' your project from CircleCI's website: + +1. Visit the 'Add Projects' page: +1. From the GitHub or Bitbucket tab on the left, choose a user or organization. +1. Find your project in the list and click 'Build project' on the right. +1. The first build will start on its own. You can start telling CircleCI how to build your project by creating a [circle.yml][3] file in the root of your repository. + +[3]: https://circleci.com/docs/configuration/ + +## 2. Dependencies + +The easiest way to manage dependencies for a Jekyll project (with or without CircleCI) is via a [Gemfile][4]. You'd want to have Jekyll, any Jekyll plugins, [HTML Proofer](#html-proofer), and any other gems that you are using in the `Gemfile`. Don't forget to version `Gemfile.lock` as well. Here's an example `Gemfile`: + +[4]: http://bundler.io/gemfile.html + +```yaml +source 'https://rubygems.org' + +ruby '2.4.0' + +gem 'jekyll' +gem 'html-proofer' +``` + +CircleCI detects when `Gemfile` is present is will automatically run `bundle install` for you in the `dependencies` phase. + +## 3. Testing + +The most basic test that can be run is simply seeing if `jekyll build` actually works. This is a blocker, a dependency if you will, for other tests you might run on the generate site. So we'll run Jekyll, via Bundler, in the `dependencies` phase. + +``` +dependencies: + post: + - bundle exec jekyll build +``` + +### HTML Proofer + +With your site built, it's useful to run tests to check for valid HTML, broken links, etc. There's a few tools out there but [HTML Proofer][5] is popular amongst Jekyll users. We'll run it in the `test` phase with a few preferred flags. Check out the `html-proofer` [README][6] for all available flags, or run `htmlproofer --help` locally. + +[5]: https://github.com/gjtorikian/html-proofer +[6]: https://github.com/gjtorikian/html-proofer/blob/master/README.md#configuration + +```yaml +test: + post: + - bundle exec htmlproofer ./_site --check-html --disable-external +``` + +## Complete Example circle.yml File + +When you put it all together, here's an example of what that `circle.yml` file could look like: + +``` +machine: + environment: + NOKOGIRI_USE_SYSTEM_LIBRARIES: true # speeds up installation of html-proofer + +dependencies: + post: + - bundle exec jekyll build + +test: + post: + - bundle exec htmlproofer ./_site --allow-hash-href --check-favicon --check-html --disable-external + +deployment: + prod: + branch: master + commands: + - rsync -va --delete ./_site username@my-website:/var/html +``` + +## Questions? + +This entire guide is open-source. Go ahead and [edit it][7] if you have a fix or [ask for help][8] if you run into trouble and need some help. CircleCI also has an [online community][9] for help. + +[7]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/circleci.md +[8]: https://jekyllrb.com/help/ +[9]: https://discuss.circleci.com diff --git a/docs/_docs/continuous-integration/index.md b/docs/_docs/continuous-integration/index.md new file mode 100644 index 00000000..14c5c749 --- /dev/null +++ b/docs/_docs/continuous-integration/index.md @@ -0,0 +1,9 @@ +--- +title: Continuous Integration +permalink: /docs/continuous-integration/ +--- + +Continuous Integration (CI) enables you to publish your Jekyll generated website with confidence by automating the quality assurance and deployment processes. You can quickly get started using CI with one of the providers below: + +* [Travis CI](travis-ci) +* [CircleCI](circleci) diff --git a/docs/_docs/continuous-integration.md b/docs/_docs/continuous-integration/travis-ci.md similarity index 95% rename from docs/_docs/continuous-integration.md rename to docs/_docs/continuous-integration/travis-ci.md index 54b3466c..e76e1a60 100644 --- a/docs/_docs/continuous-integration.md +++ b/docs/_docs/continuous-integration/travis-ci.md @@ -1,16 +1,13 @@ --- -layout: docs -title: Continuous Integration -permalink: /docs/continuous-integration/ +title: "Travis CI" --- You can easily test your website build against one or more versions of Ruby. The following guide will show you how to set up a free build environment on -[Travis][0], with [GitHub][1] integration for pull requests. Paid -alternatives exist for private repositories. +[Travis][travis], with [GitHub][github] integration for pull requests. -[0]: https://travis-ci.org/ -[1]: https://github.com/ +[travis]: https://travis-ci.org/ +[github]: https://github.com/ ## 1. Enabling Travis and GitHub @@ -29,7 +26,7 @@ The simplest test script simply runs `jekyll build` and ensures that Jekyll doesn't fail to build the site. It doesn't check the resulting site, but it does ensure things are built properly. -When testing Jekyll output, there is no better tool than [html-proofer][2]. +When testing Jekyll output, there is no better tool than [html-proofer][html-proofer]. This tool checks your resulting site to ensure all links and images exist. Utilize it either with the convenient `htmlproofer` command-line executable, or write a Ruby script which utilizes the gem. @@ -71,7 +68,7 @@ Options are given as a second argument to `.new`, and are encoded in a symbol-keyed Ruby Hash. For more information about the configuration options, check out `html-proofer`'s README file. -[2]: https://github.com/gjtorikian/html-proofer +[html-proofer]: https://github.com/gjtorikian/html-proofer ## 3. Configuring Your Travis Builds @@ -94,7 +91,7 @@ Your `.travis.yml` file should look like this: ```yaml language: ruby rvm: -- 2.2.5 +- 2.3.3 before_script: - chmod +x ./script/cibuild # or do this locally and commit @@ -127,7 +124,7 @@ access to Bundler, RubyGems, and a Ruby runtime. ```yaml rvm: -- 2.2.5 +- 2.3.3 ``` RVM is a popular Ruby Version Manager (like rbenv, chruby, etc). This @@ -229,5 +226,5 @@ an entry in the `.gitignore` file to avoid it from being checked in again. This entire guide is open-source. Go ahead and [edit it][3] if you have a fix or [ask for help][4] if you run into trouble and need some help. -[3]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration.md +[3]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/travis-ci.md [4]: https://jekyllrb.com/help/ diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index 9ccac293..724c6641 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -1,6 +1,5 @@ --- title: Contributing -layout: docs permalink: "/docs/contributing/" note: This file is autogenerated. Edit /.github/CONTRIBUTING.markdown instead. --- diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index 21799169..221ee4d3 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -1,5 +1,4 @@ --- -layout: docs title: Data Files permalink: /docs/datafiles/ --- diff --git a/docs/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md index cefb4d32..79138caa 100644 --- a/docs/_docs/deployment-methods.md +++ b/docs/_docs/deployment-methods.md @@ -1,5 +1,4 @@ --- -layout: docs title: Deployment methods permalink: /docs/deployment-methods/ --- @@ -168,7 +167,7 @@ script executes. [Rack-Jekyll](https://github.com/adaoraul/rack-jekyll/) is an easy way to deploy your site on any Rack server such as Amazon EC2, Slicehost, Heroku, and so forth. It also can run with [shotgun](https://github.com/rtomayko/shotgun/), [rackup](https://github.com/rack/rack), [mongrel](https://github.com/mongrel/mongrel), [unicorn](https://github.com/defunkt/unicorn/), and [others](https://github.com/adaoraul/rack-jekyll#readme). -Read [this post](http://andycroll.com/ruby/serving-a-jekyll-blog-using-heroku) on how to deploy to Heroku using Rack-Jekyll. +Read [this post](http://andycroll.com/ruby/serving-a-jekyll-blog-using-heroku/) on how to deploy to Heroku using Rack-Jekyll. ## Jekyll-Admin for Rails @@ -207,4 +206,3 @@ Setting up Kickster is very easy, just install the gem and you are good to go. M [Aerobatic](https://www.aerobatic.com) is an add-on for Bitbucket that brings GitHub Pages style functionality to Bitbucket users. It includes continuous deployment, custom domains with a wildcard SSL cert, CDN, basic auth, and staging branches all in the box. Automating the build and deployment of a Jekyll site is just as simple as GitHub Pages - push your changes to your repo (excluding the `_site` directory) and within seconds a build will be triggered and your built site deployed to our highly- available, globally distributed hosting service. The build process will even install and execute custom Ruby plugins. See our [Jekyll docs](https://www.aerobatic.com/docs/static-generators#jekyll) for more details. - diff --git a/docs/_docs/drafts.md b/docs/_docs/drafts.md index d5513f75..c4b4f9f0 100644 --- a/docs/_docs/drafts.md +++ b/docs/_docs/drafts.md @@ -1,5 +1,4 @@ --- -layout: docs title: Working with drafts permalink: /docs/drafts/ --- diff --git a/docs/_docs/extras.md b/docs/_docs/extras.md index 83e79963..87971f74 100644 --- a/docs/_docs/extras.md +++ b/docs/_docs/extras.md @@ -1,5 +1,4 @@ --- -layout: docs title: Extras permalink: /docs/extras/ --- @@ -15,7 +14,7 @@ Kramdown comes with optional support for LaTeX to PNG rendering via [MathJax](ht ``` -For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/opinion/2014/02/16/Mathjax-with-jekyll/). +For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/visually-enforced/opinion/2014/02/16/Mathjax-with-jekyll/). ## Alternative Markdown Processors diff --git a/docs/_docs/frontmatter.md b/docs/_docs/frontmatter.md index 6dd8e5fe..cb55c444 100644 --- a/docs/_docs/frontmatter.md +++ b/docs/_docs/frontmatter.md @@ -1,5 +1,4 @@ --- -layout: docs title: Front Matter permalink: /docs/frontmatter/ --- diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 233d72e3..875bb0ec 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -1,5 +1,4 @@ --- -layout: docs title: GitHub Pages permalink: /docs/github-pages/ --- @@ -12,15 +11,13 @@ content, they’re also a great way to host your Jekyll-powered website for free Never built a website with GitHub Pages before? [See this marvelous guide by Jonathan McGlone to get you up and running](http://jmcglone.com/guides/github-pages/). -This guide will teach you what you need to know about Git, GitHub, and Jekyll to -create your very own website on GitHub Pages. +This guide will teach you what you need to know about Git, GitHub, and Jekyll to create your very own website on GitHub Pages. ### Project Page URL Structure Sometimes it's nice to preview your Jekyll site before you push your `gh-pages` branch to GitHub. However, the subdirectory-like URL structure GitHub uses for -Project Pages complicates the proper resolution of URLs. In order to assure your -site builds properly, use `site.github.url` in your URL's. +Project Pages complicates the proper resolution of URLs. In order to assure your site builds properly, use `site.github.url` in your URL's. ```html {% raw %} @@ -91,7 +88,7 @@ gem 'github-pages' And be sure to run `bundle update` often. If you like to install `pages-gem` on Windows you can find instructions by Jens Willmer on -[how to install github-pages gem on Windows (x64)]("https://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46#github-pages-and-plugins"). +[how to install github-pages gem on Windows (x64)](https://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46#github-pages-and-plugins).
@@ -132,14 +129,14 @@ stored in a specially named `gh-pages` branch or in a `docs` folder on the will become available under a subpath of your user pages subdomain, such as `username.github.io/project` (unless a custom domain is specified). -The Jekyll project repository itself is a perfect example: the -[master branch]({{ site.repository }}) contains the actual software project -for Jekyll, however the Jekyll website (that you’re looking at right now) is -contained in the [docs folder]({{ site.repository }}/tree/master/docs) of the -same repository. +The Jekyll project repository itself is a perfect example of this branch +structure—the [master branch]({{ site.repository }}) contains the +actual software project for Jekyll, and the Jekyll website that you’re +looking at right now is contained in the [docs +folder]({{ site.repository }}/tree/master/docs) of the same repository. Please refer to GitHub official documentation on -[user, organization and projets pages](https://help.github.com/articles/user-organization-and-project-pages/) +[user, organization and project pages](https://help.github.com/articles/user-organization-and-project-pages/) to see more detailed examples.
diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 5d07eb40..2ddaf67a 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -1,10 +1,117 @@ --- title: History -layout: docs permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.4.0 / 2016-01-27 +{: #v3-4-0} + +### Minor Enhancements +{: #minor-enhancements-v3-4-0} + +- Add connector param to `array_to_sentence_string` filter ([#5597]({{ site.repository }}/issues/5597)) +- Adds `group_by_exp` filter ([#5513]({{ site.repository }}/issues/5513)) +- Use Addressable instead of URI to decode ([#5726]({{ site.repository }}/issues/5726)) +- throw IncludeTagError if error occurs in included file ([#5767]({{ site.repository }}/issues/5767)) +- Write Jekyll::Utils::Exec.run for running shell commands. ([#5640]({{ site.repository }}/issues/5640)) +- Use the current year for the LICENSE of theme ([#5712]({{ site.repository }}/issues/5712)) +- Update License ([#5713]({{ site.repository }}/issues/5713)) + +### Bug Fixes +{: #bug-fixes-v3-4-0} + +- Escaped regular expressions when using `post_url`. ([#5605]({{ site.repository }}/issues/5605)) +- fix date parsing in file names to be stricter ([#5609]({{ site.repository }}/issues/5609)) +- Add a module to re-define `ENV["TZ"]` in Windows ([#5612]({{ site.repository }}/issues/5612)) +- Use each instead of map to actually return nothing ([#5668]({{ site.repository }}/issues/5668)) +- include: fix 'no implicit conversion of nil to String' ([#5750]({{ site.repository }}/issues/5750)) +- Don't include the theme's includes_path if it is nil. ([#5780]({{ site.repository }}/issues/5780)) +- test double slash when input = '/' ([#5542]({{ site.repository }}/issues/5542)) +- use logger.info for related posts ([#5822]({{ site.repository }}/issues/5822)) + +### Site Enhancements +{: #site-enhancements-v3-4-0} + +- Use only the used Font Awesome icons. ([#5530]({{ site.repository }}/issues/5530)) +- Switch to `https` when possible. ([#5611]({{ site.repository }}/issues/5611)) +- Update `_font-awesome.scss` to move .woff file before .ttf ([#5614]({{ site.repository }}/issues/5614)) +- Update documentation on updating FontAwesome Iconset ([#5655]({{ site.repository }}/issues/5655)) +- [site] Use defaults for docs and news-items ([#5744]({{ site.repository }}/issues/5744)) +- Sort gems in `docs/_config.yml` ([#5746]({{ site.repository }}/issues/5746)) +- Add missing class ([#5791]({{ site.repository }}/issues/5791)) +- Improve template docs ([#5694]({{ site.repository }}/issues/5694)) + +### Development Fixes +{: #development-fixes-v3-4-0} + +- clean unit-test names in `test/test_tags.rb` ([#5608]({{ site.repository }}/issues/5608)) +- Add cucumber feature to test for bonafide theme gems ([#5384]({{ site.repository }}/issues/5384)) +- Use `assert_nil` instead of `assert_equal nil` ([#5652]({{ site.repository }}/issues/5652)) +- Rubocop -a on lib/jekyll ([#5666]({{ site.repository }}/issues/5666)) +- Bump to rake 12.0 ([#5670]({{ site.repository }}/issues/5670)) +- Rubocop Gemfile ([#5671]({{ site.repository }}/issues/5671)) +- update Classifier-Reborn to 2.1.0 ([#5711]({{ site.repository }}/issues/5711)) +- Rubocop: fix Rakefile and gemspec ([#5745]({{ site.repository }}/issues/5745)) +- Use `assert_nil` ([#5725]({{ site.repository }}/issues/5725)) +- Sort gems in `jekyll.gemspec` ([#5746]({{ site.repository }}/issues/5746)) +- Rubocop: Require consistent comma in multiline literals ([#5761]({{ site.repository }}/issues/5761)) +- Bump rubocop ([#5765]({{ site.repository }}/issues/5765)) +- New rubocop security checks ([#5768]({{ site.repository }}/issues/5768)) +- test/helper: fix flaky plugin path test by removing calls to Dir.chdir without a block ([#5779]({{ site.repository }}/issues/5779)) +- Use latest jemoji gem ([#5782]({{ site.repository }}/issues/5782)) +- Bump htmlproofer ([#5781]({{ site.repository }}/issues/5781)) +- Bump rubies we test against ([#5784]({{ site.repository }}/issues/5784)) +- Bump rdoc to v5.0 ([#5797]({{ site.repository }}/issues/5797)) +- Bump codeclimate-test-reporter to v1.0.5 ([#5798]({{ site.repository }}/issues/5798)) + +### Documentation + +- Improve quickstart docs ([#5689]({{ site.repository }}/issues/5689)) +- Add Jekyll-Post to list of plugins ([#5705]({{ site.repository }}/issues/5705)) +- Add jekyll-numbered-headings ([#5688]({{ site.repository }}/issues/5688)) +- Docs: move permalinks from documents into config ([#5544]({{ site.repository }}/issues/5544)) +- Improve collections docs ([#5691]({{ site.repository }}/issues/5691)) +- Fix [#5730]({{ site.repository }}/issues/5730): add gcc and make to the list of requirements ([#5731]({{ site.repository }}/issues/5731)) +- Remove instructions to install Jekyll 2 on Windows ([#5582]({{ site.repository }}/issues/5582)) +- Fix example URL inconsistency ([#5592]({{ site.repository }}/issues/5592)) +- Replace backticks within HTML blocks with HTML tags ([#5435]({{ site.repository }}/issues/5435)) +- Add jekyll-migrate-permalink ([#5600]({{ site.repository }}/issues/5600)) +- Fix bad config YAML in collections example ([#5587]({{ site.repository }}/issues/5587)) +- Bring documentation on 'Directory Structure' up-to-date ([#5573]({{ site.repository }}/issues/5573)) +- Fixed typo ([#5632]({{ site.repository }}/issues/5632)) +- use backticks for Gemfile for consistency since in the next sentence … ([#5641]({{ site.repository }}/issues/5641)) +- Update Core team list in the README file ([#5643]({{ site.repository }}/issues/5643)) +- Improve Permalinks documentation. ([#5653]({{ site.repository }}/issues/5653)) +- Fix typo in Variables doc page ([#5657]({{ site.repository }}/issues/5657)) +- Fix a couple of typos in the docs ([#5658]({{ site.repository }}/issues/5658)) +- Update windows.md ([#5683]({{ site.repository }}/issues/5683)) +- Improve permalinks docs ([#5693]({{ site.repository }}/issues/5693)) +- Document --unpublished build option ([#5720]({{ site.repository }}/issues/5720)) +- Improve pages docs ([#5692]({{ site.repository }}/issues/5692)) +- Added new includes.md topic to docs ([#5696]({{ site.repository }}/issues/5696)) +- Replace a dead link with a web-archived one ([#5738]({{ site.repository }}/issues/5738)) +- Remove duplicate paragraph. ([#5740]({{ site.repository }}/issues/5740)) +- Addition of a sample "typical post" ([#5473]({{ site.repository }}/issues/5473)) +- Fix a minor grammatical mistake on themes' document ### -dev ([#5748]({{ site.repository }}/issues/5748)) +- Correct comments in data_reader.rb ([#5621]({{ site.repository }}/issues/5621)) +- Add jekyll-pre-commit to plugins list ([#5752]({{ site.repository }}/issues/5752)) +- Update quickstart.md ([#5758]({{ site.repository }}/issues/5758)) +- Correct minor typo ([#5764]({{ site.repository }}/issues/5764)) +- Fix a markdown link to look properly on the web ([#5769]({{ site.repository }}/issues/5769)) +- [docs] Info about the help command usage ([#5312]({{ site.repository }}/issues/5312)) +- Add missing merge labels for jekyllbot ([#5753]({{ site.repository }}/issues/5753)) +- Fix broken links in documentation ([#5736]({{ site.repository }}/issues/5736)) +- Docs: add `match_regex` and `replace_regex` filters ([#5799]({{ site.repository }}/issues/5799)) +- Got that diaper money? ([#5810]({{ site.repository }}/issues/5810)) +- Sort content by popularity using Google Analytics ([#5812]({{ site.repository }}/issues/5812)) +- Rework CI doc to include multiple providers. ([#5815]({{ site.repository }}/issues/5815)) +- Improve theme docs ([#5690]({{ site.repository }}/issues/5690)) +- Add mention of classifier-reborn for LSI ([#5811]({{ site.repository }}/issues/5811)) +- Added note about --blank flag ([#5802]({{ site.repository }}/issues/5802)) +- Fixed inaccuracy in "Built-in permalink styles" docs ([#5819]({{ site.repository }}/issues/5819)) + + ## 3.3.1 / 2016-11-14 {: #v3-3-1} diff --git a/docs/_docs/includes.md b/docs/_docs/includes.md new file mode 100644 index 00000000..ae6409cd --- /dev/null +++ b/docs/_docs/includes.md @@ -0,0 +1,167 @@ +--- +title: Includes +permalink: /docs/includes/ +--- + +The `include` tag allows you to include the content from another file stored in the `_includes` folder: + +```liquid +{% raw %}{% include footer.html %}{% endraw %} +``` + +Jekyll will look for the referenced file (in this case, `footer.html`) in the `_includes` directory at the root of your source directory and insert its contents. + +### Including files relative to another file + +You can choose to include file fragments relative to the current file by using the `include_relative` tag: + +```liquid +{% raw %}{% include_relative somedir/footer.html %}{% endraw %} +``` + +You won't need to place your included content within the `_includes` directory. Instead, +the inclusion is specifically relative to the file where the tag is being used. For example, +if `_posts/2014-09-03-my-file.markdown` uses the `include_relative` tag, the included file +must be within the `_posts` directory or one of its subdirectories. + +Note that you cannot use the `../` syntax to specify an include location that refers to a higher-level directory. + +All the other capabilities of the `include` tag are available to the `include_relative` tag, +such as variables. + +### Using variables names for the include file + +The name of the file you want to embed can be specified as a variable instead of an actual file name. For example, suppose you defined a variable in your page's front matter like this: + +```yaml +--- +title: My page +my_variable: footer_company_a.html +--- +``` + +You could then reference that variable in your include: + +```liquid +{% raw %}{% include {{ page.my_variable }} %}{% endraw %} +``` + +In this example, the include would insert the file `footer_company_a.html` from the `_includes/footer_company_a.html` directory. + +### Passing parameters to includes + +You can also pass parameters to an include. For example, suppose you have a file called `note.html` in your `_includes` folder that contains this formatting: + +```liquid +{% raw %}{% endraw %} +``` + +The `{% raw %}{{ include.content }}{% endraw %}` is a parameter that gets populated when you call the include and specify a value for that parameter, like this: + +```liquid +{% raw %}{% include note.html content="This is my sample note." %} {% endraw %} +``` + +The value of `content` (which is `This is my sample note`) will be inserted into the {% raw %}`{{ include.content }}`{% endraw %} parameter. + +Passing parameters to includes is especially helpful when you want to hide away complex formatting from your Markdown content. + +For example, suppose you have a special image syntax with complex formatting, and you don't want your authors to remember the complex formatting. As a result, you decide to simplify the formatting by using an include with parameters. Here's an example of the special image syntax you might want to populate with an include: + +```html +
+ + Jekyll logo +
This is the Jekyll logo
+
+``` + +You could templatize this content in your include and make each value available as a parameter, like this: + +```liquid +{% raw %}
+ + {{ include.alt }} +
{{ include.caption }}
+
{% endraw %} +``` + +This include contains 5 parameters: + +* `url` +* `max-width` +* `file` +* `alt` +* `caption` + +Here's an example that passes all the parameters to this include (the include file is named `image.html`): + +```liquid +{% raw %}{% include image.html url="http://jekyllrb.com" +max-width="200px" file="logo.png" alt="Jekyll logo" +caption="This is the Jekyll logo." %} {% endraw %} +``` + +The result is the original HTML code shown earlier. + +To safeguard situations where users don't supply a value for the parameter, you can use [Liquid's default filter](https://help.shopify.com/themes/liquid/filters/additional-filters#default). + +Overall, you can create includes that act as templates for a variety of uses — inserting audio or video clips, alerts, special formatting, and more. However, note that you should avoid using too many includes, as this will slow down the build time of your site. For example, don't use includes every time you insert an image. (The above technique shows a use case for special images.) + +### Passing parameter variables to includes + +Suppose the parameter you want to pass to the include is a variable rather than a string. For example, you might be using {% raw %}`{{ site.product_name }}`{% endraw %} to refer to every instance of your product rather than the actual hard-coded name. (In this case, your `_config.yml` file would have a key called `product_name` with a value of your product's name.) + +The string you pass to your include parameter can't contain curly braces. For example, you can't pass a parameter that contains this: {% raw %}`"The latest version of {{ site.product_name }} is now available."`{% endraw %} + +If you want to include this variable in your parameter that you pass to an include, you need to store the entire parameter as a variable before passing it to the include. You can use `capture` tags to create the variable: + +```liquid +{% raw %}{% capture download_note %}The latest version of +{{ site.product_name }} is now available.{% endcapture %}{% endraw %} +``` + +Then pass this captured variable into the parameter for the include. Omit the quotation marks around the parameter content because it's no longer a string (it's a variable): + +```liquid +{% raw %}{% include note.html content=download_note %}{% endraw %} +``` + +### Passing references to YAML files as parameter values + +Instead of passing string variables to the include, you can pass a reference to a YAML data file stored in the `_data` folder. + +Here's an example. In the `_data` folder, suppose you have a YAML file called `profiles.yml`. Its content looks like this: + +```yaml +- name: John Doe + login_age: old + image: johndoe.jpg + +- name: Jane Doe + login_age: new + image: janedoe.jpg +``` + +In the `_includes` folder, assume you have a file called `spotlight.html` with this code: + +```liquid +{% raw %}{% for person in {{ include.participants }} %} +{% if person.login_age == "new" %} +{{ person.name }} +{% endif %} +{% endfor %}{% endraw %} +``` + +Now when you insert the `spotlight.html` include file, you can submit the YAML file as a parameter: + +``` +{% raw %}{% include spotlight.html participants=site.data.profiles %}{% endraw %} +``` + +In this instance, `site.data.profiles` gets inserted in place of {% raw %}`{{ include.participants }}`{% endraw %} in the include file, and the Liquid logic processes. The result will be `Jane Doe`. diff --git a/docs/_docs/index.md b/docs/_docs/index.md index 5e08d760..ff5e8cce 100644 --- a/docs/_docs/index.md +++ b/docs/_docs/index.md @@ -1,5 +1,4 @@ --- -layout: docs title: Welcome permalink: /docs/home/ redirect_from: /docs/index.html diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 54dfd9fc..bc5c2515 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -1,5 +1,4 @@ --- -layout: docs title: Installation permalink: /docs/installation/ --- @@ -11,16 +10,28 @@ encountered and how we might make the process easier. ### Requirements -Installing Jekyll is easy and straight-forward, but there are a few -requirements you’ll need to make sure your system has before you start. +Installing Jekyll should be straight-forward if all requirements are met. +Before you start, make sure your system has the following: -- [Ruby](https://www.ruby-lang.org/en/downloads/) (including development - headers, v1.9.3 or above for Jekyll 2 and v2 or above for Jekyll 3) +- GNU/Linux, Unix, or macOS +- [Ruby](https://www.ruby-lang.org/en/downloads/) version 2.0 or above, including all development + headers - [RubyGems](https://rubygems.org/pages/download) -- Linux, Unix, or macOS -- [NodeJS](https://nodejs.org/), or another JavaScript runtime (Jekyll 2 and -earlier, for CoffeeScript support). -- [Python 2.7](https://www.python.org/downloads/) (for Jekyll 2 and earlier) +- [GCC](https://gcc.gnu.org/install/) and [Make](https://www.gnu.org/software/make/) (in case your system doesn't have them installed, which you can check by running `gcc -v` and `make -v` in your system's command line interface) + +#### Only required for Jekyll 2 and earlier + +- [NodeJS](https://nodejs.org/), or another JavaScript runtime (for CoffeeScript support). +- [Python 2.7](https://www.python.org/downloads/) + +
+
Problems installing Jekyll?
+

+ Check out the troubleshooting page or + report an issue so the + Jekyll community can improve the experience for everyone. +

+
Running Jekyll on Windows
@@ -42,10 +53,7 @@ $ gem install jekyll ``` All of Jekyll’s gem dependencies are automatically installed by the above -command, so you won’t have to worry about them at all. If you have problems -installing Jekyll, check out the [troubleshooting](../troubleshooting/) page or -[report an issue]({{ site.repository }}/issues/new) so the Jekyll -community can improve the experience for everyone. +command, so you won’t have to worry about them at all.
Installing Xcode Command-Line Tools
diff --git a/docs/_docs/maintaining/affinity-team-captain.md b/docs/_docs/maintaining/affinity-team-captain.md index 0554fdc6..bafa4e9d 100644 --- a/docs/_docs/maintaining/affinity-team-captain.md +++ b/docs/_docs/maintaining/affinity-team-captain.md @@ -1,7 +1,5 @@ --- title: Affinity Team Captains -layout: docs -permalink: /docs/maintaining/affinity-team-captain/ --- **This guide is for affinity team captains.** These special people are **team maintainers** of one of our [affinity teams][] and help triage and evaluate the issues and contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/avoiding-burnout.md b/docs/_docs/maintaining/avoiding-burnout.md index 86c5530b..e6acf402 100644 --- a/docs/_docs/maintaining/avoiding-burnout.md +++ b/docs/_docs/maintaining/avoiding-burnout.md @@ -1,7 +1,5 @@ --- title: "Avoiding Burnout" -layout: docs -permalink: /docs/maintaining/avoiding-burnout/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/becoming-a-maintainer.md b/docs/_docs/maintaining/becoming-a-maintainer.md index a303d940..00abef54 100644 --- a/docs/_docs/maintaining/becoming-a-maintainer.md +++ b/docs/_docs/maintaining/becoming-a-maintainer.md @@ -1,7 +1,5 @@ --- title: "Becoming a Maintainer" -layout: docs -permalink: /docs/maintaining/becoming-a-maintainer/ --- **This guide is for contributors.** These special people have contributed to one or more of Jekyll's repositories, but do not yet have write access to any. You may find what is written here interesting, but it’s definitely not for everyone. @@ -37,4 +35,4 @@ We would love to expand the team and look forward to many more community members # Helping Out Elsewhere -In addition to maintainers of our core and plugin code, the Jekyll team is comprised of moderators for our forums. These helpful community members take a look at the topics posted to https://talk.jekyllrb.com and ensure they are properly categorized and are acceptable under our Code of Conduct. If you would like to be a moderator, email one of the maintainers with links to where you have answered questions and a request to be added as a moderator. More help is always welcome. +In addition to maintainers of our core and plugin code, the Jekyll team is comprised of moderators for our forums. These helpful community members take a look at the topics posted to [https://talk.jekyllrb.com](https://talk.jekyllrb.com) and ensure they are properly categorized and are acceptable under our Code of Conduct. If you would like to be a moderator, email one of the maintainers with links to where you have answered questions and a request to be added as a moderator. More help is always welcome. diff --git a/docs/_docs/maintaining/index.md b/docs/_docs/maintaining/index.md index 5c4da4db..383bc6ee 100644 --- a/docs/_docs/maintaining/index.md +++ b/docs/_docs/maintaining/index.md @@ -1,5 +1,4 @@ --- -layout: docs title: Maintaining Jekyll permalink: /docs/maintaining/ --- diff --git a/docs/_docs/maintaining/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md index 9d6c82c4..ec5599bb 100644 --- a/docs/_docs/maintaining/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -1,7 +1,5 @@ --- title: "Merging a Pull Request" -layout: docs -permalink: /docs/maintaining/merging-a-pull-request/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. @@ -39,8 +37,10 @@ The categories match the H3's in the history/changelog file, and they are: 1. Major Enhancements (`+major`) – major updates or breaking changes to the code which necessitate a major version bump (v3 ~> v4) 2. Minor Enhancements (`+minor`) – minor updates (feature, enhancement) which necessitate a minor version bump (v3.1 ~> v3.2) 3. Bug Fixes (`+bug`) – corrections to code which do not change or add functionality, which necessitate a patch version bump (v3.1.0 ~> v3.1.1) -4. Site Enhancements (`+site`) – changes to the source of https://jekyllrb.com, found in `site/` -5. Development Fixes (`+dev`) – changes which do not affect user-facing functionality or documentation, such as test fixes or bumping internal dependencies +4. Documentation (`+doc`) - changes to the documentation found in `docs/_docs/` +5. Site Enhancements (`+site`) – changes to the source of [https://jekyllrb.com](https://jekyllrb.com) found in `docs/` +6. Development Fixes (`+dev`) – changes which do not affect user-facing functionality or documentation, such as test fixes or bumping internal dependencies +7. Forward Ports (`+port`) — bug fixes applied to a previous version of Jekyll pulled onto `master`, e.g. cherry-picked commits from `3-1-stable` to `master` Once @jekyllbot has merged the pull request, you should see three things: diff --git a/docs/_docs/maintaining/reviewing-a-pull-request.md b/docs/_docs/maintaining/reviewing-a-pull-request.md index fef21d7a..a0a6e353 100644 --- a/docs/_docs/maintaining/reviewing-a-pull-request.md +++ b/docs/_docs/maintaining/reviewing-a-pull-request.md @@ -1,7 +1,5 @@ --- title: "Reviewing a Pull Request" -layout: docs -permalink: /docs/maintaining/reviewing-a-pull-request/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/special-labels.md b/docs/_docs/maintaining/special-labels.md index 7f0ff12e..a8696174 100644 --- a/docs/_docs/maintaining/special-labels.md +++ b/docs/_docs/maintaining/special-labels.md @@ -1,7 +1,5 @@ --- title: "Special Labels" -layout: docs -permalink: /docs/maintaining/special-labels/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/triaging-an-issue.md b/docs/_docs/maintaining/triaging-an-issue.md index 6c97f967..bc87d96e 100644 --- a/docs/_docs/maintaining/triaging-an-issue.md +++ b/docs/_docs/maintaining/triaging-an-issue.md @@ -1,7 +1,5 @@ --- title: "Triaging an Issue" -layout: docs -permalink: /docs/maintaining/triaging-an-issue/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/migrations.md b/docs/_docs/migrations.md index 961762f7..fd8676a4 100644 --- a/docs/_docs/migrations.md +++ b/docs/_docs/migrations.md @@ -1,5 +1,4 @@ --- -layout: docs title: Blog migrations permalink: /docs/migrations/ --- diff --git a/docs/_docs/pages.md b/docs/_docs/pages.md index 15e8f830..398d1987 100644 --- a/docs/_docs/pages.md +++ b/docs/_docs/pages.md @@ -1,12 +1,9 @@ --- -layout: docs title: Creating pages permalink: /docs/pages/ --- -In addition to [writing posts](../posts/), another thing you may want to do -with your Jekyll site is create static pages. By taking advantage of the way -Jekyll copies files and directories, this is easy to do. +In addition to [writing posts](../posts/), you might also want to add static pages (content that isn't date-based) to your Jekyll site. By taking advantage of the way Jekyll copies files and directories, this is easy to do. ## Homepage @@ -28,16 +25,14 @@ homepage of your Jekyll-generated site. ## Where additional pages live Where you put HTML or [Markdown](https://daringfireball.net/projects/markdown/) -files for pages depends on how you want the pages to work. -There are two main ways of creating pages: +files for pages depends on how you want the pages to work. There are two main ways of creating pages: - Place named HTML or [Markdown](https://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 -or index.md file in each page folder. +- Place pages inside folders and subfolders named whatever you want. Both methods work fine (and can be used in conjunction with each other), -with the only real difference being the resulting URLs. +with the only real difference being the resulting URLs. By default, pages retain the same folder structure in `_site` as they do in the source directory. ### Named HTML files @@ -59,42 +54,21 @@ and associated URLs might look like: └── contact.html # => http://example.com/contact.html ``` -### Named folders containing index HTML files +If you have a lot of pages, you can organize those pages into subfolders. The same subfolders that are used to group your pages in our project's source will exist in the `_site` folder when your site builds. -There is nothing wrong with the above method. However, some people like to keep -their URLs free from things like filename extensions. To achieve clean URLs for -pages using Jekyll, you simply need to create a folder for each top-level page -you want, and then place an `index.html` file in each page’s folder. This way -the page URL ends up being the folder name, and the web server will serve up -the respective `index.html` file. Here's an example of what this structure -might look like: +## Flattening pages from subfolders into the root directory -```sh -. -├── _config.yml -├── _includes/ -├── _layouts/ -├── _posts/ -├── _site/ -├── about/ -| └── index.html # => http://example.com/about/ -├── contact/ -| └── index.html # => http://example.com/contact/ -|── other/ -| └── index.md # => http://example.com/other/ -└── index.html # => http://example.com/ +If you have pages organized into subfolders in your source folder and want to flatten them in the root folder on build, you must add the [permalink]({% link _docs/permalinks.md %}) property directly in your page's front matter like this: + +``` +--- +title: My page +permalink: mypageurl.html +--- ``` -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! +### Named folders containing index HTML files -
-
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 setting this at the top of the file: - permalink: /other -

-
+If you don't want file extensions (`.html`) to appear in your page URLs (file extensions are the default), you can choose a [permalink style](../permalinks/#builtinpermalinkstyles) that has a trailing slash instead of a file extension. + +Note if you want to view your site offline *without the Jekyll preview server*, your browser will need the file extension to display the page, and all assets will need to be relative links that function without the server baseurl. diff --git a/docs/_docs/pagination.md b/docs/_docs/pagination.md index b32b934c..b05b6bb2 100644 --- a/docs/_docs/pagination.md +++ b/docs/_docs/pagination.md @@ -1,5 +1,4 @@ --- -layout: docs title: Pagination permalink: /docs/pagination/ --- diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index 31eeb30b..f0e16770 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -1,30 +1,56 @@ --- -layout: docs title: Permalinks permalink: /docs/permalinks/ --- -Jekyll supports a flexible way to build your site’s URLs. You can specify the -permalinks for your site through the [Configuration](../configuration/) or in -the [YAML Front Matter](../frontmatter/) for each post. You’re free to choose -one of the built-in styles to create your links or craft your own. The default -style is `date`. +Permalinks refer to the URLs (excluding the domain name or directory folder) for your pages, posts, or collections. +Jekyll supports a flexible way to build permalinks, allowing you to leverage various template variables or choose built-in permalink styles (such as `date`) that automatically use a template-variable pattern. -Permalinks are constructed by creating a template URL where dynamic elements -are represented by colon-prefixed keywords. For example, the default `date` -permalink is defined according to the format `/:categories/:year/:month/:day/:title.html`. +You construct permalinks by creating a template URL where dynamic elements are represented by colon-prefixed keywords. The default template permalink is `/:categories/:year/:month/:day/:title.html`. Each of the colon-prefixed keywords is a template variable. -
-
Specifying permalinks through the YAML Front Matter
-

- Built-in permalink styles are not recognized in YAML Front Matter. So - permalink: pretty will not work, but the equivalent - /:categories/:year/:month/:day/:title/ - using template variables will. -

-
+## Where to configure permalinks -## Template variables +You can configure your site's permalinks through the [Configuration]({% link _docs/configuration.md %}) file or in the [Front Matter]({% link _docs/frontmatter.md %}) for each post, page, or collection. + +Setting permalink styles in your configuration file applies the setting globally in your project. You configure permalinks in your `_config.yml` file like this: + +```yaml +permalink: /:categories/:year/:month/:day/:title.html +``` + +If you don't specify any permalink setting, Jekyll uses the above pattern as the default. + +The permalink can also be set using a built-in permalink style: + +```yaml +permalink: date +``` + +`date` is the same as `:categories/:year/:month/:day/:title.html`, the default. See [Built-in Permalink Styles](#builtinpermalinkstyles) below for more options. + +Setting the permalink in your post, page, or collection's front matter overrides any global settings. Here's an example: + +```yaml +--- +title: My page title +permalink: /mypageurl/ +--- +``` + +Even if your configuration file specifies the `date` style, the URL for this page would be `http://somedomain.com/mypageurl/`. + +When you use permalinks that omit the `.html` file extension (called "pretty URLs") Jekyll builds the file as index.html placed inside a folder with the page's name. For example: + +``` +├── mypageurl +│   └── index.html +``` + +With a URL such as `/mypageurl/`, servers automatically load the index.html file inside the folder, so users can simply navigate to `http://somedomain.com/mypageurl/` to get to `mypageurl/index.html`. + +## Template variables for permalinks {#template-variables} + +The following table lists the template variables available for permalinks. You can use these variables in the `permalink` property in your config file.
@@ -40,7 +66,7 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti

year

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

month

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

i_month

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

day

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

i_day

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

short_year

@@ -89,7 +115,7 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti @@ -99,7 +125,7 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti @@ -109,7 +135,7 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti @@ -130,8 +156,8 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti @@ -142,7 +168,7 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti
-

Year from the Post’s filename

+

Year from the post's filename

-

Month from the Post’s filename

+

Month from the post's filename

-

Month from the Post’s filename without leading zeros.

+

Month from the post's filename without leading zeros.

-

Day from the Post’s filename

+

Day from the post's filename

-

Day from the Post’s filename without leading zeros.

+

Day from the post's filename without leading zeros.

-

Year from the Post’s filename without the century.

+

Year from the post's filename without the century.

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

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

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

- Slugified title from the document’s filename ( any character - except numbers and letters is replaced as hyphen ). May be + 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.

- The specified categories for this Post. If a post has multiple + The specified categories for this post. If a post has multiple categories, Jekyll will create a hierarchy (e.g. /category1/category2). Also Jekyll automatically parses out double slashes in the URLs, so if no categories are present, it will ignore this. @@ -153,10 +179,11 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti

-## Built-in permalink styles +Note that all template variables relating to time or categories are available to posts only. -While you can specify a custom permalink style using [template variables](#template-variables), -Jekyll also provides the following built-in styles for convenience. +## Built-in permalink styles {#builtinpermalinkstyles} + +Although you can specify a custom permalink pattern using [template variables](#template-variables), Jekyll also provides the following built-in styles for convenience.
@@ -203,26 +230,16 @@ Jekyll also provides the following built-in styles for convenience.
-## Pages and collections +Rather than typing `permalink: /:categories/:year/:month/:day/:title/`, you can just type `permalink: pretty`. -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 -`/:collection/:path`. +
+
Specifying permalinks through the YAML Front Matter
+

Built-in permalink styles are not recognized in YAML Front Matter. As a result, permalink: pretty will not work.

+
-These styles are modified to match the suffix style specified in the post -permalink setting. For example, a permalink style of `pretty`, which contains a -trailing slash, will update page permalinks to also contain a trailing slash: -`/:path/:basename/`. A permalink style of `date`, which contains a trailing -file extension, will update page permalinks to also contain a file extension: -`/:path/:basename:output_ext`. The same is true for any custom permalink style. +## Permalink style examples with posts {#permalink-style-examples} -The permalink for an individual page or collection document can always be -overridden in the [YAML Front Matter](../frontmatter/) for the page or document. -Additionally, permalinks for a given collection can be customized [in the -collections configuration](../collections/). - -## Permalink style examples +Here are a few examples to clarify how permalink styles get applied with posts. Given a post named: `/2009-04-29-slap-chop.md` @@ -270,7 +287,7 @@ Given a post named: `/2009-04-29-slap-chop.md`

/:year/:month/:title

-

See extensionless permalinks for details.

+

See Extensionless permalinks with no trailing slashes for details.

/2009/04/slap-chop

@@ -280,24 +297,58 @@ Given a post named: `/2009-04-29-slap-chop.md`
-## Extensionless permalinks +## Permalink settings for pages and collections {#pages-and-collections} -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 -still have the proper file extension (typically `.html`), so the web server -must be able to map requests without file extensions to these files. +The permalink setting in your configuration file specifies the permalink style used for posts, pages, and collections. However, because pages and collections don't have time or categories, these aspects of the permalink style are ignored with pages and collections. -Both [GitHub Pages](../github-pages/) and the Jekyll's built-in WEBrick server -handle these requests properly without any additional work. +For example: + +* A permalink style of `/:categories/:year/:month/:day/:title.html` for posts becomes `/:title.html` for pages and collections. +* A permalink style of `pretty` (or `/:categories/:year/:month/:day/:title/`), which omits the file extension and contains a trailing slash, will update page and collection permalinks to also omit the file extension and contain a trailing slash: `/:title/`. +* A permalink style of `date`, which contains a trailing file extension, will update page permalinks to also contain a trailing file extension: `/:title.html`. But no time or category information will be included. + +## Permalinks and default paths + +The path to the post or page in the built site differs for posts, pages, and collections: + +### Posts + +The subfolders into which you may have organized your posts inside the `_posts` directory will not be part of the permalink. + +If you use a permalink style that omits the `.html` file extension, each post is rendered as an `index.html` file inside a folder with the post's name (for example, `categoryname/2016/12/01/mypostname/index.html`). + +### Pages + +Unlike posts, pages by default mimic the source directory structure exactly. (The only exception is if your page has a `permalink` declared its front matter — in that case, the structure honors the permalink setting instead of the source folder structure.) + +As with posts, if you use a permalink style that omits the `.html` file extension, each page is rendered as an `index.html` file inserted inside a folder with the page's name (for example, `mypage/index.html`). + +### Collections + +By default, collections follow a similar structure in the `_site` folder as pages, except that the path is prefaced by the collection name. For example: `collectionname/mypage.html`. For permalink settings that omit the file extension, the path would be `collection_name/mypage/index.html`. + +Collections have their own way of setting permalinks. Additionally, collections have unique template variables available available (such as `path` and `output_ext`). See the [Configuring permalinks for collections](../collections/#permalinks) in Collections for more information. + +## Flattening pages in \_site on build + +If you want to flatten your pages (pull them out of subfolders) in the `_site` directory when your site builds (similar to posts), add the `permalink` property to the front matter of each page, with no path specified: + +``` +--- +title: My page +permalink: mypageurl.html +--- +``` + +## Extensionless permalinks with no trailing slashes {#extensionless-permalinks} + +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 these types of permalinks, output files written to disk will still have the proper file extension (typically `.html`), so the web server must be able to map requests without file extensions to these files. + +Both [GitHub Pages](../github-pages/) and the Jekyll's built-in WEBrick server handle these requests properly without any additional work. ### Apache -The Apache web server has very extensive support for content negotiation and can -handle extensionless URLs by setting the [multiviews][] option in your -`httpd.conf` or `.htaccess` file: - -[multiviews]: https://httpd.apache.org/docs/current/content-negotiation.html#multiviews +The Apache web server has extensive support for content negotiation and can handle extensionless URLs by setting the [multiviews](https://httpd.apache.org/docs/current/content-negotiation.html#multiviews) option in your `httpd.conf` or `.htaccess` file: {% highlight apache %} Options +MultiViews @@ -305,13 +356,12 @@ Options +MultiViews ### Nginx -The [try_files][] directive allows you to specify a list of files to search for -to process a request. The following configuration will instruct nginx to search -for a file with an `.html` extension if an exact match for the requested URI is -not found. - -[try_files]: http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files +The [try_files](http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files) directive allows you to specify a list of files to search for to process a request. The following configuration will instruct nginx to search for a file with an `.html` extension if an exact match for the requested URI is not found. {% highlight nginx %} try_files $uri $uri.html $uri/ =404; {% endhighlight %} + +## Linking without regard to permalink styles + +You can create links in your topics to other posts, pages, or collection items in a way that is valid no matter what permalink configuration you choose. By using the `link` tag, if you change your permalinks, your links won't break. See [Linking to pages](../templates#link) in Templates for more details. diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index cc1995ad..a0c61cd3 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -1,5 +1,4 @@ --- -layout: docs title: Plugins permalink: /docs/plugins/ --- @@ -754,6 +753,7 @@ LESS.js files during generation. - [Jekyll::Paginate::Category](https://github.com/midnightSuyama/jekyll-paginate-category): Pagination Generator for Jekyll Category. - [AMP-Jekyll by Juuso Mikkonen](https://github.com/juusaw/amp-jekyll): Generate [Accelerated Mobile Pages](https://www.ampproject.org) of Jekyll posts. - [Jekyll Art Gallery plugin](https://github.com/alexivkin/Jekyll-Art-Gallery-Plugin): An advanced art/photo gallery generation plugin for creating galleries from a set of image folders. Supports image tagging, thumbnails, sorting, image rotation, post-processing (remove EXIF, add watermark), multiple collections and much more. +- [jekyll-ga](https://github.com/developmentseed/jekyll-ga): A Jekyll plugin that downloads Google Analytics data and adds it to posts. Useful for making a site that lists "most popular" content. [Read the introduction](https://developmentseed.org/blog/google-analytics-jekyll-plugin/) post on the developmentSEED blog. #### Converters @@ -771,7 +771,6 @@ LESS.js files during generation. - [Markdown References by Olov Lassus](https://github.com/olov/jekyll-references): Keep all your markdown reference-style link definitions in one \_references.md file. - [Stylus Converter](https://gist.github.com/988201): Convert .styl to .css. - [ReStructuredText Converter](https://github.com/xdissent/jekyll-rst): Converts ReST documents to HTML with Pygments syntax highlighting. -- [Jekyll-pandoc-plugin](https://github.com/dsanson/jekyll-pandoc-plugin): Use pandoc for rendering markdown. - [Jekyll-pandoc-multiple-formats](https://github.com/fauno/jekyll-pandoc-multiple-formats) by [edsl](https://github.com/edsl): Use pandoc to generate your site in multiple formats. Supports pandoc’s markdown extensions. - [Transform Layouts](https://gist.github.com/1472645): Allows HAML layouts (you need a HAML Converter plugin for this to work). - [Org-mode Converter](https://gist.github.com/abhiyerra/7377603): Org-mode converter for Jekyll. @@ -805,6 +804,9 @@ LESS.js files during generation. - [jekyll-typogrify](https://github.com/myles/jekyll-typogrify): A Jekyll plugin that brings the functions of [typogruby](http://avdgaag.github.io/typogruby/). - [Jekyll Email Protect](https://github.com/vwochnik/jekyll-email-protect): Email protection liquid filter for Jekyll - [Jekyll Uglify Filter](https://github.com/mattg/jekyll-uglify-filter): A Liquid filter that runs your JavaScript through UglifyJS. +- [match_regex](https://github.com/sparanoid/match_regex): A Liquid filter to perform regex match. +- [replace_regex](https://github.com/sparanoid/replace_regex): A Liquid filter to perform regex replace. +- [Jekyll Money](https://rubygems.org/gems/jekyll-money): A Jekyll plugin for dealing with money. Because we all have to at some point. #### Tags @@ -918,6 +920,9 @@ LESS.js files during generation. - [jekyll-data](https://github.com/ashmaroli/jekyll-data): Read data files within Jekyll Theme Gems. - [jekyll-pinboard](https://github.com/snaptortoise/jekyll-pinboard-plugin): Access your Pinboard bookmarks within your Jekyll theme. - [jekyll-migrate-permalink](https://github.com/mpchadwick/jekyll-migrate-permalink): Adds a `migrate-permalink` sub-command to help deal with side effects of changing your permalink. +- [Jekyll-Post](https://github.com/robcrocombe/jekyll-post): A CLI tool to easily draft, edit, and publish Jekyll posts. +- [jekyll-numbered-headings](https://github.com/muratayusuke/jekyll-numbered-headings): Adds ordered number to headings. +- [jekyll-pre-commit](https://github.com/mpchadwick/jekyll-pre-commit): A framework for running checks against your posts using a git pre-commit hook before you publish them. #### Editors diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index 40aa8365..f43b72e8 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -1,5 +1,4 @@ --- -layout: docs title: Writing posts permalink: /docs/posts/ --- @@ -111,6 +110,24 @@ Linking to a PDF for readers to download:

+## A typical post + +Jekyll can handle many different iterations of the idea you might associate with a "post," however a standard blog style post, including an Title, Layout, Publishing Date, and Categories might look like this: + +``` +--- +layout: post +title: "Welcome to Jekyll!" +date: 2015-11-17 16:16:01 -0600 +categories: jekyll update +--- +You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `bundle exec jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. + +To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. + +``` +Everything in between the first and second `---` are part of the YAML Front Matter, and everything after the second `---` will be rendered with Markdown and show up as "Content." + ## Displaying an index of posts It’s all well and good to have posts in a folder, but a blog is no use unless diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index 969b5384..a8a2ae98 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -1,28 +1,51 @@ --- -layout: docs title: Quick-start guide permalink: /docs/quickstart/ --- -For the impatient, here's how to get a boilerplate Jekyll site up and running. + +If you already have a full [Ruby](https://www.ruby-lang.org/en/downloads/) development environment with all headers and [RubyGems](https://rubygems.org/pages/download) installed (see Jekyll's [requirements](/docs/installation/#requirements/)), you can create a new Jekyll site by doing the following: ```sh +# Install Jekyll and Bundler gems through RubyGems ~ $ gem install jekyll bundler + +# Create a new Jekyll site at ./myblog ~ $ jekyll new myblog + +# Change into your new directory ~ $ cd myblog + +# Build the site on the preview server ~/myblog $ bundle exec jekyll serve -# => Now browse to http://localhost:4000 + +# Now browse to http://localhost:4000 ``` -The `jekyll new` command now automatically initiates `bundle install` and installs the dependencies required. To skip this, pass `--skip-bundle` option like so `jekyll new myblog --skip-bundle`. +If you encounter any unexpected errors during the above, please refer to the already-mentioned [requirements](/docs/installation/#requirements/) page, as you might be missing development headers or other prerequisites. -If you 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`. +## About Bundler -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 -advantage of all the awesome configuration options Jekyll makes available. +`gem install jekyll bundler` installs the [jekyll](https://rubygems.org/gems/jekyll/) and [bundler](https://rubygems.org/gems/bundler) gems through [RubyGems](https://rubygems.org/). You need only to install the gems one time — not every time you create a new Jekyll project. Here are some additional details: -If you're running into problems, ensure you have all the [requirements -installed][Installation]. +* `bundler` is a gem that manages other Ruby gems. It makes sure your gems and gem versions are compatible, and that you have all necessary dependencies each gem requires. +* The `Gemfile` and `Gemfile.lock` files inform Bundler about the gem requirements in your site. If your site doesn't have these Gemfiles, you can omit `bundle exec` and just run `jekyll serve`. -[Installation]: /docs/installation/ +* When you run `bundle exec jekyll serve`, Bundler uses the gems and versions as specified in `Gemfile.lock` to ensure your Jekyll site builds with no compatibility or dependency conflicts. + +## Options for creating a new site with Jekyll + +`jekyll new ` installs a new Jekyll site at the path specified (relative to current directory). In this case, Jekyll will be installed in a directory called `myblog`. Here are some additional details: + +* To install the Jekyll site into the directory you're currently in, run `jekyll new .` If the existing directory isn't empty, you can pass the `--force` option with `jekyll new . --force`. +* `jekyll new` automatically initiates `bundle install` to install the dependencies required. (If you don't want Bundler to install the gems, use `jekyll new myblog --skip-bundle`.) +* By default, the Jekyll site installed by `jekyll new` uses a gem-based theme called [Minima](https://github.com/jekyll/minima). With [gem-based themes](../themes), some of the directories and files are stored in the theme-gem, hidden from your immediate view. +* We recommend setting up Jekyll with a gem-based theme but if you want to start with a blank slate, use `jekyll new myblog --blank` +* To learn about other parameters you can include with `jekyll new`, type `jekyll new --help`. + +When in doubt, use the help command to remind you of all available options and usage, it also works with the new, build and serve subcommands, e.g. jekyll help new or jekyll help build. +{: .note .info } + +## Next steps + +Building a Jekyll site with the default theme is just the first step. The real magic happens when you start creating blog posts, using the front matter to control templates and layouts, and taking advantage of all the awesome configuration options Jekyll makes available. diff --git a/docs/_docs/resources.md b/docs/_docs/resources.md index 2042b1a6..0f90fae8 100644 --- a/docs/_docs/resources.md +++ b/docs/_docs/resources.md @@ -1,5 +1,4 @@ --- -layout: docs title: Resources permalink: /docs/resources/ --- diff --git a/docs/_docs/sites.md b/docs/_docs/sites.md index 28e464ba..65401551 100644 --- a/docs/_docs/sites.md +++ b/docs/_docs/sites.md @@ -1,5 +1,4 @@ --- -layout: docs title: Sites using Jekyll permalink: /docs/sites/ --- diff --git a/docs/_docs/static_files.md b/docs/_docs/static_files.md index 55a72747..523c29df 100644 --- a/docs/_docs/static_files.md +++ b/docs/_docs/static_files.md @@ -1,5 +1,4 @@ --- -layout: docs title: Static Files permalink: /docs/static-files/ --- diff --git a/docs/_docs/structure.md b/docs/_docs/structure.md index bdfaab59..6735d6e0 100644 --- a/docs/_docs/structure.md +++ b/docs/_docs/structure.md @@ -1,5 +1,4 @@ --- -layout: docs title: Directory structure permalink: /docs/structure/ --- diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 79b5fdae..0d4975d6 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -1,5 +1,4 @@ --- -layout: docs title: Templates permalink: /docs/templates/ --- @@ -421,56 +420,15 @@ The default is `default`. They are as follows (with what they filter): ### Includes -If you have small page fragments that you wish to include in multiple places on -your site, you can use the `include` tag. +If you have small page snippets that you want to include in multiple places on your site, save the snippets as *include files* and insert them where required, by using the `include` tag: ```liquid {% raw %}{% include footer.html %}{% endraw %} ``` -Jekyll expects all include files to be placed in an `_includes` directory at the -root of your source directory. This will embed the contents of -`/_includes/footer.html` into the calling file. +Jekyll expects all *include files* to be placed in an `_includes` directory at the root of your source directory. In the above example, this will embed the contents of `_includes/footer.html` into the calling file. -
-
ProTip™: Use variables as file name
-

- - The name of the file you wish to embed can be literal (as in the example above), - or you can use a variable, using liquid-like variable syntax as in - {% raw %}{% include {{my_variable}} %}{% endraw %}. - -

-
- -You can also pass parameters to an include. Omit the quotation marks to send a variable's value. Liquid curly brackets should not be used here: - -```liquid -{% raw %}{% include footer.html param="value" variable-param=page.variable %}{% endraw %} -``` - -These parameters are available via Liquid in the include: - -```liquid -{% raw %}{{ include.param }}{% endraw %} -``` - -#### Including files relative to another file - -You can also choose to include file fragments relative to the current file: - -```liquid -{% raw %}{% include_relative somedir/footer.html %}{% endraw %} -``` - -You won't need to place your included content within the `_includes` directory. Instead, -the inclusion is specifically relative to the file where the tag is being used. For example, -if `_posts/2014-09-03-my-file.markdown` uses the `include_relative` tag, the included file -must be within the `_posts` directory, or one of its subdirectories. You cannot include -files in other locations. - -All the other capabilities of the `include` tag are available to the `include_relative` tag, -such as using variables. +For more advanced information on using includes, see [Includes](../includes). ### Code snippet highlighting @@ -530,64 +488,6 @@ site. If you use `linenos`, you might want to include an additional CSS class definition for the `.lineno` class in `syntax.css` to distinguish the line numbers from the highlighted code. -### Link - -If you want to include a link to a collection's document, a post, a page -or a file the `link` tag will generate the correct permalink URL for the path -you specify. - -You must include the file extension when using the `link` tag. - -```liquid -{% raw %} -{{ site.baseurl }}{% link _collection/name-of-document.md %} -{{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %} -{{ site.baseurl }}{% link news/index.html %} -{{ site.baseurl }}{% link /assets/files/doc.pdf %} -{% endraw %} -``` - -You can also use this tag to create a link in Markdown as follows: - -```liquid -{% raw %} -[Link to a document]({{ site.baseurl }}{% link _collection/name-of-document.md %}) -[Link to a post]({{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %}) -[Link to a page]({{ site.baseurl }}{% link news/index.html %}) -[Link to a file]({{ site.baseurl }}{% link /assets/files/doc.pdf %}) -{% endraw %} -``` - -### Post URL - -If you would like to include a link to a post on your site, the `post_url` tag -will generate the correct permalink URL for the post you specify. - -```liquid -{% raw %} -{{ site.baseurl }}{% post_url 2010-07-21-name-of-post %} -{% endraw %} -``` - -If you organize your posts in subdirectories, you need to include subdirectory -path to the post: - -```liquid -{% raw %} -{{ site.baseurl }}{% post_url /subdir/2010-07-21-name-of-post %} -{% endraw %} -``` - -There is no need to include the file extension when using the `post_url` tag. - -You can also use this tag to create a link to a post in Markdown as follows: - -```liquid -{% raw %} -[Name of Link]({{ site.baseurl }}{% post_url 2010-07-21-name-of-post %}) -{% endraw %} -``` - ### Gist Use the `gist` tag to easily embed a GitHub Gist onto your site. This works @@ -609,3 +509,71 @@ You may also optionally specify the filename in the gist to display: To use the `gist` tag, you'll need to add the [jekyll-gist](https://github.com/jekyll/jekyll-gist) gem to your project. + +## Links + +### Linking to pages {#link} + +To link to a post, a page, collection item, or file, the `link` tag will generate the correct permalink URL for the path you specify. For example, if you use the `link` tag to link to `mypage.html`, even if you change your permalink style to include the file extension or omit it, the URL formed by the `link` tag will always be valid. + +You must include the file's original extension when using the `link` tag. Here are some examples: + +```liquid +{% raw %} +{{ site.baseurl }}{% link _collection/name-of-document.md %} +{{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %} +{{ site.baseurl }}{% link news/index.html %} +{{ site.baseurl }}{% link /assets/files/doc.pdf %} +{% endraw %} +``` + +You can also use the `link` tag to create a link in Markdown as follows: + +```liquid +{% raw %} +[Link to a document]({{ site.baseurl }}{% link _collection/name-of-document.md %}) +[Link to a post]({{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %}) +[Link to a page]({{ site.baseurl }}{% link news/index.html %}) +[Link to a file]({{ site.baseurl }}{% link /assets/files/doc.pdf %}) +{% endraw %} +``` + +(Including `{% raw %}{{ site.baseurl }}{% endraw %}` is optional — it depends on whether you want to preface the page URL with the `baseurl` value.) + +The path to the post, page, or collection is defined as the path relative to the root directory (where your config file is) to the file, not the path from your existing page to the other page. + +For example, suppose you're creating a link `page_a.md` (stored in `pages/folder1/folder2`) to `page_b.md` (stored in `pages/folder1`). Your path in the link would not be `../page_b.html`. Instead, it would be `/pages/folder1/page_b.md`. + +If you're unsure of the path, add `{% raw %}{{ page.path }}{% endraw %}` to the page and it will display the path. + +One major benefit of using the `link` tag is link validation. If the link doesn't exist, Jekyll won't build your site. This is a good thing, as it will alert you to a broken link so you can fix it (rather than allowing you to build and deploy a site with broken links). + +Note you cannot add filters to `link` tags. For example, you cannot append a string using Liquid filters, such as `{% raw %}{% link mypage.html | append: "#section1" %} {% endraw %}`. To link to sections on a page, you will need to use regular HTML or Markdown linking techniques. + +### Linking to posts + +If you want like to include a link to a post on your site, the `post_url` tag will generate the correct permalink URL for the post you specify. + +```liquid +{% raw %} +{{ site.baseurl }}{% post_url 2010-07-21-name-of-post %} +{% endraw %} +``` + +If you organize your posts in subdirectories, you need to include subdirectory path to the post: + +```liquid +{% raw %} +{{ site.baseurl }}{% post_url /subdir/2010-07-21-name-of-post %} +{% endraw %} +``` + +There is no need to include the file extension when using the `post_url` tag. + +You can also use this tag to create a link to a post in Markdown as follows: + +```liquid +{% raw %} +[Name of Link]({{ site.baseurl }}{% post_url 2010-07-21-name-of-post %}) +{% endraw %} +``` diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index c7d6d574..551d9340 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -1,83 +1,209 @@ --- -layout: docs title: Themes permalink: /docs/themes/ --- -Jekyll has an extensive theme system, which allows you to leverage community-maintained templates and styles to customize your site's presentation. Jekyll themes package layouts, includes, and stylesheets in a way that can be overridden by your site's content. +Jekyll has an extensive theme system that allows you to leverage community-maintained templates and styles to customize your site's presentation. Jekyll themes package up layouts, includes, and stylesheets in a way that can be overridden by your site's content. -## Installing a theme +## Understanding gem-based themes -1. To install a theme, first, add the theme to your site's `Gemfile`: +When you [create a new Jekyll site](/docs/quickstart) (by running the `jekyll new ` command), Jekyll installs a site that uses a gem-based theme called [Minima](https://github.com/jekyll/minima). - gem 'my-awesome-jekyll-theme' +With gem-based themes, some of the site's directories (such as the `assets`, `_layouts`, `_includes`, and `_sass` directories) are stored in the theme's gem, hidden from your immediate view. Yet all of the necessary directories will be read and processed during Jekyll's build process. -2. Save the changes to your `Gemfile` -3. Run the command `bundle install` to install the theme -4. Finally, activate the theme by adding the following to your site's `_config.yml`: +In the case of Minima, you see only the following files in your Jekyll site directory: - theme: my-awesome-jekyll-theme +``` +├── Gemfile +├── Gemfile.lock +├── _config.yml +├── _posts +│ └── 2016-12-04-welcome-to-jekyll.markdown +├── about.md +└── index.md +``` -You can have multiple themes listed in your site's Gemfile, but only one theme can be selected in your site's `_config.yml`. -{: .note .info } +The `Gemfile` and `Gemfile.lock` files are used by Bundler to keep track of the required gems and gem versions you need to build your Jekyll site. + +Gem-based themes make it easy for theme developers to make updates available to anyone who has the theme gem. When there's an update, theme developers push the update to RubyGems. + +If you have the theme gem, you can (if you desire) run `bundle update` to update all gems in your project. Or you can run `bundle update `, replacing `` with the theme name, such as `minima`, to just update the theme gem. Any new files or updates the theme developer has made (such as to stylesheets or includes) will be pulled into your project automatically. + +The goal of gem-based themes is to allow you to get all the benefits of a robust, continually updated theme without having all the theme's files getting in your way and over-complicating what might be your primary focus: creating content. ## Overriding theme defaults -Jekyll themes set default layouts, includes, and stylesheets, that can be overridden by your site's content. For example, if your selected theme has a `page` layout, you can override the theme's layout by creating your own `page` layout in the `_layouts` folder (e.g., `_layouts/page.html`). +Jekyll themes set default layouts, includes, and stylesheets. However, you can override any of the theme defaults with your own site content. -Jekyll will look first to your site's content, before looking to the theme's defaults, for any requested file in the following folders: +For example, if your selected theme has a `page` layout, you can override the theme's layout by creating your own `page` layout in the `_layouts` directory (that is, `_layouts/page.html`). -* `/assets` -* `/_layouts` -* `/_includes` -* `/_sass` +Jekyll will look first to your site's content before looking to the theme's defaults for any requested file in the following folders: + +- `/assets` +- `/_layouts` +- `/_includes` +- `/_sass` Refer to your selected theme's documentation and source repository for more information on what files you can override. {: .note .info} -To locate theme's files on your computer, run `bundle show` followed by -the name of the theme's gem, e.g. `bundle show minima` for default Jekyll's -theme. Then copy the files you want to override, from the returned path to your root folder. +To locate theme's files on your computer: -## Creating a theme +1. Run `bundle show` followed by the name of the theme's gem, e.g., `bundle show minima` for default Jekyll's theme. -Jekyll themes are distributed as Ruby gems. Don't worry, Jekyll will help you scaffold a new theme with the `new-theme` command. Just run `jekyll new-theme` with the theme name as an argument: + This returns the location of the gem-based theme files. For example, Minima theme's files are located in `/usr/local/lib/ruby/gems/2.3.0/gems/minima-2.1.0` on macOS. + +2. Open the theme's directory in Finder or Explorer: + + ```shell + # On MacOS + open $(bundle show minima) + # On Windows + explorer /usr/local/lib/ruby/gems/2.3.0/gems/minima-2.1.0 + ``` + + A Finder or Explorer window opens showing the theme's files and directories. The Minima theme gem contains these files: + + ``` + ├── LICENSE.txt + ├── README.md + ├── _includes + │   ├── disqus_comments.html + │   ├── footer.html + │   ├── google-analytics.html + │   ├── head.html + │   ├── header.html + │   ├── icon-github.html + │   ├── icon-github.svg + │   ├── icon-twitter.html + │   └── icon-twitter.svg + ├── _layouts + │   ├── default.html + │   ├── home.html + │   ├── page.html + │   └── post.html + ├── _sass + │   ├── minima + │   │   ├── _base.scss + │   │   ├── _layout.scss + │   │   └── _syntax-highlighting.scss + │   └── minima.scss + └── assets + └── main.scss + ``` + + With a clear understanding of the theme's files, you can now override any theme file by creating a similarly named file in your Jekyll site directory. + + Let's say you want to override Minima's footer. In your Jekyll site, create an `_includes` folder and add a file in it called `footer.html`. Jekyll will now use your site's `footer.html` file instead of the `footer.html` file from the Minima theme gem. + +## Converting gem-based themes to regular themes + +Suppose you want to get rid of the gem-based theme and convert it to a regular theme, where all files are present in your Jekyll site directory, with nothing stored in the theme gem. + +To do this, copy the files from the theme gem's directory into your Jekyll site directory. (For example, copy them to `/myblog` if you created your Jekyll site at `/myblog`. See the previous section for details.) + +Then remove references to the theme gem in `Gemfile` and configuration. For example, to remove `minima`: + +- Open `Gemfile` and remove `gem "minima", "~> 2.0"`. +- Open `_config.yml` and remove `theme: minima`. + +Now `bundle update` will no longer get updates for the theme gem. + +## Installing a gem-based theme {#installing-a-theme} + +The `jekyll new ` command isn't the only way to create a new Jekyll site with a gem-based theme. You can also find gem-based themes online and incorporate them into your Jekyll project. + +For example, search for [jekyll theme on RubyGems](https://rubygems.org/search?utf8=%E2%9C%93&query=jekyll-theme) to find other gem-based themes. (Note that not all themes are using `jekyll-theme` as a convention in the theme name.) + +To install a gem-based theme: + +1. Add the theme to your site's `Gemfile`: + + ```sh + gem "jekyll-theme-awesome" + ``` + +2. Install the theme: + + ```sh + bundle install + ``` + +3. Add the following to your site's `_config.yml` to activate the theme: + + ```sh + theme: jekyll-theme-awesome + ``` + +4. Build your site: + + ```sh + bundle exec jekyll serve + ``` + +You can have multiple themes listed in your site's `Gemfile`, but only one theme can be selected in your site's `_config.yml`. {: .note .info } + +If you're publishing your Jekyll site on [GitHub Pages](https://pages.github.com/), note that GitHub Pages supports only some gem-based themes. See [Supported Themes](https://pages.github.com/themes/) in GitHub's documentation to see which themes are supported. + +## Creating a gem-based theme + +If you're a Jekyll theme developer (rather than just a consumer of themes), you can package up your theme in RubyGems and allow users to install it through Bundler. + +If you're unfamiliar with creating Ruby gems, don't worry. Jekyll will help you scaffold a new theme with the `new-theme` command. Run `jekyll new-theme` with the theme name as an argument. + +Here is an example: ```sh -jekyll new-theme my-awesome-theme - create /path/to/my-awesome-theme/_layouts - create /path/to/my-awesome-theme/_includes - create /path/to/my-awesome-theme/_sass - create /path/to/my-awesome-theme/_layouts/page.html - create /path/to/my-awesome-theme/_layouts/post.html - create /path/to/my-awesome-theme/_layouts/default.html - create /path/to/my-awesome-theme/Gemfile - create /path/to/my-awesome-theme/my-awesome-theme.gemspec - create /path/to/my-awesome-theme/README.md - create /path/to/my-awesome-theme/LICENSE.txt - initialize /path/to/my-awesome-theme/.git - create /path/to/my-awesome-theme/.gitignore -Your new Jekyll theme, my-awesome-theme, is ready for you in /path/to/my-awesome-theme! -For help getting started, read /path/to/my-awesome-theme/README.md. +jekyll new-theme jekyll-theme-awesome + create /path/to/jekyll-theme-awesome/_layouts + create /path/to/jekyll-theme-awesome/_includes + create /path/to/jekyll-theme-awesome/_sass + create /path/to/jekyll-theme-awesome/_layouts/page.html + create /path/to/jekyll-theme-awesome/_layouts/post.html + create /path/to/jekyll-theme-awesome/_layouts/default.html + create /path/to/jekyll-theme-awesome/Gemfile + create /path/to/jekyll-theme-awesome/jekyll-theme-awesome.gemspec + create /path/to/jekyll-theme-awesome/README.md + create /path/to/jekyll-theme-awesome/LICENSE.txt + initialize /path/to/jekyll-theme-awesome/.git + create /path/to/jekyll-theme-awesome/.gitignore +Your new Jekyll theme, jekyll-theme-awesome, is ready for you in /path/to/jekyll-theme-awesome! +For help getting started, read /path/to/jekyll-theme-awesome/README.md. ``` -Add your template files in the corresponding folders, complete the `.gemspec` and the README files according to your needs. +Add your template files in the corresponding folders. Then complete the `.gemspec` and the README files according to your needs. ### Layouts and includes Theme layouts and includes work just like they work in any Jekyll site. Place layouts in your theme's `/_layouts` folder, and place includes in your themes `/_includes` folder. -For example, if your theme has a `/_layouts/page.html` file, and a page has `layout: page` in its YAML front matter, Jekyll will first look to the site's `_layouts` folder for a the `page` layout, and if none exists, will use your theme's `page` layout. +For example, if your theme has a `/_layouts/page.html` file, and a page has `layout: page` in its YAML front matter, Jekyll will first look to the site's `_layouts` folder for the `page` layout, and if none exists, will use your theme's `page` layout. ### Assets -Any file in `/assets` will be copied over to the user's site upon build unless they have a file with the same relative path. You may ship any kind of asset here: SCSS, an image, a webfont, etc. These files behave just like pages and static files in Jekyll: if the file has [YAML front matter]({{ site.baseurl }}/docs/frontmatter/) at the top, then it will be rendered. If it does not have YAML front matter, it will simply be copied over into the resulting site. This allows theme creators to ship a default `/assets/styles.scss` file which their layouts can depend on as `/assets/styles.css`. +Any file in `/assets` will be copied over to the user's site upon build unless they have a file with the same relative path. You can ship any kind of asset here: SCSS, an image, a webfont, etc. These files behave like pages and static files in Jekyll: + +- If the file has [YAML front matter](../docs/frontmatter/) at the top, it will be rendered. +- If the file does not have YAML front matter, it will simply be copied over into the resulting site. + +This allows theme creators to ship a default `/assets/styles.scss` file which their layouts can depend on as `/assets/styles.css`. All files in `/assets` will be output into the compiled site in the `/assets` folder just as you'd expect from using Jekyll on your sites. ### Stylesheets -Your theme's stylesheets should be placed in your theme's `/_sass` folder, again, just as you would when authoring a Jekyll site. Your theme's styles can be included in the user's stylesheet using the `@import` directive. +Your theme's stylesheets should be placed in your theme's `_sass` folder, again, just as you would when authoring a Jekyll site. + +``` +_sass +├── jekyll-theme-awesome.scss +``` + +Your theme's styles can be included in the user's stylesheet using the `@import` directive. + +```css +{% raw %}@import "{{ site.theme }}";{% endraw %} +``` ### Documenting your theme @@ -91,20 +217,22 @@ Themes are visual. Show users what your theme looks like by including a screensh To preview your theme as you're authoring it, it may be helpful to add dummy content in, for example, `/index.html` and `/page.html` files. This will allow you to use the `jekyll build` and `jekyll serve` commands to preview your theme, just as you'd preview a Jekyll site. -If you do preview your theme locally, be sure to add `/_site` to your theme's `.gitignore` file to prevent the compiled site from also being included when you distribute your theme. -{: .info .note} +If you do preview your theme locally, be sure to add `/_site` to your theme's `.gitignore` file to prevent the compiled site from also being included when you distribute your theme. {: .info .note} ### Publishing your theme -Themes are published via [RubyGems.org](https://rubygems.org). You'll need a RubyGems account, which you can [create for free](https://rubygems.org/sign_up). +Themes are published via [RubyGems.org](https://rubygems.org). You will need a RubyGems account, which you can [create for free](https://rubygems.org/sign_up). -1. First, package your theme, by running the following command, replacing `my-awesome-jekyll-theme` with the name of your theme: +1. First, package your theme, by running the following command, replacing `jekyll-theme-awesome` with the name of your theme: - gem build my-awesome-jekyll-theme.gemspec + ```sh + gem build jekyll-theme-awesome.gemspec + ``` -2. Next, push your packaged theme up to the RubyGems service, by running the following command, again replacing `my-awesome-jekyll-theme` with the name of your theme: +2. Next, push your packaged theme up to the RubyGems service, by running the following command, again replacing `jekyll-theme-awesome` with the name of your theme: - gem push my-awesome-jekyll-theme-*.gem + ```sh + gem push jekyll-theme-awesome-*.gem + ``` -3. To release a new version of your theme, simply update the version number in the gemspec file, ( `my-awesome-jekyll-theme.gemspec` in this example ), and then repeat Steps 1 & 2 above. -We recommend that you follow [Semantic Versioning](http://semver.org/) while bumping your theme-version. +3. To release a new version of your theme, update the version number in the gemspec file, ( `jekyll-theme-awesome.gemspec` in this example ), and then repeat Steps 1 & 2 above. We recommend that you follow [Semantic Versioning](http://semver.org/) while bumping your theme-version. diff --git a/docs/_docs/troubleshooting.md b/docs/_docs/troubleshooting.md index 191953ec..d5f29671 100644 --- a/docs/_docs/troubleshooting.md +++ b/docs/_docs/troubleshooting.md @@ -1,5 +1,4 @@ --- -layout: docs title: Troubleshooting permalink: /docs/troubleshooting/ --- @@ -37,6 +36,15 @@ If you installed the above - specifically on Fedora 23 - but the extensions woul sudo dnf install redhat-rpm-config ``` +On Ubuntu if you get stuck after `bundle exec jekyll serve` and see error +messages like `Could not locate Gemfile` or `.bundle/ directory`, it's likely +because all requirements have not been fully met. Recent stock Ubuntu +distributions require the installation of both the `ruby` and `ruby-all-dev` +packages: + +```sh +sudo apt-get install ruby ruby-all-dev +``` On [NearlyFreeSpeech](https://www.nearlyfreespeech.net/) you need to run the following commands before installing Jekyll: @@ -181,10 +189,10 @@ That is: defaults are overridden by options specified in `_config.yml`, and flags specified at the command-line will override all other settings specified elsewhere. -If you encounter an error in building the site, with the error message -"'0000-00-00-welcome-to-jekyll.markdown.erb' does not have a valid date in the -YAML front matter." try including the line `exclude: [vendor]` -in `_config.yml`. +If you encounter an error in building the site, with the error message +"'0000-00-00-welcome-to-jekyll.markdown.erb' does not have a valid date in the +YAML front matter." try including the line `exclude: [vendor]` +in `_config.yml`. ## Markup Problems diff --git a/docs/_docs/upgrading/0-to-2.md b/docs/_docs/upgrading/0-to-2.md index 9de63455..5f9d2320 100644 --- a/docs/_docs/upgrading/0-to-2.md +++ b/docs/_docs/upgrading/0-to-2.md @@ -1,5 +1,4 @@ --- -layout: docs title: Upgrading from 0.x to 2.x permalink: /docs/upgrading/0-to-2/ --- diff --git a/docs/_docs/upgrading/2-to-3.md b/docs/_docs/upgrading/2-to-3.md index 0d145b9c..a378d2f7 100644 --- a/docs/_docs/upgrading/2-to-3.md +++ b/docs/_docs/upgrading/2-to-3.md @@ -1,5 +1,4 @@ --- -layout: docs title: Upgrading from 2.x to 3.x permalink: /docs/upgrading/2-to-3/ --- diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index e6f1a0db..f4123aed 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -1,5 +1,4 @@ --- -layout: docs title: Basic Usage permalink: /docs/usage/ --- @@ -97,5 +96,12 @@ $ jekyll build --source _source --destination _deploy For more about the possible configuration options, see the [configuration](../configuration/) page. +
+
Call for help
+

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

+
+ If you're interested in browsing these docs on-the-go, install the `jekyll-docs` gem and run `jekyll docs` in your terminal. diff --git a/docs/_docs/variables.md b/docs/_docs/variables.md index 1d4e2091..f32bddd6 100644 --- a/docs/_docs/variables.md +++ b/docs/_docs/variables.md @@ -1,5 +1,4 @@ --- -layout: docs title: Variables permalink: /docs/variables/ --- diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index ab536382..d3a0fa64 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -1,5 +1,4 @@ --- -layout: docs title: Jekyll on Windows permalink: /docs/windows/ --- @@ -16,6 +15,10 @@ A quick way to install Jekyll is to follow the [installation instructions by Dav 2. Install Ruby via Chocolatey: `choco install ruby -y` 3. Reopen a command prompt and install Jekyll: `gem install jekyll` +Updates in the infrastructure of Ruby may cause SSL errors when attempting to use `gem install` with versions of the RubyGems package older than 2.6. (The RubyGems package installed via the Chocolatey tool is version 2.3) If you have installed an older version, you can update the RubyGems package using the directions [here][ssl-certificate-update]. + +[ssl-certificate-update]: http://guides.rubygems.org/ssl-certificate-update/#installing-using-update-packages + For a more conventional way of installing Jekyll you can follow this [complete guide to install Jekyll 3 on Windows by Sverrir Sigmundarson][windows-installjekyll3]. [windows-installjekyll3]: https://labs.sverrirs.com/jekyll/ @@ -36,10 +39,10 @@ $ chcp 65001 ## Timezone Management -Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00. +Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00. Though Windows users could alternatively define their blog's timezone by setting the key to use POSIX format of defining timezones, it wasn't as user-friendly when it came to having the clock altered to changing DST-rules. -Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). +Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). While 'new' blogs created with Jekyll v3.4 and greater, will have the following added to their 'Gemfile' by default, existing sites *will* have to update their 'Gemfile' (and installed) to enable development on Windows: ```ruby diff --git a/docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown b/docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown index 538cb565..ae5d3f9c 100644 --- a/docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown +++ b/docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.0 Released" date: "2013-05-06 02:12:52 +0200" author: parkr diff --git a/docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown b/docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown index 90edcc26..5b7a2c35 100644 --- a/docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown +++ b/docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.1 Released" date: "2013-05-08 23:46:11 +0200" author: parkr diff --git a/docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown b/docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown index 2a2b97e6..e5466362 100644 --- a/docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown +++ b/docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.2 Released" date: "2013-05-12 14:45:00 +0200" author: parkr diff --git a/docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown b/docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown index 566ae668..88f8ad41 100644 --- a/docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown +++ b/docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.3 Released" date: "2013-06-07 21:02:13 +0200" author: parkr diff --git a/docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown b/docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown index 12b3d921..8d00b98b 100644 --- a/docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown +++ b/docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.1.0 Released" date: "2013-07-14 19:38:02 +0200" author: parkr diff --git a/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown b/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown index 6741a89e..90b81847 100644 --- a/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown +++ b/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.1.1 Released" date: "2013-07-24 22:24:14 +0200" author: parkr diff --git a/docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown b/docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown index 635d0e6c..2e234c0e 100644 --- a/docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown +++ b/docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.4 Released" date: "2013-07-25 09:08:38 +0200" author: mattr- diff --git a/docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown b/docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown index ed16ca71..f308ca12 100644 --- a/docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown +++ b/docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.1.2 Released" date: "2013-07-25 09:08:38 +0200" author: parkr diff --git a/docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown b/docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown index ae5448c2..76090527 100644 --- a/docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown +++ b/docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.2.0 Released" date: "2013-09-06 22:02:41 -0400" author: parkr diff --git a/docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown b/docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown index 832dbd06..5f759e20 100644 --- a/docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown +++ b/docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.2.1 Released' date: 2013-09-14 20:46:50 -0400 author: parkr diff --git a/docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown b/docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown index 1e3e44ce..65e98700 100644 --- a/docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown +++ b/docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.3.0.rc1 Released' date: 2013-10-28 20:14:39 -0500 author: mattr- diff --git a/docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown b/docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown index 1e325117..f70408cd 100644 --- a/docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown +++ b/docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.3.0 Released' date: 2013-11-04 21:46:02 -0600 author: mattr- diff --git a/docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown b/docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown index 4b4c37d5..baf8dea0 100644 --- a/docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown +++ b/docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.3.1 Released' date: 2013-11-26 19:52:20 -0600 author: mattr- diff --git a/docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown b/docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown index d7a0c14f..1b9d4b7a 100644 --- a/docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown +++ b/docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.4.0 Released' date: 2013-12-07 13:55:28 -0600 author: mattr- diff --git a/docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown b/docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown index 63407158..9d754857 100644 --- a/docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown +++ b/docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.4.1 Released' date: 2013-12-09 20:44:13 -0600 author: mattr- diff --git a/docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown b/docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown index afc92147..e4329adc 100644 --- a/docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown +++ b/docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.4.2 Released' date: 2013-12-16 19:48:13 -0500 author: parkr diff --git a/docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown b/docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown index a97bcec4..8338ffb6 100644 --- a/docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown +++ b/docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.4.3 Released' date: 2014-01-13 17:43:32 -0800 author: benbalter diff --git a/docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown b/docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown index 5b103dc2..717424ab 100644 --- a/docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown +++ b/docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.5.0 Released' date: 2014-03-24 20:37:59 -0400 author: parkr diff --git a/docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown b/docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown index e8a4096a..2105ad4d 100644 --- a/docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown +++ b/docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.5.1 Released' date: 2014-03-27 22:43:48 -0400 author: parkr diff --git a/docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown b/docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown index 82555514..af2a6774 100644 --- a/docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown +++ b/docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll turns 2.0.0' author: parkr version: 2.0.0 diff --git a/docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown b/docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown index ac5e9d75..e98e32c8 100644 --- a/docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown +++ b/docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.0.3 Released' date: 2014-05-08 22:43:17 -0400 author: parkr diff --git a/docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown b/docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown index 5ba126d2..8ef37c54 100644 --- a/docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown +++ b/docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Pick Up your $1 Jekyll Sticker' date: 2014-06-04 15:46:53 -0400 author: parkr diff --git a/docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown b/docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown index 82d01a18..c3fd4bb6 100644 --- a/docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown +++ b/docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll Turns 21! Err... I mean 2.1.0.' date: 2014-06-28 17:26:59 -0400 author: parkr diff --git a/docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown b/docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown index 81423539..c73a055d 100644 --- a/docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown +++ b/docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.1.1 Released' date: 2014-07-01 20:16:43 -0400 author: parkr diff --git a/docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown b/docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown index ca7aee48..6b726f17 100644 --- a/docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown +++ b/docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.2.0 Released' date: 2014-07-29 18:59:13 -0400 author: parkr diff --git a/docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown b/docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown index 63fe2b45..07afc3c0 100644 --- a/docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown +++ b/docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.3.0 Released' date: 2014-08-10 20:38:34 -0400 author: parkr diff --git a/docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown b/docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown index e8dda676..11cb738e 100644 --- a/docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown +++ b/docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'A Wild Jekyll 2.4.0 Appeared!' date: 2014-09-09 21:10:33 -0700 author: parkr diff --git a/docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown b/docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown index cc5de7c0..012b6155 100644 --- a/docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown +++ b/docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll's Mid-Life Crisis (Or, Jekyll turns 2.5.0)" date: 2014-11-05 10:48:22 -0800 author: parkr diff --git a/docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown b/docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown index 3237e48d..2f6e3b51 100644 --- a/docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown +++ b/docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.5.1 Released' date: 2014-11-09 09:47:52 -0800 author: parkr diff --git a/docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown b/docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown index 3eab8998..cff18248 100644 --- a/docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown +++ b/docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.5.2 Released' date: 2014-11-12 18:49:08 -0800 author: parkr diff --git a/docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md b/docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md index 1951f0a4..51f55028 100644 --- a/docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md +++ b/docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Alfred Xing has joined the Jekyll core team' date: 2014-12-17 11:16:21 -0800 author: parkr diff --git a/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown b/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown index 7743fd8e..491007cd 100644 --- a/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown +++ b/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll Release for the Holidays! v2.5.3 Out' date: 2014-12-22 09:03:30 -0500 author: parkr diff --git a/docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown b/docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown index ed273f9d..eee8d5e7 100644 --- a/docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown +++ b/docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll Meet & Greet at GitHub HQ" date: "2015-01-20 19:23:12 -0800" author: parkr diff --git a/docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown b/docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown index 9ba83b04..c63f184b 100644 --- a/docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown +++ b/docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.0.beta1 Released' date: 2015-01-24 00:42:31 -0800 author: parkr diff --git a/docs/_posts/2015-02-26-introducing-jekyll-talk.markdown b/docs/_posts/2015-02-26-introducing-jekyll-talk.markdown index 90863c12..468ae4c8 100644 --- a/docs/_posts/2015-02-26-introducing-jekyll-talk.markdown +++ b/docs/_posts/2015-02-26-introducing-jekyll-talk.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Join the Discussion at Jekyll Talk' date: 2015-02-26 21:06:51 -0800 author: alfredxing @@ -12,4 +11,4 @@ The forum was set up by [@envygeeks](https://github.com/envygeeks) to build a co There's already been a lot of interesting topics, including a [site showcase](https://talk.jekyllrb.com/t/showcase-sites-made-using-jekyll/18) and [a poll for Jekyll 3.0 priorities](https://talk.jekyllrb.com/t/poll-installation-priorities-for-3-0/106/9). -Come join the fun! \ No newline at end of file +Come join the fun! diff --git a/docs/_posts/2015-10-26-jekyll-3-0-released.markdown b/docs/_posts/2015-10-26-jekyll-3-0-released.markdown index e7cf9db4..37d075c4 100644 --- a/docs/_posts/2015-10-26-jekyll-3-0-released.markdown +++ b/docs/_posts/2015-10-26-jekyll-3-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0 Released' date: 2015-10-26 15:37:30 -0700 author: parkr diff --git a/docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown b/docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown index 71412c6b..3eb3cb71 100644 --- a/docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown +++ b/docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.1 Released' date: 2015-11-17 22:04:39 -0800 author: parkr diff --git a/docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown b/docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown index 88f8888f..c12cde34 100644 --- a/docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown +++ b/docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.2 Released' date: 2016-01-20 14:08:18 -0800 author: parkr diff --git a/docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown b/docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown index 42768b9f..7e91aa1d 100644 --- a/docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown +++ b/docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.0 Released' date: 2016-01-24 13:16:12 -0800 author: parkr diff --git a/docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown b/docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown index b5932b0a..cddfbf26 100644 --- a/docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown +++ b/docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.1 Released' date: 2016-01-28 17:21:50 -0800 author: parkr diff --git a/docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown b/docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown index 0c260cc6..442dfeb9 100644 --- a/docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown +++ b/docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.3 Released' date: 2016-02-08 10:39:08 -0800 author: parkr diff --git a/docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown b/docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown index 77544510..807621f6 100644 --- a/docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown +++ b/docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.2 Released!' date: 2016-02-19 15:24:00 -0800 author: parkr diff --git a/docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md b/docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md index d735b682..9d806049 100644 --- a/docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md +++ b/docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md @@ -1,7 +1,6 @@ --- title: Making it easier to contribute to Jekyll description: We've made it easier to contribute to Jekyll by updating our contributing documentation and introducing Jekyll Affinity Teams, teams dedicated to specific aspects of the project. -layout: news_item author: benbalter categories: [community] --- diff --git a/docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown b/docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown index d2cc4ec6..9aa9b822 100644 --- a/docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown +++ b/docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.4 Released' date: 2016-04-19 10:26:12 -0700 author: parkr diff --git a/docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown b/docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown index cd478e22..6b0892ac 100644 --- a/docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown +++ b/docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.3 Released' date: 2016-04-19 10:26:16 -0700 author: parkr @@ -15,4 +14,3 @@ v3.1.3 is a patch release which fixes the follow two issues: Both of these issues have been resolved. For more information, check out [the full history](/docs/history/#v3-1-3). Happy Jekylling! - diff --git a/docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown b/docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown index 9696713a..5ac21545 100644 --- a/docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown +++ b/docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.5 Released' date: 2016-04-26 17:40:44 -0700 author: parkr diff --git a/docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown b/docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown index 161d4746..738fc12e 100644 --- a/docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown +++ b/docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.4 "Stability Sam" Released' date: 2016-05-18 16:50:37 -0700 author: parkr diff --git a/docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown b/docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown index c341b37b..0ca981a6 100644 --- a/docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown +++ b/docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.5 Released' date: 2016-05-18 21:35:27 -0700 author: parkr diff --git a/docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown b/docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown index 45e7312f..e31951eb 100644 --- a/docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown +++ b/docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.6 Released' date: 2016-05-19 12:48:14 -0700 author: parkr diff --git a/docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown b/docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown index 0f4ce2de..c3d01cdd 100644 --- a/docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown +++ b/docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll's Google Summer of Code Project: The CMS You Always Wanted" date: "2016-06-03 13:21:02 -0700" author: parkr diff --git a/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown b/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown index 2e62cc32..4cf4b6f7 100644 --- a/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown +++ b/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll turns 3.2' date: 2016-07-26 15:06:49 -0700 author: parkr diff --git a/docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown b/docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown index f4d17e04..f2bdaec8 100644 --- a/docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown +++ b/docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.2.1 Released with Fix for Windows' date: 2016-08-02 13:20:11 -0700 author: parkr diff --git a/docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown b/docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown index 1f6fa154..e256a5c7 100644 --- a/docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown +++ b/docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll Admin Initial Release" date: "2016-08-25 09:50:00 +0300" author: mertkahyaoglu diff --git a/docs/_posts/2016-10-06-jekyll-3-3-is-here.md b/docs/_posts/2016-10-06-jekyll-3-3-is-here.md index 0b51e31e..8c756ef7 100644 --- a/docs/_posts/2016-10-06-jekyll-3-3-is-here.md +++ b/docs/_posts/2016-10-06-jekyll-3-3-is-here.md @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.3 is here with better theme support, new URL filters, and tons more' date: 2016-10-06 11:10:38 -0700 author: parkr diff --git a/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown b/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown index a5a88376..0a357ea2 100644 --- a/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown +++ b/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.3.1 Released' date: 2016-11-14 14:29:59 -0800 author: parkr diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown new file mode 100644 index 00000000..37edb7bc --- /dev/null +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -0,0 +1,42 @@ +--- +title: 'Jekyll turns 3.4.0' +date: 2017-01-18 14:19:13 -0500 +author: parkr +version: 3.4.0 +categories: [release] +--- + +Hey there! We have a quick update of Jekyll for you to enjoy this January. +Packed full of bug fixes as usual, thanks to the tireless efforts of our +exceptional Jekyll community. Three changes to call out: + +1. If you're a big fan of [`where_by_exp`](/docs/templates/#filters), you'll be an +even bigger fan of [`group_by_exp`](/docs/templates/#filters). +2. Using a custom timezone in Jekyll on Windows? Yeah, sorry that hasn't ever worked + properly. We made it possible to accurately [set the timezone using IANA + timezone codes](https://jekyllrb.com/docs/windows/#timezone-management). +3. Documentation has been improved, notably on themes, includes and permalinks. + +And [lots and lots more!](/docs/history/#v3-4-0) + +This update was made possible by the dedicated efforts of our excellent +contributors: Ajay Karwal, Alexey Rogachev, Ashwin Maroli, +BlueberryFoxtrot, Chase, Chayoung You, Dean Attali, Dmitrii Evdokimov, Don +Denton, Eldritch Cheese, Fabrice Laporte, Florian Thomas, Frank +Taillandier, Hugo, Ivan Dmitrievsky, Joel Meyer-Hamme, Josh Habdas, Kenton +Hansen, Kevin Wojniak, Kurt Anderson, Longwelwind, Max Chadwick, Nicolas +Hoizey, Nursen, Parker Moore, Pat Hawks, Purplecarrot, Ricardo N Feliciano, +Rob Crocombe, Roger Ogden, Skylar Challand, Thiago Arrais, Tim Banks, Tom +Johnson, Tunghsiao Liu, XhmikosR, Zlatan Vasović, alexmalik, brainscript, +kimbaudi, muratayusuke, penny, and yoostk. + +As always, if you encounter bugs, please do [search the issues]({{ site.repository }}/issues) +and [file an issue]({{ site.repository }}/issues/new) if you aren't able to +find a resolution. We also have [our Jekyll Talk +forum](https://talk.jekyllrb.com) for those of you with general questions +about how to accomplish certain tasks with Jekyll. + +We have some exciting updates in store for v3.5, and we're hard at work on +those already. + +Happy Jekylling! diff --git a/docs/latest_version.txt b/docs/latest_version.txt index bea438e9..18091983 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.3.1 +3.4.0 diff --git a/features/rendering.feature b/features/rendering.feature index 5031ef06..fbe9ce57 100644 --- a/features/rendering.feature +++ b/features/rendering.feature @@ -12,6 +12,15 @@ Feature: Rendering Then I should get a non-zero exit-status And I should see "Liquid Exception" in the build output + Scenario: When receiving bad Liquid in included file + Given I have a _includes directory + And I have a "_includes/invalid.html" file that contains "{% INVALID %}" + And I have a "index.html" page with layout "simple" that contains "{% include invalid.html %}" + And I have a simple layout that contains "{{ content }}" + When I run jekyll build + Then I should get a non-zero exit-status + And I should see "Liquid Exception.*Unknown tag 'INVALID' in.*_includes/invalid\.html" in the build output + Scenario: Render Liquid and place in layout Given I have a "index.html" page with layout "simple" that contains "Hi there, Jekyll {{ jekyll.environment }}!" And I have a simple layout that contains "{{ content }}Ahoy, indeed!" diff --git a/features/support/formatter.rb b/features/support/formatter.rb index 22237010..79d14664 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -16,7 +16,7 @@ module Jekyll :pending => "\u203D".yellow, :undefined => "\u2718".red, :passed => "\u2714".green, - :skipped => "\u203D".blue + :skipped => "\u203D".blue, }.freeze # diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 1340808a..06d768fe 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -1,6 +1,5 @@ require "fileutils" require "jekyll" -require "open3" require "time" require "safe_yaml/load" @@ -103,26 +102,18 @@ def run_jekyll(args) end # - -# rubocop:disable Metrics/AbcSize def run_in_shell(*args) - i, o, e, p = Open3.popen3(*args) - out = o.read.strip - err = e.read.strip + p, output = Jekyll::Utils::Exec.run(*args) - [i, o, e].each(&:close) - - File.write(Paths.status_file, p.value.exitstatus) + File.write(Paths.status_file, p.exitstatus) 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}" + f.puts output + f.puts "EXIT STATUS: #{p.exitstatus}" end - p.value + p end -# rubocop:enable Metrics/AbcSize # @@ -142,7 +133,7 @@ def location(folder, direction) end [before || ".", - after || "."] + after || ".",] end # @@ -160,7 +151,7 @@ def seconds_agnostic_datetime(datetime = Time.now) [ Regexp.escape(date), "#{time}:\\d{2}", - Regexp.escape(zone) + Regexp.escape(zone), ] \ .join("\\ ") end diff --git a/jekyll.gemspec b/jekyll.gemspec index 734df2e4..a5539209 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -1,42 +1,42 @@ # coding: utf-8 -lib = File.expand_path('../lib', __FILE__) +lib = File.expand_path("../lib", __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'jekyll/version' +require "jekyll/version" Gem::Specification.new do |s| s.specification_version = 2 if s.respond_to? :specification_version= - s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version= - s.rubygems_version = '2.2.2' - s.required_ruby_version = '>= 2.0.0' + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.rubygems_version = "2.2.2" + s.required_ruby_version = ">= 2.0.0" - s.name = 'jekyll' + s.name = "jekyll" s.version = Jekyll::VERSION - s.license = 'MIT' + s.license = "MIT" - s.summary = 'A simple, blog aware, static site generator.' - s.description = 'Jekyll is a simple, blog aware, static site generator.' + s.summary = "A simple, blog aware, static site generator." + s.description = "Jekyll is a simple, blog aware, static site generator." - s.authors = ['Tom Preston-Werner'] - s.email = 'tom@mojombo.com' - s.homepage = 'https://github.com/jekyll/jekyll' + s.authors = ["Tom Preston-Werner"] + s.email = "tom@mojombo.com" + s.homepage = "https://github.com/jekyll/jekyll" all_files = `git ls-files -z`.split("\x0") - s.files = all_files.grep(%r{^(exe|lib)/|^.rubocop.yml$}) - s.executables = all_files.grep(%r{^exe/}) { |f| File.basename(f) } + s.files = all_files.grep(%r!^(exe|lib)/|^.rubocop.yml$!) + s.executables = all_files.grep(%r!^exe/!) { |f| File.basename(f) } s.bindir = "exe" - s.require_paths = ['lib'] + s.require_paths = ["lib"] - s.rdoc_options = ['--charset=UTF-8'] - s.extra_rdoc_files = %w[README.markdown LICENSE] + s.rdoc_options = ["--charset=UTF-8"] + s.extra_rdoc_files = %w(README.markdown LICENSE) - s.add_runtime_dependency('liquid', '~> 3.0') - s.add_runtime_dependency('kramdown', '~> 1.3') - s.add_runtime_dependency('mercenary', '~> 0.3.3') - s.add_runtime_dependency('safe_yaml', '~> 1.0') - s.add_runtime_dependency('colorator', '~> 1.0') - s.add_runtime_dependency('rouge', '~> 1.7') - s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0') - s.add_runtime_dependency('jekyll-watch', '~> 1.1') - s.add_runtime_dependency("pathutil", "~> 0.9") - s.add_runtime_dependency('addressable', '~> 2.4') + s.add_runtime_dependency("addressable", "~> 2.4") + s.add_runtime_dependency("colorator", "~> 1.0") + s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") + s.add_runtime_dependency("jekyll-watch", "~> 1.1") + s.add_runtime_dependency("kramdown", "~> 1.3") + s.add_runtime_dependency("liquid", "~> 4.0") + s.add_runtime_dependency("mercenary", "~> 0.3.3") + s.add_runtime_dependency("pathutil", "~> 0.9") + s.add_runtime_dependency("rouge", "~> 1.7") + s.add_runtime_dependency("safe_yaml", "~> 1.0") end diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index c7f387df..59004c96 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -35,7 +35,7 @@ module Jekyll fsnotify_buggy?(site), !deprecated_relative_permalinks(site), !conflicting_urls(site), - !urls_only_differ_by_case(site) + !urls_only_differ_by_case(site), ].all? end diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 561ae861..144fddf7 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -125,23 +125,23 @@ RUBY # unless the user opts to generate a blank blog or skip 'bundle install'. def after_install(path, options = {}) - Jekyll.logger.info "New jekyll site installed in #{path.cyan}." - Jekyll.logger.info "Bundle install skipped." if options["skip-bundle"] - unless options["blank"] || options["skip-bundle"] bundle_install path end + + Jekyll.logger.info "New jekyll site installed in #{path.cyan}." + Jekyll.logger.info "Bundle install skipped." if options["skip-bundle"] end def bundle_install(path) Jekyll::External.require_with_graceful_fail "bundler" Jekyll.logger.info "Running bundle install in #{path.cyan}..." Dir.chdir(path) do - if ENV["CI"] - system("bundle", "install", "--quiet") - else - system("bundle", "install") + process, output = Jekyll::Utils::Exec.run("bundle", "install") + output.to_s.each_line do |line| + Jekyll.logger.info("Bundler:".green, line.strip) unless line.to_s.empty? end + raise SystemExit unless process.success? end end end diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index e0da4807..16913595 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -10,9 +10,9 @@ module Jekyll "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], "port" => ["-P", "--port [PORT]", "Port to listen on"], "show_dir_listing" => ["--show-dir-listing", - "Show a directory listing instead of loading your index file."], + "Show a directory listing instead of loading your index file.",], "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", - "Skips the initial site build which occurs before the server is started."] + "Skips the initial site build which occurs before the server is started.",], }.freeze # @@ -88,7 +88,7 @@ module Jekyll index.rhtml index.cgi index.xml - ) + ), } opts[:DirectoryIndex] = [] if opts[:JekyllOptions]["show_dir_listing"] @@ -116,8 +116,8 @@ module Jekyll WEBrick::Config::FileHandler.merge({ :FancyIndexing => true, :NondisclosureName => [ - ".ht*", "~*" - ] + ".ht*", "~*", + ], }) end @@ -139,7 +139,7 @@ module Jekyll :prefix => ssl_enabled ? "https" : "http", :address => address, :port => port, - :baseurl => baseurl ? "#{baseurl}/" : "" + :baseurl => baseurl ? "#{baseurl}/" : "", }) end diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index d0dd22af..3ae5cf32 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -6,7 +6,7 @@ module Jekyll class Servlet < WEBrick::HTTPServlet::FileHandler DEFAULTS = { "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ - "no-store, no-cache, must-revalidate" + "no-store, no-cache, must-revalidate", }.freeze def initialize(server, root, callbacks) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 8dc1807d..27e245e4 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -58,15 +58,15 @@ module Jekyll "defaults" => [], "liquid" => { - "error_mode" => "warn" + "error_mode" => "warn", }, "rdiscount" => { - "extensions" => [] + "extensions" => [], }, "redcarpet" => { - "extensions" => [] + "extensions" => [], }, "kramdown" => { @@ -76,8 +76,8 @@ module Jekyll "smart_quotes" => "lsquo,rsquo,ldquo,rdquo", "input" => "GFM", "hard_wrap" => false, - "footnote_nr" => 1 - } + "footnote_nr" => 1, + }, }.map { |k, v| [k, v.freeze] }].freeze class << self diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index dd71c6c1..a7252f1a 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -11,7 +11,7 @@ module Jekyll "line_numbers" => "inline", "line_number_start" => 1, "tab_width" => 4, - "wrap" => "div" + "wrap" => "div", }.freeze def initialize(config) diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index b5ec99f5..aa170feb 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -21,7 +21,7 @@ class Jekyll::Converters::Markdown::RedcarpetParser code, { :lexer => lang, - :options => { :encoding => "utf-8" } + :options => { :encoding => "utf-8" }, } ), lang diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index ad5884ef..fecd5828 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -196,7 +196,7 @@ module Jekyll @url = URL.new({ :template => url_template, :placeholders => url_placeholders, - :permalink => permalink + :permalink => permalink, }).to_s end @@ -469,14 +469,14 @@ module Jekyll "category", "categories" ) - ).map(&:to_s).flatten.uniq + ).map(&:to_s).flatten.uniq, }) end private def populate_tags merge_data!({ - "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten + "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten, }) end diff --git a/lib/jekyll/drops/jekyll_drop.rb b/lib/jekyll/drops/jekyll_drop.rb index 50163d74..e3d2eb38 100644 --- a/lib/jekyll/drops/jekyll_drop.rb +++ b/lib/jekyll/drops/jekyll_drop.rb @@ -20,7 +20,7 @@ module Jekyll def to_h @to_h ||= { "version" => version, - "environment" => environment + "environment" => environment, } end diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index 66366810..97b41806 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -19,6 +19,10 @@ module Jekyll end end + def key?(key) + (@obj.collections.key?(key) && key != "posts") || super + end + def posts @site_posts ||= @obj.posts.docs.sort { |a, b| b <=> a } end diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index 5f3431d8..e4187d42 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -2,7 +2,7 @@ module Jekyll class EntryFilter attr_reader :site SPECIAL_LEADING_CHARACTERS = [ - ".", "_", "#", "~" + ".", "_", "#", "~", ].freeze def initialize(site, base_directory = nil) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 43e01df1..0393ea24 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -1,4 +1,4 @@ -require "uri" +require "addressable/uri" require "json" require "date" require "liquid" @@ -152,7 +152,7 @@ module Jekyll # # Returns the escaped String. def uri_escape(input) - URI.escape(input) + Addressable::URI.encode(input) end # Replace any whitespace in the input string with a single space @@ -280,10 +280,11 @@ module Jekyll end end - def pop(array, input = 1) + def pop(array, num = 1) return array unless array.is_a?(Array) + num = Liquid::Utils.to_integer(num) new_ary = array.dup - new_ary.pop(input.to_i || 1) + new_ary.pop(num) new_ary end @@ -294,10 +295,11 @@ module Jekyll new_ary end - def shift(array, input = 1) + def shift(array, num = 1) return array unless array.is_a?(Array) + num = Liquid::Utils.to_integer(num) new_ary = array.dup - new_ary.shift(input.to_i || 1) + new_ary.shift(num) new_ary end @@ -310,11 +312,11 @@ module Jekyll def sample(input, num = 1) return input unless input.respond_to?(:sample) - n = num.to_i rescue 1 - if n == 1 + num = Liquid::Utils.to_integer(num) rescue 1 + if num == 1 input.sample else - input.sample(n) + input.sample(num) end end @@ -345,19 +347,12 @@ module Jekyll private def time(input) - case input - when Time - input.clone - when Date - input.to_time - when String - Time.parse(input) rescue Time.at(input.to_i) - when Numeric - Time.at(input) - else + date = Liquid::Utils.to_date(input) + unless date.respond_to?(:to_time) raise Errors::InvalidDateError, "Invalid Date: '#{input.inspect}' is not a valid datetime." - end.localtime + end + date.to_time.localtime end private @@ -402,9 +397,11 @@ module Jekyll operator = parser.consume?(:comparison) condition = if operator - Liquid::Condition.new(left_expr, operator, parser.expression) + Liquid::Condition.new(Liquid::Expression.parse(left_expr), + operator, + Liquid::Expression.parse(parser.expression)) else - Liquid::Condition.new(left_expr) + Liquid::Condition.new(Liquid::Expression.parse(left_expr)) end parser.consume(:end_of_string) diff --git a/lib/jekyll/filters/grouping_filters.rb b/lib/jekyll/filters/grouping_filters.rb index a16901d9..c1029256 100644 --- a/lib/jekyll/filters/grouping_filters.rb +++ b/lib/jekyll/filters/grouping_filters.rb @@ -40,7 +40,7 @@ module Jekyll private def parse_expression(str) - Liquid::Variable.new(str, {}) + Liquid::Variable.new(str, Liquid::ParseContext.new) end private @@ -54,7 +54,7 @@ module Jekyll array << { "name" => item.first, "items" => item.last, - "size" => item.last.size + "size" => item.last.size, } end end diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index 9083b27a..5f21b5f6 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 @@ -17,26 +17,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 @@ -64,7 +64,7 @@ module Jekyll :post_init => [], :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [], } unless @registry[owner][event] diff --git a/lib/jekyll/log_adapter.rb b/lib/jekyll/log_adapter.rb index 70173b91..965f3295 100644 --- a/lib/jekyll/log_adapter.rb +++ b/lib/jekyll/log_adapter.rb @@ -6,7 +6,7 @@ module Jekyll :debug => ::Logger::DEBUG, :info => ::Logger::INFO, :warn => ::Logger::WARN, - :error => ::Logger::ERROR + :error => ::Logger::ERROR, }.freeze # Public: Create a new instance of a log writer diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 7619966d..324a867d 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -98,7 +98,7 @@ module Jekyll @url ||= URL.new({ :template => template, :placeholders => url_placeholders, - :permalink => permalink + :permalink => permalink, }).to_s end @@ -108,7 +108,7 @@ module Jekyll { :path => @dir, :basename => basename, - :output_ext => output_ext + :output_ext => output_ext, } end diff --git a/lib/jekyll/plugin.rb b/lib/jekyll/plugin.rb index bcc1bf7e..4680be32 100644 --- a/lib/jekyll/plugin.rb +++ b/lib/jekyll/plugin.rb @@ -5,7 +5,7 @@ module Jekyll :highest => 100, :lowest => -100, :normal => 0, - :high => 10 + :high => 10, }.freeze # diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index 0afbad61..1083d62b 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -7,20 +7,20 @@ module Jekyll @entry_filter = EntryFilter.new(site) end - # Read all the files in //_drafts and create a new Draft - # object with each one. + # Read all the files in and adds them to @content # # dir - The String relative path of the directory to read. # - # Returns nothing. + # Returns @content, a Hash of the .yaml, .yml, + # .json, and .csv files in the base directory def read(dir) base = site.in_source_dir(dir) read_data_to(base, @content) @content end - # Read and parse all yaml files under and add them to the - # variable. + # Read and parse all .yaml, .yml, .json, and .csv + # files under and add them to the variable. # # dir - The string absolute path of the directory to read. # data - The variable to which data will be added. @@ -54,7 +54,7 @@ module Jekyll when ".csv" CSV.read(path, { :headers => true, - :encoding => site.config["encoding"] + :encoding => site.config["encoding"], }).map(&:to_hash) else SafeYAML.load_file(path) diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index 123709e7..70688875 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -57,7 +57,7 @@ module Jekyll path = @site.in_source_dir(File.join(dir, magic_dir, entry)) Document.new(path, { :site => @site, - :collection => @site.posts + :collection => @site.posts, }) end.reject(&:nil?) end diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 4d89da2e..09ff309a 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -40,7 +40,7 @@ module Jekyll metadata[path] = { "mtime" => File.mtime(path), - "deps" => [] + "deps" => [], } cache[path] = true end diff --git a/lib/jekyll/related_posts.rb b/lib/jekyll/related_posts.rb index cde1742c..3526a73b 100644 --- a/lib/jekyll/related_posts.rb +++ b/lib/jekyll/related_posts.rb @@ -26,15 +26,15 @@ module Jekyll def build_index self.class.lsi ||= begin lsi = ClassifierReborn::LSI.new(:auto_rebuild => false) - display("Populating LSI...") + Jekyll.logger.info("Populating LSI...") site.posts.docs.each do |x| lsi.add_item(x) end - display("Rebuilding index...") + Jekyll.logger.info("Rebuilding index...") lsi.build_index - display("") + Jekyll.logger.info("") lsi end end @@ -46,11 +46,5 @@ module Jekyll def most_recent_posts @most_recent_posts ||= (site.posts.docs.reverse - [post]).first(10) end - - def display(output) - $stdout.print("\n") - $stdout.print(Jekyll.logger.formatted_topic(output)) - $stdout.flush - end end end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 5797df77..87ea719b 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -435,7 +435,7 @@ module Jekyll private def configure_include_paths @includes_load_paths = Array(in_source_dir(config["includes_dir"].to_s)) - @includes_load_paths << theme.includes_path if self.theme + @includes_load_paths << theme.includes_path if theme && theme.includes_path end private diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 927a9b47..53b945d4 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -101,7 +101,7 @@ module Jekyll "name" => name, "extname" => extname, "modified_time" => modified_time, - "path" => File.join("", relative_path) + "path" => File.join("", relative_path), } end @@ -112,7 +112,7 @@ module Jekyll @collection.relative_directory.size..relative_path.size], :output_ext => "", :name => "", - :title => "" + :title => "", } end @@ -125,7 +125,7 @@ module Jekyll else ::Jekyll::URL.new({ :template => @collection.url_template, - :placeholders => placeholders + :placeholders => placeholders, }) end.to_s.gsub(%r!/$!, "") end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 43b0c62f..86b9171b 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -54,7 +54,7 @@ eos [:hl_lines, opts.fetch(:hl_lines, nil)], [:linenos, opts.fetch(:linenos, nil)], [:encoding, opts.fetch(:encoding, "utf-8")], - [:cssclass, opts.fetch(:cssclass, nil)] + [:cssclass, opts.fetch(:cssclass, nil)], ].reject { |f| f.last.nil? }] else opts @@ -125,7 +125,7 @@ eos def add_code_tag(code) code_attributes = [ "class=\"language-#{@lang.to_s.tr("+", "-")}\"", - "data-lang=\"#{@lang}\"" + "data-lang=\"#{@lang}\"", ].join(" ") "
"\
         "#{code.chomp}
" diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 67461750..08843047 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -112,8 +112,8 @@ eos def locate_include_file(context, file, safe) includes_dirs = tag_includes_dirs(context) includes_dirs.each do |dir| - path = File.join(dir, file) - return path if valid_include_file?(path, dir, safe) + path = File.join(dir.to_s, file.to_s) + return path if valid_include_file?(path, dir.to_s, safe) end raise IOError, "Could not locate the included file '#{file}' in any of "\ "#{includes_dirs}. Ensure it exists in one of those directories and, "\ @@ -155,15 +155,19 @@ eos if cached_partial.key?(path) cached_partial[path] else - cached_partial[path] = context.registers[:site] + unparsed_file = context.registers[:site] .liquid_renderer .file(path) - .parse(read_file(path, context)) + begin + cached_partial[path] = unparsed_file.parse(read_file(path, context)) + rescue Liquid::SyntaxError => ex + raise IncludeTagError.new(ex.message, path) + end end end def valid_include_file?(path, dir, safe) - !(outside_site_source?(path, dir, safe) || !File.exist?(path)) + !outside_site_source?(path, dir, safe) && File.file?(path) end def outside_site_source?(path, dir, safe) diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index 68a5eeab..f1c97e37 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -28,7 +28,7 @@ class Jekyll::ThemeBuilder def template_file(filename) [ root.join("theme_template", "#{filename}.erb"), - root.join("theme_template", filename.to_s) + root.join("theme_template", filename.to_s), ].find(&:exist?) end diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 4504574f..aefbebc9 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -1,4 +1,4 @@ -require "uri" +require "addressable/uri" # Public: Methods that generate a URL for a resource such as a Post or a Page. # @@ -145,7 +145,8 @@ module Jekyll # pct-encoded = "%" HEXDIG HEXDIG # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" # / "*" / "+" / "," / ";" / "=" - URI.escape(path, %r{[^a-zA-Z\d\-._~!$&'()*+,;=:@\/]}).encode("utf-8") + path = Addressable::URI.encode(path) + path.encode("utf-8").sub("#", "%23") end # Unescapes a URL path segment @@ -159,7 +160,7 @@ module Jekyll # # Returns the unescaped path. def self.unescape_path(path) - URI.unescape(path.encode("utf-8")) + Addressable::URI.unencode(path.encode("utf-8")) end end end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 23bacdab..3f91a2b0 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -2,8 +2,9 @@ module Jekyll module Utils extend self - autoload :Platforms, "jekyll/utils/platforms" autoload :Ansi, "jekyll/utils/ansi" + autoload :Exec, "jekyll/utils/exec" + autoload :Platforms, "jekyll/utils/platforms" autoload :WinTZ, "jekyll/utils/win_tz" # Constants for use in #slugify diff --git a/lib/jekyll/utils/ansi.rb b/lib/jekyll/utils/ansi.rb index 4be163c5..8bdd2322 100644 --- a/lib/jekyll/utils/ansi.rb +++ b/lib/jekyll/utils/ansi.rb @@ -17,7 +17,7 @@ module Jekyll :yellow => 33, :white => 37, :blue => 34, - :cyan => 36 + :cyan => 36, }.freeze # Strip ANSI from the current string. It also strips cursor stuff, diff --git a/lib/jekyll/utils/exec.rb b/lib/jekyll/utils/exec.rb new file mode 100644 index 00000000..33403dbc --- /dev/null +++ b/lib/jekyll/utils/exec.rb @@ -0,0 +1,25 @@ +require "open3" + +module Jekyll + module Utils + module Exec + extend self + + # Runs a program in a sub-shell. + # + # *args - a list of strings containing the program name and arguments + # + # Returns a Process::Status and a String of output in an array in + # that order. + def run(*args) + stdin, stdout, stderr, process = Open3.popen3(*args) + out = stdout.read.strip + err = stderr.read.strip + + [stdin, stdout, stderr].each(&:close) + [process.value, out + err] + end + + end + end +end diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index a01e787a..4babc208 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.3.1".freeze + VERSION = "3.4.0".freeze end diff --git a/lib/theme_template/LICENSE.txt.erb b/lib/theme_template/LICENSE.txt.erb index df803135..38a0eb4e 100644 --- a/lib/theme_template/LICENSE.txt.erb +++ b/lib/theme_template/LICENSE.txt.erb @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 <%= user_name %> +Copyright (c) <%= Time.now.year %> <%= user_name %> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/rake/docs.rake b/rake/docs.rake index aec162b5..fcae4f20 100644 --- a/rake/docs.rake +++ b/rake/docs.rake @@ -7,7 +7,7 @@ namespace :docs do desc "Release #{docs_name} v#{version}" task :release => :build do - unless `git branch` =~ /^\* master$/ + unless `git branch` =~ %r!^\* master$! puts "You must be on the master branch to release!" exit! end diff --git a/rake/release.rake b/rake/release.rake index a78690d8..832b5bb3 100644 --- a/rake/release.rake +++ b/rake/release.rake @@ -6,7 +6,7 @@ desc "Release #{name} v#{version}" task :release => :build do - unless `git branch` =~ /^\* master$/ + unless `git branch` =~ %r!^\* master$! puts "You must be on the master branch to release!" exit! end diff --git a/rake/site.rake b/rake/site.rake index 51978aed..63b04fc8 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -13,7 +13,7 @@ namespace :site do require "jekyll" browser_launched = false - Jekyll::Hooks.register :site, :post_write do |site| + Jekyll::Hooks.register :site, :post_write do |_site| next if browser_launched browser_launched = true Jekyll.logger.info "Opening in browser..." @@ -26,7 +26,7 @@ namespace :site do "source" => File.expand_path(docs_folder), "destination" => File.expand_path("#{docs_folder}/_site"), "watch" => true, - "serving" => true + "serving" => true, } Jekyll::Commands::Build.process(options) Jekyll::Commands::Serve.process(options) @@ -38,7 +38,7 @@ namespace :site do Jekyll::Commands::Build.process({ "profile" => true, "source" => File.expand_path(docs_folder), - "destination" => File.expand_path("#{docs_folder}/_site") + "destination" => File.expand_path("#{docs_folder}/_site"), }) end task :build => :generate @@ -48,7 +48,7 @@ namespace :site do Dir.chdir("#{docs_folder}/_sass") do sh 'curl "https://necolas.github.io/normalize.css/latest/normalize.css" -o "normalize.scss"' sh 'sass "normalize.scss":"_normalize.scss" --style compressed' - rm ['normalize.scss', Dir.glob('*.map')].flatten + rm ["normalize.scss", Dir.glob("*.map")].flatten end end @@ -60,41 +60,40 @@ namespace :site do desc "Create a nicely formatted history page for the jekyll site based on the repo history." task :history do - siteify_file('History.markdown', { "title" => "History" }) + siteify_file("History.markdown", { "title" => "History" }) end desc "Copy the Code of Conduct" task :conduct do front_matter = { "redirect_from" => "/conduct/index.html", - "editable" => false + "editable" => false, } - siteify_file('CONDUCT.markdown', front_matter) + siteify_file("CONDUCT.markdown", front_matter) end desc "Copy the contributing file" task :contributing do - siteify_file('.github/CONTRIBUTING.markdown', "title" => "Contributing") + siteify_file(".github/CONTRIBUTING.markdown", "title" => "Contributing") end desc "Write the site latest_version.txt file" task :version_file do - File.open("#{docs_folder}/latest_version.txt", 'wb') { |f| f.puts(version) } unless version =~ /(beta|rc|alpha)/i + File.open("#{docs_folder}/latest_version.txt", "wb") { |f| f.puts(version) } unless version =~ %r!(beta|rc|alpha)!i end namespace :releases do desc "Create new release post" - task :new, :version do |t, args| + task :new, :version do |_t, args| raise "Specify a version: rake site:releases:new['1.2.3']" unless args.version - today = Time.new.strftime('%Y-%m-%d') + today = Time.new.strftime("%Y-%m-%d") release = args.version.to_s - filename = "#{docs_folder}/_posts/#{today}-jekyll-#{release.split('.').join('-')}-released.markdown" + filename = "#{docs_folder}/_posts/#{today}-jekyll-#{release.split(".").join("-")}-released.markdown" File.open(filename, "wb") do |post| post.puts("---") - post.puts("layout: news_item") post.puts("title: 'Jekyll #{release} Released'") - post.puts("date: #{Time.new.strftime('%Y-%m-%d %H:%M:%S %z')}") + post.puts("date: #{Time.new.strftime("%Y-%m-%d %H:%M:%S %z")}") post.puts("author: ") post.puts("version: #{release}") post.puts("categories: [release]") diff --git a/script/proof b/script/proof index 1dd63a28..664e778d 100755 --- a/script/proof +++ b/script/proof @@ -32,4 +32,4 @@ bundle exec jekyll build -s $SOURCE -d $DESTINATION --trace # 3. msg "Proofing..." -time bundle exec htmlproof ./$DESTINATION --url-ignore $INGORE_HREFS $@ +time bundle exec htmlproofer ./$DESTINATION --url-ignore $INGORE_HREFS $@ diff --git a/script/stackprof b/script/stackprof index 1c833142..f78f11aa 100755 --- a/script/stackprof +++ b/script/stackprof @@ -10,13 +10,17 @@ esac export BENCHMARK=true command -v stackprof > /dev/null || script/bootstrap -TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})" +TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'docs'})" PROF_OUTPUT_FILE=tmp/stackprof-${STACKPROF_MODE}-$(date +%Y%m%d%H%M).dump +GC_BEFORE="puts 'GC Stats:'; puts JSON.pretty_generate(GC.stat); GC.disable" +GC_AFTER="puts 'GC Stats:'; GC.start(full_mark: true, immediate_sweep: false); puts JSON.pretty_generate(GC.stat);" + echo Stackprof Mode: $STACKPROF_MODE test -f "$PROF_OUTPUT_FILE" || { - bundle exec ruby -r./lib/jekyll -rstackprof \ - -e "StackProf.run(mode: :${STACKPROF_MODE}, interval: 100, out: '${PROF_OUTPUT_FILE}') { ${TEST_SCRIPT} }" + bundle exec ruby -r./lib/jekyll -rstackprof -rjson \ + -e "StackProf.run(mode: :${STACKPROF_MODE}, interval: 100, out: '${PROF_OUTPUT_FILE}') { ${GC_BEFORE}; ${TEST_SCRIPT}; ${GC_AFTER}; }" } -bundle exec stackprof $PROF_OUTPUT_FILE $@ +set -x +bundle exec stackprof $PROF_OUTPUT_FILE $@ --sort-total diff --git a/test/helper.rb b/test/helper.rb index 0c6935a0..74f2682e 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -10,8 +10,8 @@ def jruby? end if ENV["CI"] - require "codeclimate-test-reporter" - CodeClimate::TestReporter.start + require "simplecov" + SimpleCov.start else require File.expand_path("../simplecov_custom_profile", __FILE__) SimpleCov.start "gem" do @@ -46,7 +46,7 @@ include Jekyll Minitest::Reporters.use! [ Minitest::Reporters::DefaultReporter.new( :color => true - ) + ), ] module Minitest::Assertions @@ -62,6 +62,10 @@ module Minitest::Assertions end module DirectoryHelpers + def root_dir(*subdirs) + File.join(File.dirname(File.dirname(__FILE__)), *subdirs) + end + def dest_dir(*subdirs) test_dir("dest", *subdirs) end @@ -70,8 +74,12 @@ module DirectoryHelpers test_dir("source", *subdirs) end + def theme_dir(*subdirs) + test_dir("fixtures", "test-theme", *subdirs) + end + def test_dir(*subdirs) - File.join(File.dirname(__FILE__), *subdirs) + root_dir("test", *subdirs) end end @@ -107,9 +115,9 @@ class JekyllUnitTest < Minitest::Test site = fixture_site({ "collections" => { "methods" => { - "output" => true - } - } + "output" => true, + }, + }, }) site.read matching_doc = site.collections["methods"].docs.find do |doc| @@ -133,10 +141,10 @@ class JekyllUnitTest < Minitest::Test def site_configuration(overrides = {}) full_overrides = build_configs(overrides, build_configs({ "destination" => dest_dir, - "incremental" => false + "incremental" => false, })) Configuration.from(full_overrides.merge({ - "source" => source_dir + "source" => source_dir, })) end @@ -159,11 +167,11 @@ class JekyllUnitTest < Minitest::Test end def capture_output - stderr = StringIO.new - Jekyll.logger = Logger.new stderr + buffer = StringIO.new + Jekyll.logger = Logger.new(buffer) yield - stderr.rewind - return stderr.string.to_s + buffer.rewind + buffer.string.to_s end alias_method :capture_stdout, :capture_output alias_method :capture_stderr, :capture_output diff --git a/test/source/_plugins/dummy.rb b/test/source/_plugins/dummy.rb index bfd46e1c..fd11d0e1 100644 --- a/test/source/_plugins/dummy.rb +++ b/test/source/_plugins/dummy.rb @@ -2,7 +2,6 @@ module Jekyll class Dummy < Generator priority :high - def generate(site) - end + def generate(site) end end end diff --git a/test/test_collections.rb b/test/test_collections.rb index 0dca8443..0607208b 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -91,9 +91,9 @@ class TestCollections < JekyllUnitTest @site = fixture_site({ "collections" => { "methods" => { - "permalink" => "/awesome/:path/" - } - } + "permalink" => "/awesome/:path/", + }, + }, }) @site.process @collection = @site.collections["methods"] @@ -107,7 +107,7 @@ class TestCollections < JekyllUnitTest context "with a collection" do setup do @site = fixture_site({ - "collections" => ["methods"] + "collections" => ["methods"], }) @site.process @collection = @site.collections["methods"] @@ -158,9 +158,9 @@ class TestCollections < JekyllUnitTest "collections" => { "methods" => { "foo" => "bar", - "baz" => "whoo" - } - } + "baz" => "whoo", + }, + }, }) @site.process @collection = @site.collections["methods"] @@ -175,7 +175,7 @@ class TestCollections < JekyllUnitTest setup do @site = fixture_site({ "collections" => ["methods"], - "safe" => true + "safe" => true, }) @site.process @collection = @site.collections["methods"] @@ -198,7 +198,7 @@ class TestCollections < JekyllUnitTest setup do @site = fixture_site({ "collections" => ["with.dots"], - "safe" => true + "safe" => true, }) @site.process @collection = @site.collections["with.dots"] diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 143dc2a5..fa0f7f67 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -86,12 +86,12 @@ class TestCommandsServe < JekyllUnitTest "config" => %w(_config.yml _development.yml), "serving" => true, "watch" => false, # for not having guard output when running the tests - "url" => "http://localhost:4000" + "url" => "http://localhost:4000", } expect(Jekyll::Commands::Serve).to receive(:process).with(custom_options) @merc.execute(:serve, { "config" => %w(_config.yml _development.yml), - "watch" => false }) + "watch" => false, }) end context "in development environment" do @@ -113,7 +113,7 @@ class TestCommandsServe < JekyllUnitTest "port" => "9999", "url" => "https://jekyllrb.com/", "ssl_cert" => "foo", - "ssl_key" => "bar" + "ssl_key" => "bar", }) assert_equal 1, Jekyll.sites.count @@ -146,13 +146,13 @@ class TestCommandsServe < JekyllUnitTest should "raise if enabling without key or cert" do assert_raises RuntimeError do custom_opts({ - "ssl_key" => "foo" + "ssl_key" => "foo", }) end assert_raises RuntimeError do custom_opts({ - "ssl_key" => "foo" + "ssl_key" => "foo", }) end end @@ -166,7 +166,7 @@ class TestCommandsServe < JekyllUnitTest "ssl_cert" => "foo", "source" => "bar", "enable_ssl" => true, - "ssl_key" => "bar" + "ssl_key" => "bar", }) assert result[:SSLEnable] diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 696fc3e9..febc0cbe 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -4,7 +4,7 @@ require "colorator" class TestConfiguration < JekyllUnitTest test_config = { "source" => new(nil).source_dir, - "destination" => dest_dir + "destination" => dest_dir, } context ".from" do @@ -34,8 +34,8 @@ class TestConfiguration < JekyllUnitTest { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - } + "permalink" => "/:categories/:year/:month/:day/:title:output_ext", + }, } ) end @@ -85,8 +85,8 @@ class TestConfiguration < JekyllUnitTest { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title/" - } + "permalink" => "/:categories/:year/:month/:day/:title/", + }, } ) @@ -109,14 +109,14 @@ class TestConfiguration < JekyllUnitTest :permalink => "date", "baseurl" => "/", :include => [".htaccess"], - :source => "./" + :source => "./", }] @string_keys = Configuration[{ "markdown" => "kramdown", "permalink" => "date", "baseurl" => "/", "include" => [".htaccess"], - "source" => "./" + "source" => "./", }] end should "stringify symbol keys" do @@ -132,7 +132,7 @@ class TestConfiguration < JekyllUnitTest @no_override = {} @one_config_file = { "config" => "config.yml" } @multiple_files = { - "config" => %w(config/site.yml config/deploy.toml configuration.yml) + "config" => %w(config/site.yml config/deploy.toml configuration.yml), } end @@ -205,7 +205,7 @@ class TestConfiguration < JekyllUnitTest "pygments" => true, "plugins" => true, "layouts" => true, - "data_source" => true + "data_source" => true, }] end should "unset 'auto' and 'watch'" do @@ -255,7 +255,7 @@ class TestConfiguration < JekyllUnitTest setup do @config = proc do |val| Configuration[{ - "paginate" => val + "paginate" => val, }] end end @@ -327,7 +327,7 @@ class TestConfiguration < JekyllUnitTest :default => source_dir("_config.yml"), :other => source_dir("_config.live.yml"), :toml => source_dir("_config.dev.toml"), - :empty => "" + :empty => "", } end @@ -372,7 +372,7 @@ class TestConfiguration < JekyllUnitTest Jekyll.logger.log_level = :warn assert_equal \ site_configuration({ "baseurl" => "/you-beautiful-blog-you", - "title" => "My magnificent site, wut" }), + "title" => "My magnificent site, wut", }), Jekyll.configuration(test_config.merge({ "config" => [@paths[:toml]] })) Jekyll.logger.log_level = :info end @@ -435,9 +435,9 @@ class TestConfiguration < JekyllUnitTest "docs" => {}, "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - } - } + "permalink" => "/:categories/:year/:month/:day/:title:output_ext", + }, + }, }) end @@ -449,9 +449,9 @@ class TestConfiguration < JekyllUnitTest "collections" => { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - } - } + "permalink" => "/:categories/:year/:month/:day/:title:output_ext", + }, + }, }) end @@ -461,9 +461,9 @@ class TestConfiguration < JekyllUnitTest "collections" => { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - } - } + "permalink" => "/:categories/:year/:month/:day/:title:output_ext", + }, + }, }) end @@ -471,16 +471,16 @@ class TestConfiguration < JekyllUnitTest posts_permalink = "/:year/:title/" conf = Configuration[default_configuration].tap do |c| c["collections"] = { - "posts" => { "permalink" => posts_permalink } + "posts" => { "permalink" => posts_permalink }, } end assert_equal conf.add_default_collections, conf.merge({ "collections" => { "posts" => { "output" => true, - "permalink" => posts_permalink - } - } + "permalink" => posts_permalink, + }, + }, }) end end diff --git a/test/test_doctor_command.rb b/test/test_doctor_command.rb index 652175b9..88614402 100644 --- a/test/test_doctor_command.rb +++ b/test/test_doctor_command.rb @@ -10,7 +10,7 @@ class TestDoctorCommand < JekyllUnitTest should "return success on a valid site/page" do @site = Site.new(Jekyll.configuration({ "source" => File.join(source_dir, "/_urls_differ_by_case_valid"), - "destination" => dest_dir + "destination" => dest_dir, })) @site.process output = capture_stderr do @@ -23,7 +23,7 @@ class TestDoctorCommand < JekyllUnitTest should "return warning for pages only differing by case" do @site = Site.new(Jekyll.configuration({ "source" => File.join(source_dir, "/_urls_differ_by_case_invalid"), - "destination" => dest_dir + "destination" => dest_dir, })) @site.process output = capture_stderr do diff --git a/test/test_document.rb b/test/test_document.rb index 7c9df18c..f274dd53 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -8,7 +8,7 @@ class TestDocument < JekyllUnitTest context "a document in a collection" do setup do @site = fixture_site({ - "collections" => ["methods"] + "collections" => ["methods"], }) @site.process @document = @site.collections["methods"].docs.detect do |d| @@ -118,10 +118,10 @@ class TestDocument < JekyllUnitTest "scope" => { "path"=>"", "type"=>"slides" }, "values" => { "nested" => { - "key" => "myval" - } - } - }] + "key" => "myval", + }, + }, + },], }) @site.process @document = @site.collections["slides"].docs.select { |d| d.is_a?(Document) }.first @@ -143,10 +143,10 @@ class TestDocument < JekyllUnitTest "values" => { "nested" => { "test1" => "default1", - "test2" => "default1" - } - } - }] + "test2" => "default1", + }, + }, + },], }) @site.process @document = @site.collections["slides"].docs[1] @@ -170,10 +170,10 @@ class TestDocument < JekyllUnitTest "scope" => { "path"=>"_slides", "type"=>"slides" }, "values" => { "nested" => { - "key" => "value123" - } - } - }] + "key" => "value123", + }, + }, + },], }) @site.process @document = @site.collections["slides"].docs.first @@ -194,10 +194,10 @@ class TestDocument < JekyllUnitTest "scope" => { "path"=>"somepath", "type"=>"slides" }, "values" => { "nested" => { - "key" => "myval" - } - } - }] + "key" => "myval", + }, + }, + },], }) @site.process @document = @site.collections["slides"].docs.first @@ -213,7 +213,7 @@ class TestDocument < JekyllUnitTest context "a document in a collection with a custom permalink" do setup do @site = fixture_site({ - "collections" => ["slides"] + "collections" => ["slides"], }) @site.process @document = @site.collections["slides"].docs[2] @@ -235,10 +235,10 @@ class TestDocument < JekyllUnitTest "collections" => { "slides" => { "output" => true, - "permalink" => "/slides/test/:name" - } + "permalink" => "/slides/test/:name", + }, }, - "permalink" => "pretty" + "permalink" => "pretty", }) @site.process @document = @site.collections["slides"].docs[0] @@ -263,9 +263,9 @@ class TestDocument < JekyllUnitTest @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.permalink_style = :pretty @site.process @@ -287,9 +287,9 @@ class TestDocument < JekyllUnitTest @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.permalink_style = :pretty @site.process @@ -307,9 +307,9 @@ class TestDocument < JekyllUnitTest @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @document = @site.collections["slides"].docs[6] @@ -339,9 +339,9 @@ class TestDocument < JekyllUnitTest "collections" => { "slides" => { "output" => true, - "permalink" => "/slides/:title" - } - } + "permalink" => "/slides/:title", + }, + }, }) @site.process @document = @site.collections["slides"].docs[3] @@ -381,8 +381,8 @@ class TestDocument < JekyllUnitTest context "document with a permalink with dots & a trailing slash" do setup do @site = fixture_site({ "collections" => { - "with.dots" => { "output" => true } - } }) + "with.dots" => { "output" => true }, + }, }) @site.process @document = @site.collections["with.dots"].docs.last @dest_file = dest_dir("with.dots", "permalink.with.slash.tho", "index.html") @@ -406,9 +406,9 @@ class TestDocument < JekyllUnitTest @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @files = @site.collections["slides"].docs @@ -436,9 +436,9 @@ class TestDocument < JekyllUnitTest @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @document = @site.collections["slides"].files.find do |doc| @@ -469,9 +469,9 @@ class TestDocument < JekyllUnitTest @site = fixture_site({ "collections" => { "methods" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @document = @site.collections["methods"].docs.find do |doc| @@ -498,9 +498,9 @@ class TestDocument < JekyllUnitTest @site = fixture_site({ "collections" => { "methods" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @document = @site.collections["methods"].docs.find do |doc| diff --git a/test/test_drop.rb b/test/test_drop.rb index 199e94ab..80b0d0ff 100644 --- a/test/test_drop.rb +++ b/test/test_drop.rb @@ -4,7 +4,7 @@ class TestDrop < JekyllUnitTest context "a document drop" do setup do @site = fixture_site({ - "collections" => ["methods"] + "collections" => ["methods"], }) @site.process @document = @site.collections["methods"].docs.detect do |d| diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb index f65badc6..7f32653c 100644 --- a/test/test_entry_filter.rb +++ b/test/test_entry_filter.rb @@ -17,7 +17,7 @@ class TestEntryFilter < JekyllUnitTest should "allow regexp filtering" do files = %w(README.md) @site.exclude = [ - %r!README! + %r!README!, ] assert_empty @site.reader.filter_entries( diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index 0b7e540f..e0960f69 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -4,13 +4,13 @@ class TestExcerpt < JekyllUnitTest def setup_post(file) Document.new(@site.in_source_dir(File.join("_posts", file)), { :site => @site, - :collection => @site.posts + :collection => @site.posts, }).tap(&:read) end def do_render(document) @site.layouts = { - "default" => Layout.new(@site, source_dir("_layouts"), "simple.html") + "default" => Layout.new(@site, source_dir("_layouts"), "simple.html"), } document.output = Jekyll::Renderer.new(@site, document, @site.site_payload).run end diff --git a/test/test_filters.rb b/test/test_filters.rb index e5dedfae..d18b57e3 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -29,7 +29,7 @@ class TestFilters < JekyllUnitTest @filter = make_filter_mock({ "timezone" => "UTC", "url" => "http://example.com", - "baseurl" => "/base" + "baseurl" => "/base", }) @sample_time = Time.utc(2013, 3, 27, 11, 22, 33) @sample_date = Date.parse("2013-03-27") @@ -39,7 +39,7 @@ class TestFilters < JekyllUnitTest @array_of_objects = [ { "color" => "red", "size" => "large" }, { "color" => "red", "size" => "medium" }, - { "color" => "blue", "size" => "medium" } + { "color" => "blue", "size" => "medium" }, ] end @@ -332,7 +332,7 @@ class TestFilters < JekyllUnitTest page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => "base" + "baseurl" => "base", }) assert_equal "http://example.com/base/#{page_url}", filter.absolute_url(page_url) end @@ -341,7 +341,7 @@ class TestFilters < JekyllUnitTest page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => "", - "baseurl" => "base" + "baseurl" => "base", }) assert_equal "/base/#{page_url}", filter.absolute_url(page_url) end @@ -350,7 +350,7 @@ class TestFilters < JekyllUnitTest page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => nil, - "baseurl" => "base" + "baseurl" => "base", }) assert_equal "/base/#{page_url}", filter.absolute_url(page_url) end @@ -359,7 +359,7 @@ class TestFilters < JekyllUnitTest page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => nil + "baseurl" => nil, }) assert_equal "http://example.com/#{page_url}", filter.absolute_url(page_url) end @@ -368,16 +368,34 @@ class TestFilters < JekyllUnitTest page_url = "" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => "/base" + "baseurl" => "/base", }) assert_equal "http://example.com/base", filter.absolute_url(page_url) end + should "not append a forward slash if input is '/'" do + page_url = "/" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => "/base", + }) + assert_equal "http://example.com/base/", filter.absolute_url(page_url) + end + + should "not append a forward slash if input is '/' and nil 'baseurl'" do + page_url = "/" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => nil, + }) + assert_equal "http://example.com/", filter.absolute_url(page_url) + end + should "normalize international URLs" do page_url = "" filter = make_filter_mock({ "url" => "http://ümlaut.example.org/", - "baseurl" => nil + "baseurl" => nil, }) assert_equal "http://xn--mlaut-jva.example.org/", filter.absolute_url(page_url) end @@ -409,7 +427,7 @@ class TestFilters < JekyllUnitTest page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => nil + "baseurl" => nil, }) assert_equal "/#{page_url}", filter.relative_url(page_url) end @@ -418,7 +436,7 @@ class TestFilters < JekyllUnitTest page_url = "" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => "/base" + "baseurl" => "/base", }) assert_equal "/base", filter.relative_url(page_url) end @@ -451,7 +469,7 @@ class TestFilters < JekyllUnitTest "excerpt" => "

This should be published.

\n", "draft" => false, "categories" => [ - "publish_test" + "publish_test", ], "layout" => "default", "title" => "Publish", @@ -459,7 +477,7 @@ class TestFilters < JekyllUnitTest "date" => "2008-02-02 00:00:00 +0000", "slug" => "published", "ext" => ".markdown", - "tags" => [] + "tags" => [], } actual = JSON.parse(@filter.jsonify(@filter.site.docs_to_write.first.to_liquid)) @@ -475,7 +493,7 @@ class TestFilters < JekyllUnitTest actual = @filter.jsonify(@filter.site.to_liquid) assert_equal JSON.parse(actual)["jekyll"], { "environment" => "development", - "version" => Jekyll::VERSION + "version" => Jekyll::VERSION, } end @@ -491,7 +509,7 @@ class TestFilters < JekyllUnitTest "name" => name, :v => 1, :thing => M.new({ :kay => "jewelers" }), - :stuff => true + :stuff => true, } end end @@ -503,21 +521,21 @@ class TestFilters < JekyllUnitTest "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true + "stuff" => true, }, { "name" => "Smathers", "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true - } + "stuff" => true, + }, ] result = @filter.jsonify([T.new("Jeremiah"), T.new("Smathers")]) assert_equal expected, JSON.parse(result) @@ -533,32 +551,32 @@ class TestFilters < JekyllUnitTest "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true + "stuff" => true, }, { "name" => 1, "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true + "stuff" => true, }, { "name" => 2, "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true - } - ] + "stuff" => true, + }, + ], } result = @filter.jsonify(my_hash) assert_equal expected, JSON.parse(result) @@ -633,7 +651,7 @@ class TestFilters < JekyllUnitTest hash = { "a" => { "tags"=>%w(x y) }, "b" => { "tags"=>["x"] }, - "c" => { "tags"=>%w(y z) } + "c" => { "tags"=>%w(y z) }, } assert_equal 2, @filter.where(hash, "tags", "x").length end @@ -642,7 +660,7 @@ class TestFilters < JekyllUnitTest hash = { "a" => { "tags"=>%w(x y) }, "b" => { "tags"=>"x" }, - "c" => { "tags"=>%w(y z) } + "c" => { "tags"=>%w(y z) }, } assert_equal 2, @filter.where(hash, "tags", "x").length end @@ -651,7 +669,7 @@ class TestFilters < JekyllUnitTest hash = { "a" => { "category"=>"bear" }, "b" => { "category"=>"wolf" }, - "c" => { "category"=>%w(bear lion) } + "c" => { "category"=>%w(bear lion) }, } assert_equal 0, @filter.where(hash, "category", "ear").length end @@ -660,7 +678,7 @@ class TestFilters < JekyllUnitTest hash = { "The Words" => { "rating" => 1.2, "featured" => false }, "Limitless" => { "rating" => 9.2, "featured" => true }, - "Hustle" => { "rating" => 4.7, "featured" => true } + "Hustle" => { "rating" => 4.7, "featured" => true }, } results = @filter.where(hash, "featured", "true") @@ -704,7 +722,7 @@ class TestFilters < JekyllUnitTest hash = { "The Words" => { "rating" => 1.2, "featured" => false }, "Limitless" => { "rating" => 9.2, "featured" => true }, - "Hustle" => { "rating" => 4.7, "featured" => true } + "Hustle" => { "rating" => 4.7, "featured" => true }, } results = @filter.where_exp(hash, "item", "item.featured == true") @@ -725,7 +743,7 @@ class TestFilters < JekyllUnitTest { "id" => "a", "groups" => [1, 2] }, { "id" => "b", "groups" => [2, 3] }, { "id" => "c" }, - { "id" => "d", "groups" => [1, 3] } + { "id" => "d", "groups" => [1, 3] }, ] should "filter with the contains operator over arrays" do results = @filter.where_exp(objects, "obj", "obj.groups contains 1") @@ -807,7 +825,7 @@ class TestFilters < JekyllUnitTest items = [ { "version"=>"1.0", "result"=>"slow" }, { "version"=>"1.1.5", "result"=>"medium" }, - { "version"=>"2.7.3", "result"=>"fast" } + { "version"=>"2.7.3", "result"=>"fast" }, ] result = @filter.group_by_exp(items, "item", "item.version | split: '.' | first") diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index 93cbf4b4..0d066c11 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -7,12 +7,12 @@ class TestFrontMatterDefaults < JekyllUnitTest "defaults" => [{ "scope" => { "path" => "contacts", - "type" => "page" + "type" => "page", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @affected = @site.pages.find { |page| page.relative_path == "contacts/bar.html" } @@ -21,7 +21,7 @@ class TestFrontMatterDefaults < JekyllUnitTest should "affect only the specified path and type" do assert_equal @affected.data["key"], "val" - assert_equal @not_affected.data["key"], nil + assert_nil @not_affected.data["key"] end end @@ -30,12 +30,12 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "scope" => { - "path" => "index.html" + "path" => "index.html", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @@ -45,7 +45,7 @@ class TestFrontMatterDefaults < JekyllUnitTest should "affect only the specified path" do assert_equal @affected.data["key"], "val" - assert_equal @not_affected.data["key"], nil + assert_nil @not_affected.data["key"] end end @@ -54,12 +54,12 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "scope" => { - "path" => "win" + "path" => "win", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @@ -69,7 +69,7 @@ class TestFrontMatterDefaults < JekyllUnitTest should "affect only the specified path and all types" do assert_equal @affected.data["key"], "val" - assert_equal @not_affected.data["key"], nil + assert_nil @not_affected.data["key"] end end @@ -78,12 +78,12 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "scope" => { - "type" => "page" + "type" => "page", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @@ -103,12 +103,12 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "scope" => { - "type" => "pages" + "type" => "pages", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @affected = @site.pages @@ -129,9 +129,9 @@ class TestFrontMatterDefaults < JekyllUnitTest "scope" => { }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @affected = @site.pages @@ -149,9 +149,9 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @affected = @site.pages @@ -171,9 +171,9 @@ class TestFrontMatterDefaults < JekyllUnitTest "destination" => dest_dir, "defaults" => [{ "values" => { - "date" => "2015-01-01 00:00:01" - } - }] + "date" => "2015-01-01 00:00:01", + }, + },], })) end diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index 0a6332f8..d8f886a4 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -16,9 +16,9 @@ class TestKramdown < JekyllUnitTest "syntax_highlighter" => "rouge", "syntax_highlighter_opts" => { - "bold_every" => 8, "css" => :class - } - } + "bold_every" => 8, "css" => :class, + }, + }, } @config = Jekyll.configuration(@config) @@ -43,8 +43,8 @@ class TestKramdown < JekyllUnitTest override = { "highlighter" => nil, "kramdown" => { - "smart_quotes" => "lsaquo,rsaquo,laquo,raquo" - } + "smart_quotes" => "lsaquo,rsaquo,laquo,raquo", + }, } markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) @@ -70,8 +70,8 @@ class TestKramdown < JekyllUnitTest "highlighter" => nil, "markdown" => "kramdown", "kramdown" => { - "syntax_highlighter" => :coderay - } + "syntax_highlighter" => :coderay, + }, } markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) @@ -89,8 +89,8 @@ class TestKramdown < JekyllUnitTest override = { "markdown" => "kramdown", "kramdown" => { - "enable_coderay" => true - } + "enable_coderay" => true, + }, } @config.delete("highlighter") @@ -115,9 +115,9 @@ class TestKramdown < JekyllUnitTest "kramdown" => { "syntax_highlighter" => "coderay", "coderay" => { - "hello" => "world" - } - } + "hello" => "world", + }, + }, })) expect(Kramdown::Document).to receive(:new) do |arg1, hash| diff --git a/test/test_layout_reader.rb b/test/test_layout_reader.rb index 133cd6f2..1d32fa57 100644 --- a/test/test_layout_reader.rb +++ b/test/test_layout_reader.rb @@ -4,7 +4,7 @@ class TestLayoutReader < JekyllUnitTest context "reading layouts" do setup do config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, - "destination" => dest_dir }) + "destination" => dest_dir, }) @site = fixture_site(config) end diff --git a/test/test_liquid_renderer.rb b/test/test_liquid_renderer.rb index 7d429c52..6ba29299 100644 --- a/test/test_liquid_renderer.rb +++ b/test/test_liquid_renderer.rb @@ -16,7 +16,7 @@ class TestLiquidRenderer < JekyllUnitTest expected = [ %r!^Filename\s+|\s+Count\s+|\s+Bytes\s+|\s+Time$!, %r!^-+\++-+\++-+\++-+$!, - %r!^_posts/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$! + %r!^_posts/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$!, ] # rubocop:enable Metrics/LineLength diff --git a/test/test_new_command.rb b/test/test_new_command.rb index 982de1da..a02f1565 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -25,14 +25,14 @@ class TestNewCommand < JekyllUnitTest should "create a new directory" do refute_exist @full_path - Jekyll::Commands::New.process(@args) + capture_output { Jekyll::Commands::New.process(@args) } assert_exist @full_path end should "create a Gemfile" do gemfile = File.join(@full_path, "Gemfile") refute_exist @full_path - capture_stdout { Jekyll::Commands::New.process(@args) } + capture_output { Jekyll::Commands::New.process(@args) } assert_exist gemfile assert_match(%r!gem "jekyll", "#{Jekyll::VERSION}"!, File.read(gemfile)) assert_match(%r!gem "github-pages"!, File.read(gemfile)) @@ -40,12 +40,11 @@ class TestNewCommand < JekyllUnitTest should "display a success message" do Jekyll::Commands::New.process(@args) - output = Jekyll.logger.messages[-3] - output_last = Jekyll.logger.messages.last - success_message = "New jekyll site installed in #{@full_path.cyan}." - bundle_message = "Running bundle install in #{@full_path.cyan}..." + output = Jekyll.logger.messages + success_message = "New jekyll site installed in #{@full_path.cyan}. " + bundle_message = "Running bundle install in #{@full_path.cyan}... " assert_includes output, success_message - assert_includes output_last, bundle_message + assert_includes output, bundle_message end should "copy the static files in site template to the new directory" do @@ -54,7 +53,7 @@ class TestNewCommand < JekyllUnitTest end static_template_files << "/Gemfile" - capture_stdout { Jekyll::Commands::New.process(@args) } + capture_output { Jekyll::Commands::New.process(@args) } new_site_files = dir_contents(@full_path).reject do |f| File.extname(f) == ".markdown" @@ -76,7 +75,7 @@ class TestNewCommand < JekyllUnitTest f.gsub! "0000-00-00", stubbed_date end - capture_stdout { Jekyll::Commands::New.process(@args) } + capture_output { Jekyll::Commands::New.process(@args) } new_site_files = dir_contents(@full_path).select do |f| erb_template_files.include? f @@ -87,7 +86,7 @@ class TestNewCommand < JekyllUnitTest should "create blank project" do blank_contents = %w(/_drafts /_layouts /_posts /index.html) - capture_stdout { Jekyll::Commands::New.process(@args, "--blank") } + capture_output { Jekyll::Commands::New.process(@args, "--blank") } output = Jekyll.logger.messages.last bundle_message = "Running bundle install in #{@full_path.cyan}..." assert_same_elements blank_contents, dir_contents(@full_path) @@ -95,13 +94,13 @@ class TestNewCommand < JekyllUnitTest end should "force created folder" do - capture_stdout { Jekyll::Commands::New.process(@args) } - output = capture_stdout { Jekyll::Commands::New.process(@args, "--force") } + capture_output { Jekyll::Commands::New.process(@args) } + output = capture_output { Jekyll::Commands::New.process(@args, "--force") } assert_match(%r!New jekyll site installed in!, output) end should "skip bundle install when opted to" do - capture_stdout { Jekyll::Commands::New.process(@args, "--skip-bundle") } + capture_output { Jekyll::Commands::New.process(@args, "--skip-bundle") } output = Jekyll.logger.messages.last bundle_message = "Bundle install skipped." assert_includes output, bundle_message @@ -120,7 +119,7 @@ class TestNewCommand < JekyllUnitTest should "create a new directory" do refute_exist @site_name_with_spaces - capture_stdout { Jekyll::Commands::New.process(@multiple_args) } + capture_output { Jekyll::Commands::New.process(@multiple_args) } assert_exist @site_name_with_spaces end end diff --git a/test/test_page.rb b/test/test_page.rb index 259de185..431c57a6 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -12,7 +12,7 @@ class TestPage < JekyllUnitTest def do_render(page) layouts = { - "default" => Layout.new(@site, source_dir("_layouts"), "simple.html") + "default" => Layout.new(@site, source_dir("_layouts"), "simple.html"), } page.render(layouts, @site.site_payload) end @@ -23,7 +23,7 @@ class TestPage < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "skip_config_files" => true + "skip_config_files" => true, })) end @@ -90,7 +90,7 @@ class TestPage < JekyllUnitTest :permalink => "/properties/", :published => nil, :title => "Properties Page", - :url => "/properties/" + :url => "/properties/", } attrs.each do |attr, val| diff --git a/test/test_plugin_manager.rb b/test/test_plugin_manager.rb index c625c3a8..702df593 100644 --- a/test/test_plugin_manager.rb +++ b/test/test_plugin_manager.rb @@ -68,7 +68,7 @@ class TestPluginManager < JekyllUnitTest should "require plugin files" do site = double({ :safe => false, :config => { "plugins_dir" => "_plugins" }, - :in_source_dir => "/tmp/" }) + :in_source_dir => "/tmp/", }) plugin_manager = PluginManager.new(site) expect(Jekyll::External).to receive(:require_with_graceful_fail) @@ -98,9 +98,9 @@ class TestPluginManager < JekyllUnitTest should "call site's in_source_dir" do site = double({ :config => { - "plugins_dir" => Jekyll::Configuration::DEFAULTS["plugins_dir"] + "plugins_dir" => Jekyll::Configuration::DEFAULTS["plugins_dir"], }, - :in_source_dir => "/tmp/" + :in_source_dir => "/tmp/", }) plugin_manager = PluginManager.new(site) @@ -132,7 +132,7 @@ class TestPluginManager < JekyllUnitTest should "print no deprecation warning if jekyll-paginate is present" do site = double({ - :config => { "paginate" => true, "gems" => ["jekyll-paginate"] } + :config => { "paginate" => true, "gems" => ["jekyll-paginate"] }, }) plugin_manager = PluginManager.new(site) diff --git a/test/test_rdiscount.rb b/test/test_rdiscount.rb index 9390aaed..32289a64 100644 --- a/test/test_rdiscount.rb +++ b/test/test_rdiscount.rb @@ -13,8 +13,8 @@ class TestRdiscount < JekyllUnitTest "markdown" => "rdiscount", "rdiscount" => { "toc_token" => "{:toc}", - "extensions" => %w(smart generate_toc) - } + "extensions" => %w(smart generate_toc), + }, } @markdown = Converters::Markdown.new config diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb index 140fabbe..4e979f4d 100644 --- a/test/test_redcarpet.rb +++ b/test/test_redcarpet.rb @@ -12,8 +12,8 @@ class TestRedcarpet < JekyllUnitTest @config = { "markdown" => "redcarpet", "redcarpet" => { - "extensions" => %w(smart strikethrough filter_html) - } + "extensions" => %w(smart strikethrough filter_html), + }, } @markdown = Converters::Markdown.new @config diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index 03920c83..9e1559d4 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -8,10 +8,10 @@ class TestRegenerator < JekyllUnitTest @site = fixture_site({ "collections" => { "methods" => { - "output" => true - } + "output" => true, + }, }, - "incremental" => true + "incremental" => true, }) @site.read @@ -92,7 +92,7 @@ class TestRegenerator < JekyllUnitTest setup do FileUtils.rm_rf(source_dir(".jekyll-metadata")) @site = fixture_site({ - "incremental" => true + "incremental" => true, }) @site.read @@ -129,7 +129,7 @@ class TestRegenerator < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "incremental" => true + "incremental" => true, })) @site.process @@ -311,7 +311,7 @@ class TestRegenerator < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "incremental" => false + "incremental" => false, })) @site.process diff --git a/test/test_related_posts.rb b/test/test_related_posts.rb index ef7265ef..2d616550 100644 --- a/test/test_related_posts.rb +++ b/test/test_related_posts.rb @@ -28,7 +28,7 @@ class TestRelatedPosts < JekyllUnitTest allow_any_instance_of(Jekyll::RelatedPosts).to receive(:display) @site = fixture_site({ - "lsi" => true + "lsi" => true, }) @site.reset diff --git a/test/test_sass.rb b/test/test_sass.rb index f5241790..3a9df0ae 100644 --- a/test/test_sass.rb +++ b/test/test_sass.rb @@ -5,7 +5,7 @@ class TestSass < JekyllUnitTest setup do @site = Jekyll::Site.new(Jekyll.configuration({ "source" => source_dir, - "destination" => dest_dir + "destination" => dest_dir, })) @site.process @test_css_file = dest_dir("css/main.css") diff --git a/test/test_site.rb b/test/test_site.rb index 81da363d..65032ebd 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -20,7 +20,7 @@ class TestSite < JekyllUnitTest should "have an array for plugins if passed as an array" do site = Site.new(site_configuration({ - "plugins_dir" => ["/tmp/plugins", "/tmp/otherplugins"] + "plugins_dir" => ["/tmp/plugins", "/tmp/otherplugins"], })) array = if Utils::Platforms.windows? ["C:/tmp/plugins", "C:/tmp/otherplugins"] @@ -49,6 +49,18 @@ class TestSite < JekyllUnitTest site = Site.new(site_configuration({ "baseurl" => "/blog" })) assert_equal "/blog", site.baseurl end + + should "only include theme includes_path if the path exists" do + site = fixture_site({ "theme" => "test-theme" }) + assert_equal [source_dir("_includes"), theme_dir("_includes")], + site.includes_load_paths + + allow(File).to receive(:directory?).with(theme_dir("_sass")).and_return(true) + allow(File).to receive(:directory?).with(theme_dir("_layouts")).and_return(true) + allow(File).to receive(:directory?).with(theme_dir("_includes")).and_return(false) + site = fixture_site({ "theme" => "test-theme" }) + assert_equal [source_dir("_includes")], site.includes_load_paths + end end context "creating sites" do setup do @@ -485,7 +497,7 @@ class TestSite < JekyllUnitTest context "manipulating the Jekyll environment" do setup do @site = Site.new(site_configuration({ - "incremental" => false + "incremental" => false, })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } @@ -499,7 +511,7 @@ class TestSite < JekyllUnitTest setup do ENV["JEKYLL_ENV"] = "production" @site = Site.new(site_configuration({ - "incremental" => false + "incremental" => false, })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } @@ -565,7 +577,7 @@ class TestSite < JekyllUnitTest context "incremental build" do setup do @site = Site.new(site_configuration({ - "incremental" => true + "incremental" => true, })) @site.read end diff --git a/test/test_site_drop.rb b/test/test_site_drop.rb new file mode 100644 index 00000000..6175bbb8 --- /dev/null +++ b/test/test_site_drop.rb @@ -0,0 +1,21 @@ +require "helper" + +class TestSiteDrop < JekyllUnitTest + context "a site drop" do + setup do + @site = fixture_site({ + "collections" => ["thanksgiving"] + }) + @site.process + @drop = @site.to_liquid.site + end + + should "respond to `key?`" do + assert @drop.respond_to?(:key?) + end + + should "find a key if it's in the collection of the drop" do + assert @drop.key?("thanksgiving") + end + end +end diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 2be800a6..114885db 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -16,33 +16,34 @@ class TestStaticFile < JekyllUnitTest end def setup_static_file(base, dir, name) - StaticFile.new(@site, base, dir, name) + Dir.chdir(@site.source) { StaticFile.new(@site, base, dir, name) } end def setup_static_file_with_collection(base, dir, name, metadata) site = fixture_site("collections" => { "foo" => metadata }) - StaticFile.new(site, base, dir, name, site.collections["foo"]) + Dir.chdir(site.source) do + StaticFile.new(site, base, dir, name, site.collections["foo"]) + end end def setup_static_file_with_defaults(base, dir, name, defaults) site = fixture_site("defaults" => defaults) - StaticFile.new(site, base, dir, name) + Dir.chdir(site.source) do + StaticFile.new(site, base, dir, name) + end end context "A StaticFile" do setup do clear_dest - @old_pwd = Dir.pwd - Dir.chdir source_dir @site = fixture_site @filename = "static_file.txt" make_dummy_file(@filename) - @static_file = setup_static_file(nil, nil, @filename) + @static_file = setup_static_file(@site.source, "", @filename) end teardown do remove_dummy_file(@filename) if File.exist?(source_dir(@filename)) - Dir.chdir @old_pwd end should "have a source file path" do @@ -95,8 +96,8 @@ class TestStaticFile < JekyllUnitTest should "use the _config.yml defaults to determine writability" do defaults = [{ "scope" => { "path" => "private" }, - "values" => { "published" => false } - }] + "values" => { "published" => false }, + },] static_file = setup_static_file_with_defaults( "root", "private/dir/subdir", @@ -146,7 +147,7 @@ class TestStaticFile < JekyllUnitTest "name" => "static_file.txt", "extname" => ".txt", "modified_time" => @static_file.modified_time, - "path" => "/static_file.txt" + "path" => "/static_file.txt", } assert_equal expected, @static_file.to_liquid end diff --git a/test/test_tags.rb b/test/test_tags.rb index fd6dcb97..0fe07aa6 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -17,7 +17,7 @@ class TestTags < JekyllUnitTest info = { :filters => [Jekyll::Filters], :registers => { :site => site } } @converter = site.converters.find { |c| c.class == converter_class } payload = { "highlighter_prefix" => @converter.highlighter_prefix, - "highlighter_suffix" => @converter.highlighter_suffix } + "highlighter_suffix" => @converter.highlighter_suffix, } @result = Liquid::Template.parse(content).render!(payload, info) @result = @converter.convert(@result) @@ -46,8 +46,8 @@ CONTENT Jekyll::Tags::HighlightBlock.parse( "highlight", options_string, - ["test", "{% endhighlight %}", "\n"], - {} + Liquid::Tokenizer.new("test{% endhighlight %}\n"), + Liquid::ParseContext.new ) end @@ -487,7 +487,7 @@ CONTENT end create_post(@content, { - "markdown" => "rdiscount" + "markdown" => "rdiscount", }) end @@ -517,7 +517,7 @@ CONTENT end create_post(@content, { - "markdown" => "redcarpet" + "markdown" => "redcarpet", }) end @@ -541,7 +541,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -567,7 +567,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -596,7 +596,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -628,7 +628,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -664,7 +664,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end end @@ -683,7 +683,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end end @@ -703,7 +703,7 @@ CONTENT create_post(content, { "source" => source_dir, "destination" => dest_dir, - "read_all" => true + "read_all" => true, }) end @@ -737,7 +737,7 @@ CONTENT "source" => source_dir, "destination" => dest_dir, "collections" => { "methods" => { "output" => true } }, - "read_collections" => true + "read_collections" => true, }) end @@ -764,7 +764,7 @@ CONTENT "source" => source_dir, "destination" => dest_dir, "collections" => { "methods" => { "output" => true } }, - "read_collections" => true + "read_collections" => true, }) end @@ -796,7 +796,7 @@ CONTENT "source" => source_dir, "destination" => dest_dir, "collections" => { "methods" => { "output" => true } }, - "read_collections" => true + "read_collections" => true, }) end end @@ -820,7 +820,7 @@ CONTENT "source" => source_dir, "destination" => dest_dir, "read_posts" => true, - "safe" => true + "safe" => true, }) end @result ||= "" @@ -842,7 +842,7 @@ CONTENT "source" => source_dir, "destination" => dest_dir, "read_posts" => true, - "safe" => true + "safe" => true, }) end assert_match( @@ -868,7 +868,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -896,7 +896,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -913,7 +913,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end end @@ -932,7 +932,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -959,7 +959,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -982,7 +982,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -1004,7 +1004,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -1030,7 +1030,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end assert_match( @@ -1125,7 +1125,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end assert_match "Could not locate the included file 'missing.html' in any of " \ @@ -1150,7 +1150,7 @@ CONTENT "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end assert_equal( @@ -1180,7 +1180,7 @@ CONTENT "source" => source_dir, "destination" => dest_dir, "read_posts" => true, - "safe" => true + "safe" => true, }) end @result ||= "" @@ -1202,7 +1202,7 @@ CONTENT "source" => source_dir, "destination" => dest_dir, "read_posts" => true, - "safe" => true + "safe" => true, }) end assert_match( diff --git a/test/test_theme.rb b/test/test_theme.rb index ab1eff43..3d557dc8 100644 --- a/test/test_theme.rb +++ b/test/test_theme.rb @@ -3,7 +3,6 @@ require "helper" class TestTheme < JekyllUnitTest def setup @theme = Theme.new("test-theme") - @expected_root = File.expand_path "./fixtures/test-theme", File.dirname(__FILE__) end context "initializing" do @@ -13,7 +12,7 @@ class TestTheme < JekyllUnitTest end should "know the theme root" do - assert_equal @expected_root, @theme.root + assert_equal theme_dir, @theme.root end should "know the theme version" do @@ -36,13 +35,13 @@ class TestTheme < JekyllUnitTest context "path generation" do [:assets, :_layouts, :_includes, :_sass].each do |folder| should "know the #{folder} path" do - expected = File.expand_path(folder.to_s, @expected_root) + expected = theme_dir(folder.to_s) assert_equal expected, @theme.public_send("#{folder.to_s.tr("_", "")}_path") end end should "generate folder paths" do - expected = File.expand_path("./_sass", @expected_root) + expected = theme_dir("_sass") assert_equal expected, @theme.send(:path_for, :_sass) end @@ -58,7 +57,7 @@ class TestTheme < JekyllUnitTest # no support for symlinks on Windows skip_if_windows "Jekyll does not currently support symlinks on Windows." - expected = File.expand_path("./_layouts", @expected_root) + expected = theme_dir("_layouts") assert_equal expected, @theme.send(:path_for, :_symlink) end end