mirror of
https://github.com/jekyll/jekyll.git
synced 2026-04-28 03:01:03 -04:00
Compare commits
13 Commits
docs-40
...
debug-7328
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33faf349c1 | ||
|
|
cc52cac81a | ||
|
|
91abe9f741 | ||
|
|
d9a2758ff6 | ||
|
|
48e2de862d | ||
|
|
5687a09255 | ||
|
|
03c252ba4d | ||
|
|
6792ff936c | ||
|
|
d22b8ee392 | ||
|
|
b89efa5d5d | ||
|
|
450da91b4b | ||
|
|
b18872b658 | ||
|
|
74581422e3 |
12
.rubocop.yml
12
.rubocop.yml
@@ -8,7 +8,7 @@ Jekyll/NoPutsAllowed:
|
||||
- rake/*.rake
|
||||
|
||||
AllCops:
|
||||
TargetRubyVersion: 2.3
|
||||
TargetRubyVersion: 2.1
|
||||
Include:
|
||||
- lib/**/*.rb
|
||||
Exclude:
|
||||
@@ -53,8 +53,6 @@ Layout/EmptyComment:
|
||||
Enabled: false
|
||||
Layout/EndAlignment:
|
||||
Severity: error
|
||||
Lint/UnneededRequireStatement:
|
||||
Enabled: false
|
||||
Lint/UnreachableCode:
|
||||
Severity: error
|
||||
Lint/UselessAccessModifier:
|
||||
@@ -107,8 +105,6 @@ Naming/MemoizedInstanceVariableName:
|
||||
Naming/UncommunicativeMethodParamName:
|
||||
AllowedNames:
|
||||
- _
|
||||
Performance/UnfreezeString:
|
||||
Enabled: false
|
||||
Security/MarshalLoad:
|
||||
Exclude:
|
||||
- !ruby/regexp /test\/.*.rb$/
|
||||
@@ -152,8 +148,6 @@ Style/ModuleFunction:
|
||||
Enabled: false
|
||||
Style/MultilineTernaryOperator:
|
||||
Severity: error
|
||||
Style/NumericPredicate:
|
||||
Enabled: false
|
||||
Style/PercentLiteralDelimiters:
|
||||
PreferredDelimiters:
|
||||
"%q": "{}"
|
||||
@@ -163,8 +157,6 @@ Style/PercentLiteralDelimiters:
|
||||
"%w": "()"
|
||||
"%W": "()"
|
||||
"%x": "()"
|
||||
Style/RedundantFreeze:
|
||||
Enabled: false
|
||||
Style/RedundantReturn:
|
||||
Enabled: false
|
||||
Style/RedundantSelf:
|
||||
@@ -173,8 +165,6 @@ Style/RegexpLiteral:
|
||||
EnforcedStyle: percent_r
|
||||
Style/RescueModifier:
|
||||
Enabled: false
|
||||
Style/SafeNavigation:
|
||||
Enabled: false
|
||||
Style/SignalException:
|
||||
EnforcedStyle: only_raise
|
||||
Style/SingleLineMethods:
|
||||
|
||||
@@ -8,6 +8,7 @@ rvm:
|
||||
- &ruby1 2.5.1
|
||||
- &ruby2 2.4.4
|
||||
- &ruby3 2.3.7
|
||||
- &ruby4 2.2.10
|
||||
- &jruby jruby-9.1.16.0
|
||||
|
||||
matrix:
|
||||
@@ -16,6 +17,8 @@ matrix:
|
||||
env: TEST_SUITE=fmt
|
||||
- rvm: *ruby1
|
||||
env: TEST_SUITE=default-site
|
||||
- rvm: *ruby1
|
||||
env: ROUGE_VERSION=1.11.1 # runs everything with this version
|
||||
exclude:
|
||||
- rvm: *jruby
|
||||
env: TEST_SUITE=cucumber
|
||||
|
||||
19
Gemfile
19
Gemfile
@@ -5,6 +5,11 @@ gemspec :name => "jekyll"
|
||||
|
||||
gem "rake", "~> 12.0"
|
||||
|
||||
gem "rouge", ENV["ROUGE"] if ENV["ROUGE"]
|
||||
|
||||
# Dependency of jekyll-mentions. RubyGems in Ruby 2.1 doesn't shield us from this.
|
||||
gem "activesupport", "~> 4.2", :groups => [:test_legacy, :site] if RUBY_VERSION < "2.2.2"
|
||||
|
||||
group :development do
|
||||
gem "launchy", "~> 2.3"
|
||||
gem "pry"
|
||||
@@ -18,14 +23,15 @@ end
|
||||
|
||||
group :test do
|
||||
gem "codeclimate-test-reporter", "~> 1.0.5"
|
||||
gem "cucumber", "~> 3.0"
|
||||
gem "cucumber", RUBY_VERSION >= "2.2" ? "~> 3.0" : "3.0.1"
|
||||
gem "httpclient"
|
||||
gem "jekyll_test_plugin"
|
||||
gem "jekyll_test_plugin_malicious"
|
||||
gem "nokogiri", "~> 1.7"
|
||||
# nokogiri v1.8 does not work with ruby 2.1 and below
|
||||
gem "nokogiri", RUBY_VERSION >= "2.2" ? "~> 1.7" : "~> 1.7.0"
|
||||
gem "rspec"
|
||||
gem "rspec-mocks"
|
||||
gem "rubocop", "~> 0.55.0"
|
||||
gem "rubocop", "~> 0.56.0"
|
||||
gem "test-dependency-theme", :path => File.expand_path("test/fixtures/test-dependency-theme", __dir__)
|
||||
gem "test-theme", :path => File.expand_path("test/fixtures/test-theme", __dir__)
|
||||
|
||||
@@ -35,7 +41,7 @@ end
|
||||
#
|
||||
|
||||
group :test_legacy do
|
||||
if RUBY_PLATFORM =~ %r!cygwin!
|
||||
if RUBY_PLATFORM =~ %r!cygwin! || RUBY_VERSION.start_with?("2.2")
|
||||
gem "test-unit"
|
||||
end
|
||||
|
||||
@@ -69,7 +75,7 @@ group :jekyll_optional_dependencies do
|
||||
gem "jekyll-redirect-from"
|
||||
gem "kramdown", "~> 1.14"
|
||||
gem "mime-types", "~> 3.0"
|
||||
gem "rdoc", "~> 6.0"
|
||||
gem "rdoc", RUBY_VERSION >= "2.2.2" ? "~> 6.0" : "~> 5.1"
|
||||
gem "tomlrb", "~> 1.2"
|
||||
|
||||
platform :ruby, :mswin, :mingw, :x64_mingw do
|
||||
@@ -77,7 +83,8 @@ group :jekyll_optional_dependencies do
|
||||
gem "liquid-c", "~> 3.0"
|
||||
gem "pygments.rb", "~> 1.0"
|
||||
gem "rdiscount", "~> 2.0"
|
||||
gem "yajl-ruby", "~> 1.3"
|
||||
gem "redcarpet", "~> 3.2", ">= 3.2.3"
|
||||
gem "yajl-ruby", "~> 1.3.1"
|
||||
end
|
||||
|
||||
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
||||
|
||||
@@ -1,42 +1,24 @@
|
||||
## HEAD
|
||||
## 3.8.4 / 2018-09-18
|
||||
|
||||
### Documentation
|
||||
### Bug Fixes
|
||||
|
||||
* Release post for v3.8.0 (#6849)
|
||||
* Add Installation Instructions for Ubuntu (#6925)
|
||||
* add liquid tag jekyll-flickr (#6946)
|
||||
* Add 4.0 development post (#6934)
|
||||
* Updated copy - fixed casing of SaaS on resources page. (#6949)
|
||||
* WIP: Do not advise users to install Jekyll outside of Bundler (#6927)
|
||||
* Don't prompt for sudo when installing with Ubuntu WSL (#6781)
|
||||
* Fix typo (#6969)
|
||||
* Add version number for group_by_exp doc (#6956)
|
||||
* Update Windows install docs (#6926)
|
||||
* Remove documentation for using Redcarpet (#6990)
|
||||
* security: fix `include` bypass of `EntryFilter#filter` symlink check (#7228)
|
||||
|
||||
### Minor Enhancements
|
||||
## 3.8.3 / 2018-06-05
|
||||
|
||||
* use jekyll-compose if installed (#6932)
|
||||
* Memoize computing excerpt's relative_path (#6951)
|
||||
* Liquefied link tag (#6269)
|
||||
* Suggest re-running command with --trace on fail (#6551)
|
||||
### Bug Fixes
|
||||
|
||||
### Major Enhancements
|
||||
* Fix --unpublished not affecting collection documents (#7027)
|
||||
|
||||
* Remove unused error class (#6511)
|
||||
* Drop support for Ruby 2.1 and 2.2 (#6560)
|
||||
* Add vendor folder to a newly installed site's .gitignore (#6968)
|
||||
* bump i18n (#6931)
|
||||
* We are not using Ruby 2.2 anymore (#6977)
|
||||
* Drop support for older versions of Rouge (#6978)
|
||||
* Remove support for Redcarpet (#6987)
|
||||
## 3.8.2 / 2018-05-18
|
||||
|
||||
### Development Fixes
|
||||
|
||||
* Remove unnecessary Jekyll::Page constant (#6770)
|
||||
* Loggers should accept both numbers and symbols (#6967)
|
||||
* Update instructions for releasing docs Gem (#6975)
|
||||
* yajl-ruby update to v1.4.0 (#6976)
|
||||
* Update rubocop version (#7016)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Add whitespace control to LIQUID_TAG_REGEX (#7015)
|
||||
|
||||
## 3.8.1 / 2018-05-01
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@ environment:
|
||||
TEST_SUITE: "test"
|
||||
- RUBY_FOLDER_VER: "23"
|
||||
TEST_SUITE: "test"
|
||||
- RUBY_FOLDER_VER: "22"
|
||||
TEST_SUITE: "test"
|
||||
|
||||
test_script:
|
||||
- ruby --version
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
version: 3.8.1
|
||||
version: 3.8.4
|
||||
name: Jekyll • Simple, blog-aware, static sites
|
||||
description: Transform your plain text into static websites and blogs
|
||||
url: https://jekyllrb.com
|
||||
|
||||
@@ -689,6 +689,11 @@ liquid:
|
||||
strict_variables: false
|
||||
|
||||
# Markdown Processors
|
||||
rdiscount:
|
||||
extensions: []
|
||||
|
||||
redcarpet:
|
||||
extensions: []
|
||||
|
||||
kramdown:
|
||||
auto_ids: true
|
||||
@@ -723,6 +728,50 @@ mutually exclusive.
|
||||
The various Markdown renderers supported by Jekyll sometimes have extra options
|
||||
available.
|
||||
|
||||
### Redcarpet
|
||||
|
||||
Redcarpet can be configured by providing an `extensions` sub-setting, whose
|
||||
value should be an array of strings. Each string should be the name of one of
|
||||
the `Redcarpet::Markdown` class's extensions; if present in the array, it will
|
||||
set the corresponding extension to `true`.
|
||||
|
||||
Jekyll handles two special Redcarpet extensions:
|
||||
|
||||
- `no_fenced_code_blocks` --- By default, Jekyll sets the `fenced_code_blocks`
|
||||
extension (for delimiting code blocks with triple tildes or triple backticks)
|
||||
to `true`, probably because GitHub's eager adoption of them is starting to make
|
||||
them inescapable. Redcarpet's normal `fenced_code_blocks` extension is inert
|
||||
when used with Jekyll; instead, you can use this inverted version of the
|
||||
extension for disabling fenced code.
|
||||
|
||||
Note that you can also specify a language for highlighting after the first
|
||||
delimiter:
|
||||
|
||||
```ruby
|
||||
# ...ruby code
|
||||
```
|
||||
|
||||
With both fenced code blocks and highlighter enabled, this will statically
|
||||
highlight the code; without any syntax highlighter, it will add a
|
||||
`class="LANGUAGE"` attribute to the `<code>` element, which can be used as a
|
||||
hint by various JavaScript code highlighting libraries.
|
||||
|
||||
- `smart` --- This pseudo-extension turns on SmartyPants, which converts
|
||||
straight quotes to curly quotes and runs of hyphens to em (`---`) and en (`--`) dashes.
|
||||
|
||||
All other extensions retain their usual names from Redcarpet, and no renderer
|
||||
options aside from `smart` can be specified in Jekyll. [A list of available
|
||||
extensions can be found in the Redcarpet README file.][redcarpet_extensions]
|
||||
Make sure you're looking at the README for the right version of
|
||||
Redcarpet: Jekyll currently uses v3.2.x. The most commonly used
|
||||
extensions are:
|
||||
|
||||
- `tables`
|
||||
- `no_intra_emphasis`
|
||||
- `autolink`
|
||||
|
||||
[redcarpet_extensions]: https://github.com/vmg/redcarpet/blob/v3.2.2/README.markdown#and-its-like-really-simple-to-use
|
||||
|
||||
### Custom Markdown Processors
|
||||
|
||||
If you're interested in creating a custom markdown processor, you're in luck! Create a new class in the `Jekyll::Converters::Markdown` namespace:
|
||||
|
||||
@@ -4,6 +4,38 @@ permalink: "/docs/history/"
|
||||
note: This file is autogenerated. Edit /History.markdown instead.
|
||||
---
|
||||
|
||||
## 3.8.4 / 2018-09-18
|
||||
{: #v3-8-4}
|
||||
|
||||
### Bug Fixes
|
||||
{: #bug-fixes-v3-8-4}
|
||||
|
||||
- security: fix `include` bypass of `EntryFilter#filter` symlink check ([#7228]({{ site.repository }}/issues/7228))
|
||||
|
||||
|
||||
## 3.8.3 / 2018-06-05
|
||||
{: #v3-8-3}
|
||||
|
||||
### Bug Fixes
|
||||
{: #bug-fixes-v3-8-3}
|
||||
|
||||
- Fix --unpublished not affecting collection documents ([#7027]({{ site.repository }}/issues/7027))
|
||||
|
||||
|
||||
## 3.8.2 / 2018-05-18
|
||||
{: #v3-8-2}
|
||||
|
||||
### Development Fixes
|
||||
{: #development-fixes-v3-8-2}
|
||||
|
||||
- Update rubocop version ([#7016]({{ site.repository }}/issues/7016))
|
||||
|
||||
### Bug Fixes
|
||||
{: #bug-fixes-v3-8-2}
|
||||
|
||||
- Add whitespace control to LIQUID_TAG_REGEX ([#7015]({{ site.repository }}/issues/7015))
|
||||
|
||||
|
||||
## 3.8.1 / 2018-05-01
|
||||
{: #v3-8-1}
|
||||
|
||||
|
||||
@@ -4,15 +4,13 @@ description: Official guide to install Jekyll on macOS, GNU/Linux or Windows.
|
||||
permalink: /docs/installation/
|
||||
---
|
||||
|
||||
Jekyll is a [Ruby Gem](http://guides.rubygems.org/rubygems-basics/), and can be
|
||||
installed on most systems.
|
||||
|
||||
- [Requirements](#requirements)
|
||||
- [Install Jekyll on macOS](#macOS)
|
||||
- [Install Jekyll on Ubuntu Linux](#ubuntu)
|
||||
- [Install Jekyll on Windows](../windows/)
|
||||
- [Install on macOS](#macOS)
|
||||
- [Install on Windows](../windows/)
|
||||
- [Upgrade Jekyll](#upgrade-jekyll)
|
||||
|
||||
Installing Jekyll should be straight-forward if your system meets the requirements.
|
||||
|
||||
## Requirements
|
||||
|
||||
Before you start, make sure your system has the following:
|
||||
@@ -113,35 +111,6 @@ Check out the [troubleshooting](../troubleshooting/) page or
|
||||
|
||||
</div>
|
||||
|
||||
## Install on Ubuntu Linux {#ubuntu}
|
||||
|
||||
Before we install Jekyll, we need to make sure we have all the required
|
||||
dependencies.
|
||||
|
||||
```sh
|
||||
sudo apt-get install ruby ruby-dev build-essential
|
||||
```
|
||||
|
||||
It is best to avoid installing Ruby Gems as the root user. Therefore, we need to
|
||||
set up a gem installation directory for your user account. The following
|
||||
commands will add environment variables to your `~/.bashrc` file to configure
|
||||
the gem installation path. Run them now:
|
||||
|
||||
```sh
|
||||
echo '# Install Ruby Gems to ~/gems' >> ~/.bashrc
|
||||
echo 'export GEM_HOME=$HOME/gems' >> ~/.bashrc
|
||||
echo 'export PATH=$HOME/gems/bin:$PATH' >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
Finally, install Jekyll:
|
||||
|
||||
```sh
|
||||
gem install jekyll bundler
|
||||
```
|
||||
|
||||
That's it! You're ready to start using Jekyll.
|
||||
|
||||
## Upgrade Jekyll
|
||||
|
||||
Before you start developing with Jekyll, you may want to check that you're up to date with the latest version. To find the currently installed version of Jekyll, run one of these commands:
|
||||
|
||||
@@ -69,14 +69,6 @@ And then, you're done! :tada: Feel free to celebrate!
|
||||
|
||||
If you have access to the [@jekyllrb](https://twitter.com/jekyllrb) Twitter account, you should tweet the release post from there. If not, just ask another maintainer to do it or to give you access.
|
||||
|
||||
### Build the docs
|
||||
|
||||
We package our documentation as a :gem: Gem for offline use.
|
||||
|
||||
This is done with the
|
||||
[**jekyll-docs**](https://github.com/jekyll/jekyll-docs#building) repository,
|
||||
and more detailed instructions are provided there.
|
||||
|
||||
## For non-core gems
|
||||
|
||||
If you're not a maintainer for `jekyll/jekyll`, the procedure is much simpler in a lot of cases. Generally, the procedure still looks like this:
|
||||
|
||||
@@ -886,7 +886,6 @@ You can find a few useful plugins at the following locations:
|
||||
- [jekyll-html](https://github.com/kacperduras/jekyll-html): A Jekyll plugin to use HTML tags in Jekyll pages, posts and collections.
|
||||
- [jekyll-onebox](https://github.com/rriemann/jekyll-onebox): Liquid tag for displaying HTML previews (embeds) for links to popular domains. Plugin is based on [Onebox](https://github.com/discourse/onebox) that powers link previews in [Discourse](http://github.com/discourse/discourse) forums.
|
||||
- [jekyll-w2m](https://github.com/kacperduras/jekyll-w2m): A Jekyll plugin to liberate content from Microsoft Word documents (powered by [word-to-markdown](https://github.com/benbalter/word-to-markdown)).
|
||||
- [jekyll-flickr](https://github.com/rriemann/jekyll-flickr): Liquid tag for responsive Flickr images using HTML5 srcset. Subtitles and automatic license notices are supported.
|
||||
|
||||
#### Collections
|
||||
|
||||
|
||||
@@ -26,15 +26,13 @@ If you encounter any unexpected errors during the above, please refer to the [tr
|
||||
|
||||
## About Bundler
|
||||
|
||||
`gem install bundler` installs the [bundler](https://rubygems.org/gems/bundler) gem through [RubyGems](https://rubygems.org/). You only need to install it once — not every time you create a new Jekyll project. Here are some additional details:
|
||||
`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:
|
||||
|
||||
* `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`.
|
||||
|
||||
* 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.
|
||||
|
||||
For more information about how to use Bundler in your Jekyll project, this [tutorial](https://jekyllrb.com/tutorials/using-jekyll-with-bundler/) should provide answers to the most common questions and explain how to get up and running quickly.
|
||||
|
||||
## Options for creating a new site with Jekyll
|
||||
|
||||
`jekyll new <PATH>` 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:
|
||||
|
||||
@@ -25,7 +25,7 @@ Jekyll's growing use is producing a wide variety of tutorials, frameworks, exten
|
||||
|
||||
## Integrations
|
||||
|
||||
- Use a SaaS service as a backend for forms (contact forms, hiring forms, etc.)
|
||||
- Use a saas service as a backend for forms (contact forms, hiring forms, etc.)
|
||||
|
||||
- [Formspree (open source)](https://formspree.io/)
|
||||
- [FormKeep](https://formkeep.com/guides/contact-form-jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=contact-form-jekyll)
|
||||
|
||||
@@ -147,8 +147,7 @@ you come up with your own tags via plugins.
|
||||
<tr>
|
||||
<td>
|
||||
<p class="name"><strong>Where Expression</strong></p>
|
||||
<p>Select all the objects in an array where the expression is true.
|
||||
{% include docs_version_badge.html version="3.2.0" %}</p>
|
||||
<p>Select all the objects in an array where the expression is true. Jekyll v3.2.0 & later.</p>
|
||||
</td>
|
||||
<td class="align-center">
|
||||
<p>
|
||||
@@ -179,8 +178,7 @@ you come up with your own tags via plugins.
|
||||
<tr>
|
||||
<td>
|
||||
<p class="name"><strong>Group By Expression</strong></p>
|
||||
<p>Group an array's items using a Liquid expression.
|
||||
{% include docs_version_badge.html version="3.4.0" %}</p>
|
||||
<p>Group an array's items using a Liquid expression.</p>
|
||||
</td>
|
||||
<td class="align-center">
|
||||
<p>
|
||||
@@ -588,23 +586,6 @@ One major benefit of using the `link` or `post_url` tag is link validation. If t
|
||||
|
||||
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.
|
||||
|
||||
The name of the file you want to link 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 link:
|
||||
|
||||
```liquid
|
||||
{% raw %}{% link {{ page.my_variable }} %}{% endraw %}
|
||||
```
|
||||
|
||||
In this example, the link would add link to the file `footer_company_a.html`.
|
||||
|
||||
### Linking to posts
|
||||
|
||||
If you want to include a link to a post on your site, the `post_url` tag will generate the correct permalink URL for the post you specify.
|
||||
|
||||
@@ -7,72 +7,13 @@ While Windows is not an officially-supported platform, it can be used to run Jek
|
||||
|
||||
|
||||
## Installing Jekyll
|
||||
The easiest way to run Jekyll is by using the [RubyInstaller][] for Windows.
|
||||
|
||||
### Installation via RubyInstaller
|
||||
|
||||
[RubyInstaller][] is a self-contained Windows-based installer that includes the Ruby language, an execution environment, important documentation, and more.
|
||||
We only cover RubyInstaller-2.4 and newer here, older versions need to [install the Devkit][Devkit-install] manually.
|
||||
|
||||
1. Download and Install a **Ruby+Devkit** version from [RubyInstaller Downloads][RubyInstaller-downloads].
|
||||
Use default options for installation.
|
||||
2. Open a new command prompt window from the start menu, so that changes to the `PATH` environment variable becomes effective.
|
||||
Install Jekyll and Bundler via: `gem install jekyll bundler`
|
||||
3. Check if Jekyll installed properly: `jekyll -v`
|
||||
|
||||
That's it, you're ready to install our [default minimal blog theme](https://github.com/jekyll/minima) with `jekyll new jekyll-website`.
|
||||
|
||||
[RubyInstaller]: https://rubyinstaller.org/
|
||||
[RubyInstaller-downloads]: https://rubyinstaller.org/downloads/
|
||||
[Devkit-install]: https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
|
||||
If you are using Windows 10 Anniversary Update, the easiest way to run Jekyll is by [installing][WSL-Guide] the new Bash on Ubuntu on Windows.
|
||||
|
||||
|
||||
### Encoding
|
||||
### Installation via Bash on Windows 10
|
||||
|
||||
If you use UTF-8 encoding, make sure that no `BOM` header characters exist in your files or very, very bad things will happen to
|
||||
Jekyll. This is especially relevant when you're running Jekyll on Windows.
|
||||
|
||||
Additionally, you might need to change the code page of the console window to UTF-8 in case you get a "Liquid Exception: Incompatible character encoding" error during the site generation process. It can be done with the following command:
|
||||
|
||||
```sh
|
||||
chcp 65001
|
||||
```
|
||||
|
||||
|
||||
### Time-Zone Management
|
||||
|
||||
Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00.
|
||||
Though Windows users could alternatively define their blog's timezone by setting the key to use POSIX format of defining timezones, it wasn't as user-friendly when it came to having the clock altered to changing DST-rules.
|
||||
|
||||
Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database][IANA-database].
|
||||
While 'new' blogs created with Jekyll v3.4 and greater, will have the following added to their 'Gemfile' by default, existing sites *will* have to update their 'Gemfile' (and installed) to enable development on Windows:
|
||||
|
||||
```ruby
|
||||
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
||||
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
|
||||
```
|
||||
|
||||
[IANA-database]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
|
||||
### Auto Regeneration
|
||||
|
||||
Jekyll uses the `listen` gem to watch for changes when the `--watch` switch is specified during a build or serve. While `listen` has built-in support for UNIX systems, it may require an extra gem for compatibility with Windows.
|
||||
|
||||
Add the following to the Gemfile for your site if you have issues with auto-regeneration on Windows alone:
|
||||
|
||||
```ruby
|
||||
gem 'wdm', '~> 0.1.1' if Gem.win_platform?
|
||||
```
|
||||
|
||||
You have to use a [Ruby+Devkit](https://rubyinstaller.org/downloads/) version of the RubyInstaller.
|
||||
|
||||
|
||||
## Installation via Bash on Windows 10
|
||||
|
||||
If you are using Windows 10 version 1607 or later, another option to run Jekyll is by [installing][WSL-Guide] the Windows Subsystem for Linux.
|
||||
|
||||
|
||||
*Note:* You must have [Windows Subsystem for Linux][BASH-WSL] enabled.
|
||||
*Note:* You must have [Bash on Ubuntu on Windows][BASH-WSL] enabled.
|
||||
|
||||
First let's make sure all our packages / repositories are up to date. Open a new Command Prompt instance, and type the following:
|
||||
|
||||
@@ -110,12 +51,6 @@ Check if Jekyll installed properly by running:
|
||||
jekyll -v
|
||||
```
|
||||
|
||||
Configure the bundler/gem path so bundle doesn't prompt for sudo
|
||||
|
||||
```sh
|
||||
bundle config path vendor/bundle
|
||||
```
|
||||
|
||||
**And that's it!**
|
||||
|
||||
To start a new project named `my_blog`, just run:
|
||||
@@ -136,3 +71,148 @@ You can make sure time management is working properly by inspecting your `_posts
|
||||
[WSL-Guide]: https://msdn.microsoft.com/en-us/commandline/wsl/install_guide
|
||||
[BASH-WSL]: https://msdn.microsoft.com/en-us/commandline/wsl/about
|
||||
|
||||
|
||||
### Installation via RubyInstaller
|
||||
|
||||
[RubyInstaller][] is a self-contained Windows-based installer that includes the Ruby language, an execution environment, important documentation, and more.
|
||||
|
||||
1. Download and Install a package manager version from [RubyInstaller Downloads][RubyInstaller-downloads].
|
||||
2. Install Jekyll and Bundler via a command prompt window: `gem install jekyll bundler`
|
||||
3. Check if Jekyll installed properly: `jekyll -v`
|
||||
|
||||
[RubyInstaller]: https://rubyinstaller.org/
|
||||
[RubyInstaller-downloads]: https://rubyinstaller.org/downloads/
|
||||
|
||||
|
||||
### Installation via Chocolatey
|
||||
|
||||
A quick way to install Jekyll using Chocolatey is to follow the [installation instructions by David Burela](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/):
|
||||
|
||||
1. Install a package manager for Windows called [Chocolatey][]
|
||||
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
|
||||
|
||||
|
||||
### Installing *github-pages* via Chocolatey
|
||||
|
||||
This section is part of an article written by [Jens Willmer][jwillmerPost]. To follow the instructions you need to have [Chocolatey][] installed on your system. If you already have a version of Ruby installed you need to uninstall it before you can continue.
|
||||
|
||||
|
||||
#### Install Ruby and Ruby development kit
|
||||
|
||||
Open a command prompt and execute the following commands:
|
||||
|
||||
* `choco install ruby -version 2.2.4`
|
||||
* `choco install ruby2.devkit` - _needed for compilation of json gem_
|
||||
|
||||
|
||||
#### Configure Ruby development kit
|
||||
|
||||
The development kit did not set the environment path for Ruby so we need to do it.
|
||||
|
||||
* Open command prompt in `C:\tools\DevKit2`
|
||||
* Execute `ruby dk.rb init` to create a file called `config.yml`
|
||||
* Edit the `config.yml` file and include the path to Ruby `- C:/tools/ruby22`
|
||||
* Execute the following command to set the path: `ruby dk.rb install`
|
||||
|
||||
|
||||
#### Nokogiri gem installation
|
||||
|
||||
This gem is also needed in the github-pages and to get it running on Windows x64 we have to install a few things.
|
||||
|
||||
**Note:** In the current [pre release][nokogiriFails] it works out of the box with Windows x64 but this version is not referenced in the github-pages.
|
||||
|
||||
```sh
|
||||
choco install libxml2 -Source "https://www.nuget.org/api/v2/"
|
||||
|
||||
choco install libxslt -Source "https://www.nuget.org/api/v2/"
|
||||
|
||||
choco install libiconv -Source "https://www.nuget.org/api/v2/
|
||||
|
||||
gem install nokogiri --^
|
||||
--with-xml2-include=C:\Chocolatey\lib\libxml2.2.7.8.7\build\native\include^
|
||||
--with-xml2-lib=C:\Chocolatey\lib\libxml2.redist.2.7.8.7\build\native\bin\v110\x64\Release\dynamic\cdecl^
|
||||
--with-iconv-include=C:\Chocolatey\lib\libiconv.1.14.0.11\build\native\include^
|
||||
--with-iconv-lib=C:\Chocolatey\lib\libiconv.redist.1.14.0.11\build\native\bin\v110\x64\Release\dynamic\cdecl^
|
||||
--with-xslt-include=C:\Chocolatey\lib\libxslt.1.1.28.0\build\native\include^
|
||||
--with-xslt-lib=C:\Chocolatey\lib\libxslt.redist.1.1.28.0\build\native\bin\v110\x64\Release\dynamic
|
||||
```
|
||||
|
||||
#### Install github-pages
|
||||
|
||||
* Open command prompt and install [Bundler][]: `gem install bundler`
|
||||
* Create a file called `Gemfile` without any extension in your root directory of your blog
|
||||
* Copy & paste the two lines into the file:
|
||||
|
||||
|
||||
```ruby
|
||||
source 'https://rubygems.org'
|
||||
gem 'github-pages', group: :jekyll_plugins
|
||||
```
|
||||
|
||||
* **Note:** We use an unsecure connection because SSL throws exceptions in the version of Ruby
|
||||
* Open a command prompt, target your local blog repository root, and install github-pages: `bundle install`
|
||||
|
||||
|
||||
After this process you should have github-pages installed on your system and you can host your blog again with `jekyll s`.
|
||||
There will be a warning on startup that you should include `gem 'wdm', '>= 0.1.0' if Gem.win_platform?` to your `Gemfile` but I could not get `jekyll s` working if I include that line so for the moment I ignore that warning.
|
||||
|
||||
In the future the installation process of the github-pages should be as simple as the setup of the blog. But as long as the new version of the Nokogiri ([v1.6.8][nokogiriReleases]) is not stable and referenced, it is work to get it up and running on Windows.
|
||||
|
||||
[jwillmerPost]: https://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46 "Installation instructions by Jens Willmer"
|
||||
[Chocolatey]: https://chocolatey.org/install "Package manager for Windows"
|
||||
[nokogiriFails]: https://github.com/sparklemotion/nokogiri/issues/1456#issuecomment-206481794 "Nokogiri fails to install on Ruby 2.3 for Windows"
|
||||
[Bundler]: http://bundler.io/ "Ruby Dependencie Manager"
|
||||
[nokogiriReleases]: https://github.com/sparklemotion/nokogiri/releases "Nokogiri Releases"
|
||||
|
||||
For a more conventional way of installing Jekyll you can follow this [complete guide to install Jekyll 3 on Windows by Sverrir Sigmundarson][windows-installjekyll3].
|
||||
|
||||
Optionally you can use [Autoinstall Jekyll for Windows][fastjekyll-autoinstall].
|
||||
|
||||
[windows-installjekyll3]: https://labs.sverrirs.com/jekyll/
|
||||
[fastjekyll-autoinstall]: https://github.com/KeJunMao/fastjekyll#autoinstall-jekyll-for-windows
|
||||
|
||||
|
||||
## Encoding
|
||||
|
||||
If you use UTF-8 encoding, make sure that no `BOM` header characters exist in your files or very, very bad things will happen to
|
||||
Jekyll. This is especially relevant when you're running Jekyll on Windows.
|
||||
|
||||
Additionally, you might need to change the code page of the console window to UTF-8 in case you get a "Liquid Exception: Incompatible character encoding" error during the site generation process. It can be done with the following command:
|
||||
|
||||
```sh
|
||||
chcp 65001
|
||||
```
|
||||
|
||||
|
||||
## Time-Zone Management
|
||||
|
||||
Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00.
|
||||
Though Windows users could alternatively define their blog's timezone by setting the key to use POSIX format of defining timezones, it wasn't as user-friendly when it came to having the clock altered to changing DST-rules.
|
||||
|
||||
Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database][IANA-database].
|
||||
While 'new' blogs created with Jekyll v3.4 and greater, will have the following added to their 'Gemfile' by default, existing sites *will* have to update their 'Gemfile' (and installed) to enable development on Windows:
|
||||
|
||||
```ruby
|
||||
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
||||
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
|
||||
```
|
||||
|
||||
[IANA-database]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
|
||||
|
||||
## Auto Regeneration
|
||||
|
||||
Jekyll uses the `listen` gem to watch for changes when the `--watch` switch is specified during a build or serve. While `listen` has built-in support for UNIX systems, it may require an extra gem for compatibility with Windows.
|
||||
|
||||
Add the following to the Gemfile for your site if you have issues with auto-regeneration on Windows alone:
|
||||
|
||||
```ruby
|
||||
gem 'wdm', '~> 0.1.1' if Gem.win_platform?
|
||||
```
|
||||
|
||||
You may first have to download and install the [Ruby DevKit](https://rubyinstaller.org/downloads/) by following [the instructions here](https://github.com/oneclick/rubyinstaller/wiki/Development-Kit).
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
---
|
||||
title: "Jekyll 4.0 is on the Horizon!"
|
||||
date: "2018-04-19 16:07:00 +0100"
|
||||
author: oe
|
||||
categories: [community]
|
||||
---
|
||||
|
||||
With the release of Jekyll 3.8.0, it's been 2 and a half years since the last major release. Jekyll 3.0.0 was released in late October of 2015! That's a long time ago, and we've been working towards the next major release of Jekyll for a couple of months now. Here's a small preview of what's to come:
|
||||
|
||||
- Dropping support for Ruby 2.1 and 2.2. Both versions have reached their EOL period.
|
||||
- Dropping Pygments as a dependency. We're already defaulting to Rouge, and this removes the implicit Python dependency. (finally!)
|
||||
- Making the `link` tag use relative URLs. This is a big breaking change, but it's the cleaner solution.
|
||||
|
||||
We're open to more ideas, though. If the development cost isn't too high, or if someone volunteers to take care of the implementation, it's likely that your suggestion might make it into Jekyll 4.0. Head over to this [issue] for more details. Some interesting topics might be improving Internationalization support in Jekyll, creating convenience Liquid tags, et cetera.
|
||||
|
||||
That being said, the development period of version 4.0 begins _now_. This means a couple of things:
|
||||
|
||||
- New features will only be implemented in Jekyll 4.0. There will be no 3.9.0 or the like.
|
||||
- Same with bug fixes, unless they concern something introduced in Jekyll 3.7 or 3.8, in which case we will backport the fixes and release a patch version.
|
||||
- Now is a great time to finally take on the feature you've wanted to see in Jekyll for ages! Just open an issue or experiment with the code to get going!
|
||||
|
||||
As for a release date, we're currently aiming for late summer, around September or so. However, keep in mind that this project is purely volunteer-run, and as such, delays might occur and we might not hit that release date.
|
||||
|
||||
Finally, this is a great time for newcomers to open-source to make their first contribution. We'll be doing our best to mark recommended contributions and create newcomer-friendly issues, as well as to provide mentoring throughout the contribution process (although we'd like to think that we're already pretty proficient at that). So if you've always been hestitant about contributing to a large open-source project, Jekyll is a good place to start!
|
||||
|
||||
Happy Jekylling! :wave:
|
||||
|
||||
[issue]: https://github.com/jekyll/jekyll/issues/6948
|
||||
@@ -1,43 +0,0 @@
|
||||
---
|
||||
title: 'Jekyll 3.8.0 Released'
|
||||
date: 2018-04-19 19:45:15 +0530
|
||||
author: ashmaroli
|
||||
version: 3.8.0
|
||||
categories: [release]
|
||||
---
|
||||
|
||||
Aloha Jekyllers!! :wave:
|
||||
|
||||
After months of toiling on the codebase and shipping a couple of release-candidates, the Jekyll Team is delighted to finally
|
||||
present `v3.8.0`, packed with optimizations, improvements, some new features and a couple of bug-fixes. Yay!!!
|
||||
|
||||
Under the hood, Jekyll has undergone many minor changes that will allow it to run more performantly in the coming years. :smiley:
|
||||
Rest assured, our users should see minor improvements in their site's build times.
|
||||
|
||||
Speaking of improvements, users running a site containing a huge amount of posts or those who like to use our `where` filter
|
||||
frequently in a single template, are going to see a massive reduction in their total build times!! :tada:
|
||||
|
||||
Hold on, this version is not just about optimizations, there are some new features as well..:
|
||||
* Detect non-existent variables and filters specified in a template by enabling `strict_variables` and `strict_filters` under the
|
||||
`liquid` key in your config file.
|
||||
* Allow *date filters* to output ordinal days.
|
||||
* `jekyll doctor` now warns you if you have opted for custom `collections_dir` but placed `_posts` directory outside that
|
||||
directory.
|
||||
|
||||
..and yes, a couple of bug-fixes, notably:
|
||||
* Jekyll now handles future-dated documents properly.
|
||||
* Jekyll is able to handle Liquid blocks intelligently in excerpts.
|
||||
* A few methods that were *not meant to be publically accessible* have been entombed properly.
|
||||
* A few bugs that still plagued our `collections_dir` feature from `v3.7` got crushed.
|
||||
|
||||
As always, the full list of changes since last release can be viewed [here](/docs/history/#v3-8-0).
|
||||
|
||||
A big thanks to the following people who contributed to our repository with pull-requests that improved our codebase, documentation
|
||||
and tests:
|
||||
|
||||
Ana María Martínez Gómez, Antonio Argote, Ashwin Maroli, Awjin Ahn, Ben Balter, Benjamin Høegh, Christian Oliff, Damien Solodow,
|
||||
David Zhang, Delson Lima, Eric Cornelissen, Florian Thomas, Frank Taillandier, Heinrich Hartmann, Jakob Vad Nielsen, John Eismeier,
|
||||
Kacper Duras, KajMagnus, Mario Cekic, Max Vilimpoc, Michael H, Mike Kasberg, Parker Moore, Pat Hawks, Paweł Kuna, Robert Riemann,
|
||||
Roger Rohrbach, Semen Zhydenko, Stefan Dellmuth, Tim Carry, olivia, and steelman.
|
||||
|
||||
Happy Jekylling!! :sparkles:
|
||||
19
docs/_posts/2018-05-18-jekyll-3-8-2-released.markdown
Normal file
19
docs/_posts/2018-05-18-jekyll-3-8-2-released.markdown
Normal file
@@ -0,0 +1,19 @@
|
||||
---
|
||||
title: 'Jekyll 3.8.2 Released'
|
||||
date: 2018-05-19 10:30:00 -0500
|
||||
author: pathawks
|
||||
version: 3.8.2
|
||||
categories: [release]
|
||||
---
|
||||
|
||||
Hello Jekyllers!!
|
||||
|
||||
Today we are releasing `v3.8.2`, which fixes the way Jekyll generates excerpts
|
||||
for posts when the first paragraph of the post contains Liquid tags that take
|
||||
advantage of [Liquid's whitespace control feature][Liquid whitespace].
|
||||
|
||||
Big thanks to @kylebarbour, who first reported this issue and also very quickly
|
||||
submitted a fix. Also thanks to @nickskalkin for making sure that we are using
|
||||
the latest version of Rubocop to lint our code.
|
||||
|
||||
[Liquid whitespace]: https://shopify.github.io/liquid/basics/whitespace/
|
||||
13
docs/_posts/2018-06-04-jekyll-3-8-3-released.markdown
Normal file
13
docs/_posts/2018-06-04-jekyll-3-8-3-released.markdown
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
title: 'Jekyll 3.8.3 Released'
|
||||
date: 2018-06-05 09:00:00 -0500
|
||||
author: pathawks
|
||||
version: 3.8.3
|
||||
categories: [release]
|
||||
---
|
||||
|
||||
This release fixes a regression in 3.8 where collections with `published: false`
|
||||
do not show when using the `--unpublished` flag.
|
||||
|
||||
Thanks to @philipbelesky for reporting and fixing this issue; collections with
|
||||
`published: false` now behave the same way as Posts.
|
||||
@@ -45,7 +45,7 @@ overview: true
|
||||
<p class="line">
|
||||
<span class="path">~</span>
|
||||
<span class="prompt">$</span>
|
||||
<span class="command">gem install bundler jekyll</span>
|
||||
<span class="command">gem install jekyll bundler</span>
|
||||
</p>
|
||||
<p class="line">
|
||||
<span class="path">~</span>
|
||||
|
||||
@@ -1 +1 @@
|
||||
3.8.1
|
||||
3.8.4
|
||||
|
||||
@@ -263,6 +263,104 @@ Feature: Collections
|
||||
And the "_site/puppies/snowy.html" file should not exist
|
||||
And the "_site/puppies/hardy.html" file should not exist
|
||||
|
||||
Scenario: Access rendered collection with future date and unpublished flag via Liquid
|
||||
Given I have a _puppies directory
|
||||
And I have the following documents under the puppies collection:
|
||||
| title | date | content | published |
|
||||
| Rover | 2007-12-31 | content for Rover. | true |
|
||||
| Figor | 2007-12-31 | content for Figor. | false |
|
||||
| Snowy | 2199-12-31 | content for Snowy. | true |
|
||||
| Hardy | 2199-12-31 | content for Hardy. | false |
|
||||
And I have a "_config.yml" file with content:
|
||||
"""
|
||||
collections:
|
||||
puppies:
|
||||
output: true
|
||||
"""
|
||||
And I have a "index.md" page that contains "{% for puppy in site.puppies %}<div>{{ puppy.title }}</div>{% endfor %}"
|
||||
When I run jekyll build
|
||||
Then I should get a zero exit status
|
||||
And the _site directory should exist
|
||||
And I should see "<div>Rover</div>" in "_site/index.html"
|
||||
But I should see "<div>Snowy</div>" in "_site/index.html"
|
||||
And I should not see "<div>Figor</div>" in "_site/index.html"
|
||||
And I should not see "<div>Hardy</div>" in "_site/index.html"
|
||||
And the "_site/puppies/rover.html" file should exist
|
||||
And the "_site/puppies/snowy.html" file should not exist
|
||||
And the "_site/puppies/figor.html" file should not exist
|
||||
And the "_site/puppies/hardy.html" file should not exist
|
||||
When I run jekyll build --unpublished
|
||||
Then I should get a zero exit status
|
||||
And the _site directory should exist
|
||||
And I should see "<div>Rover</div>" in "_site/index.html"
|
||||
And I should see "<div>Snowy</div>" in "_site/index.html"
|
||||
And I should see "<div>Figor</div>" in "_site/index.html"
|
||||
But I should see "<div>Hardy</div>" in "_site/index.html"
|
||||
And the "_site/puppies/rover.html" file should exist
|
||||
And the "_site/puppies/snowy.html" file should not exist
|
||||
And the "_site/puppies/figor.html" file should exist
|
||||
And the "_site/puppies/hardy.html" file should not exist
|
||||
When I run jekyll build --unpublished --future
|
||||
Then I should get a zero exit status
|
||||
And the _site directory should exist
|
||||
And I should see "<div>Rover</div>" in "_site/index.html"
|
||||
And I should see "<div>Snowy</div>" in "_site/index.html"
|
||||
And I should see "<div>Figor</div>" in "_site/index.html"
|
||||
But I should see "<div>Hardy</div>" in "_site/index.html"
|
||||
And the "_site/puppies/rover.html" file should exist
|
||||
And the "_site/puppies/snowy.html" file should exist
|
||||
And the "_site/puppies/figor.html" file should exist
|
||||
And the "_site/puppies/hardy.html" file should exist
|
||||
|
||||
Scenario: Access unrendered collection with future date and unpublished flag via Liquid
|
||||
Given I have a _puppies directory
|
||||
And I have the following documents under the puppies collection:
|
||||
| title | date | content | published |
|
||||
| Rover | 2007-12-31 | content for Rover. | true |
|
||||
| Figor | 2007-12-31 | content for Figor. | false |
|
||||
| Snowy | 2199-12-31 | content for Snowy. | true |
|
||||
| Hardy | 2199-12-31 | content for Hardy. | false |
|
||||
And I have a "_config.yml" file with content:
|
||||
"""
|
||||
collections:
|
||||
puppies:
|
||||
output: false
|
||||
"""
|
||||
And I have a "index.md" page that contains "{% for puppy in site.puppies %}<div>{{ puppy.title }}</div>{% endfor %}"
|
||||
When I run jekyll build
|
||||
Then I should get a zero exit status
|
||||
And the _site directory should exist
|
||||
And I should see "<div>Rover</div>" in "_site/index.html"
|
||||
But I should see "<div>Snowy</div>" in "_site/index.html"
|
||||
And I should not see "<div>Figor</div>" in "_site/index.html"
|
||||
And I should not see "<div>Hardy</div>" in "_site/index.html"
|
||||
And the "_site/puppies/rover.html" file should not exist
|
||||
And the "_site/puppies/snowy.html" file should not exist
|
||||
And the "_site/puppies/figor.html" file should not exist
|
||||
And the "_site/puppies/hardy.html" file should not exist
|
||||
When I run jekyll build --unpublished
|
||||
Then I should get a zero exit status
|
||||
And the _site directory should exist
|
||||
And I should see "<div>Rover</div>" in "_site/index.html"
|
||||
And I should see "<div>Snowy</div>" in "_site/index.html"
|
||||
And I should see "<div>Figor</div>" in "_site/index.html"
|
||||
But I should see "<div>Hardy</div>" in "_site/index.html"
|
||||
And the "_site/puppies/rover.html" file should not exist
|
||||
And the "_site/puppies/snowy.html" file should not exist
|
||||
And the "_site/puppies/figor.html" file should not exist
|
||||
And the "_site/puppies/hardy.html" file should not exist
|
||||
When I run jekyll build --unpublished --future
|
||||
Then I should get a zero exit status
|
||||
And the _site directory should exist
|
||||
And I should see "<div>Rover</div>" in "_site/index.html"
|
||||
And I should see "<div>Snowy</div>" in "_site/index.html"
|
||||
And I should see "<div>Figor</div>" in "_site/index.html"
|
||||
But I should see "<div>Hardy</div>" in "_site/index.html"
|
||||
And the "_site/puppies/rover.html" file should not exist
|
||||
And the "_site/puppies/snowy.html" file should not exist
|
||||
And the "_site/puppies/figor.html" file should not exist
|
||||
And the "_site/puppies/hardy.html" file should not exist
|
||||
|
||||
Scenario: All the documents
|
||||
Given I have an "index.html" page that contains "All documents: {% for doc in site.documents %}{{ doc.relative_path }} {% endfor %}"
|
||||
And I have fixture collections
|
||||
|
||||
@@ -81,6 +81,14 @@ Feature: Site configuration
|
||||
And the _site directory should exist
|
||||
And I should see "<a href=\"https://www.google.com\">Google</a>" in "_site/index.html"
|
||||
|
||||
Scenario: Use Redcarpet for markup
|
||||
Given I have an "index.markdown" page that contains "[Google](https://www.google.com)"
|
||||
And I have a configuration file with "markdown" set to "redcarpet"
|
||||
When I run jekyll build
|
||||
Then I should get a zero exit status
|
||||
And the _site directory should exist
|
||||
And I should see "<a href=\"https://www.google.com\">Google</a>" in "_site/index.html"
|
||||
|
||||
Scenario: Highlight code with pygments
|
||||
Given I have an "index.html" page that contains "{% highlight ruby %} puts 'Hello world!' {% endhighlight %}"
|
||||
When I run jekyll build
|
||||
|
||||
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
||||
s.specification_version = 2 if s.respond_to? :specification_version=
|
||||
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
||||
s.rubygems_version = "2.2.2"
|
||||
s.required_ruby_version = ">= 2.3.0"
|
||||
s.required_ruby_version = ">= 2.1.0"
|
||||
|
||||
s.name = "jekyll"
|
||||
s.version = Jekyll::VERSION
|
||||
@@ -33,13 +33,14 @@ Gem::Specification.new do |s|
|
||||
s.add_runtime_dependency("addressable", "~> 2.4")
|
||||
s.add_runtime_dependency("colorator", "~> 1.0")
|
||||
s.add_runtime_dependency("em-websocket", "~> 0.5")
|
||||
s.add_runtime_dependency("i18n", "~> 1.0")
|
||||
s.add_runtime_dependency("i18n", "~> 0.7")
|
||||
s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0")
|
||||
s.add_runtime_dependency("jekyll-watch", "~> 2.0")
|
||||
s.add_runtime_dependency("kramdown", "~> 1.14")
|
||||
s.add_runtime_dependency("liquid", "~> 4.0")
|
||||
s.add_runtime_dependency("mercenary", "~> 0.3.3")
|
||||
s.add_runtime_dependency("pathutil", "~> 0.9")
|
||||
s.add_runtime_dependency("rouge", "~> 3.0")
|
||||
rouge_versions = ENV["ROUGE_VERSION"] ? ["~> #{ENV["ROUGE_VERSION"]}"] : [">= 1.7", "< 4"]
|
||||
s.add_runtime_dependency("rouge", *rouge_versions)
|
||||
s.add_runtime_dependency("safe_yaml", "~> 1.0")
|
||||
end
|
||||
|
||||
@@ -212,7 +212,9 @@ module Jekyll
|
||||
def read_document(full_path)
|
||||
doc = Document.new(full_path, :site => site, :collection => self)
|
||||
doc.read
|
||||
docs << doc unless doc.data["published"] == false
|
||||
if site.unpublished || doc.published?
|
||||
docs << doc
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -73,30 +73,6 @@ module Jekyll
|
||||
"Fail if errors are present in front matter"
|
||||
end
|
||||
# rubocop:enable Metrics/MethodLength
|
||||
|
||||
# Run ::process method in a given set of Jekyll::Command subclasses and suggest
|
||||
# re-running the associated command with --trace switch to obtain any additional
|
||||
# information or backtrace regarding the encountered Exception.
|
||||
#
|
||||
# cmd - the Jekyll::Command to be handled
|
||||
# options - configuration overrides
|
||||
# klass - an array of Jekyll::Command subclasses associated with the command
|
||||
#
|
||||
# Note that all exceptions are rescued..
|
||||
# rubocop: disable RescueException
|
||||
def process_with_graceful_fail(cmd, options, *klass)
|
||||
klass.each { |k| k.process(options) if k.respond_to?(:process) }
|
||||
rescue Exception => e
|
||||
raise e if cmd.trace
|
||||
|
||||
msg = " Please append `--trace` to the `#{cmd.name}` command "
|
||||
dashes = "-" * msg.length
|
||||
Jekyll.logger.error "", dashes
|
||||
Jekyll.logger.error "Jekyll #{Jekyll::VERSION} ", msg
|
||||
Jekyll.logger.error "", " for any additional information or backtrace. "
|
||||
Jekyll.logger.abort_with "", dashes
|
||||
end
|
||||
# rubocop: enable RescueException
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -15,7 +15,7 @@ module Jekyll
|
||||
|
||||
c.action do |_, options|
|
||||
options["serving"] = false
|
||||
process_with_graceful_fail(c, options, self)
|
||||
Jekyll::Commands::Build.process(options)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -72,21 +72,29 @@ module Jekyll
|
||||
opts["serving"] = true
|
||||
opts["watch"] = true unless opts.key?("watch")
|
||||
|
||||
# Set the reactor to nil so any old reactor will be GCed.
|
||||
# We can't unregister a hook so while running tests we don't want to
|
||||
# inadvertently keep using a reactor created by a previous test.
|
||||
@reload_reactor = nil
|
||||
|
||||
config = configuration_from_options(opts)
|
||||
config["url"] = default_url(config) if Jekyll.env == "development"
|
||||
|
||||
process_with_graceful_fail(cmd, config, Build, Serve)
|
||||
start(opts)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
|
||||
def start(opts)
|
||||
# Set the reactor to nil so any old reactor will be GCed.
|
||||
# We can't unregister a hook so in testing when Serve.start is
|
||||
# called multiple times we don't want to inadvertently keep using
|
||||
# a reactor created by a previous test when our test might not
|
||||
@reload_reactor = nil
|
||||
|
||||
config = configuration_from_options(opts)
|
||||
if Jekyll.env == "development"
|
||||
config["url"] = default_url(config)
|
||||
end
|
||||
[Build, Serve].each { |klass| klass.process(config) }
|
||||
end
|
||||
|
||||
#
|
||||
|
||||
def process(opts)
|
||||
opts = configuration_from_options(opts)
|
||||
destination = opts["destination"]
|
||||
|
||||
@@ -70,6 +70,10 @@ module Jekyll
|
||||
"extensions" => [],
|
||||
},
|
||||
|
||||
"redcarpet" => {
|
||||
"extensions" => [],
|
||||
},
|
||||
|
||||
"kramdown" => {
|
||||
"auto_ids" => true,
|
||||
"toc_levels" => "1..6",
|
||||
|
||||
@@ -30,6 +30,7 @@ module Jekyll
|
||||
# rubocop:disable Naming/AccessorMethodName
|
||||
def get_processor
|
||||
case @config["markdown"].downcase
|
||||
when "redcarpet" then return RedcarpetParser.new(@config)
|
||||
when "kramdown" then return KramdownParser.new(@config)
|
||||
when "rdiscount" then return RDiscountParser.new(@config)
|
||||
else
|
||||
@@ -43,7 +44,7 @@ module Jekyll
|
||||
# are not in safe mode.)
|
||||
|
||||
def valid_processors
|
||||
%w(rdiscount kramdown) + third_party_processors
|
||||
%w(rdiscount kramdown redcarpet) + third_party_processors
|
||||
end
|
||||
|
||||
# Public: A list of processors that you provide via plugins.
|
||||
@@ -52,7 +53,7 @@ module Jekyll
|
||||
|
||||
def third_party_processors
|
||||
self.class.constants - \
|
||||
%w(KramdownParser RDiscountParser PRIORITIES).map(
|
||||
%w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map(
|
||||
&:to_sym
|
||||
)
|
||||
end
|
||||
|
||||
112
lib/jekyll/converters/markdown/redcarpet_parser.rb
Normal file
112
lib/jekyll/converters/markdown/redcarpet_parser.rb
Normal file
@@ -0,0 +1,112 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Jekyll::Converters::Markdown::RedcarpetParser
|
||||
module CommonMethods
|
||||
def add_code_tags(code, lang)
|
||||
code = code.to_s
|
||||
code = code.sub(
|
||||
%r!<pre>!,
|
||||
"<pre><code class=\"language-#{lang}\" data-lang=\"#{lang}\">"
|
||||
)
|
||||
code = code.sub(%r!</pre>!, "</code></pre>")
|
||||
code
|
||||
end
|
||||
end
|
||||
|
||||
module WithPygments
|
||||
include CommonMethods
|
||||
def block_code(code, lang)
|
||||
unless defined?(Pygments)
|
||||
Jekyll::External.require_with_graceful_fail("pygments")
|
||||
end
|
||||
lang = lang && lang.split.first || "text"
|
||||
add_code_tags(
|
||||
Pygments.highlight(
|
||||
code,
|
||||
{
|
||||
:lexer => lang,
|
||||
:options => { :encoding => "utf-8" },
|
||||
}
|
||||
),
|
||||
lang
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
module WithoutHighlighting
|
||||
require "cgi"
|
||||
|
||||
include CommonMethods
|
||||
|
||||
def code_wrap(code)
|
||||
"<figure class=\"highlight\"><pre>#{CGI.escapeHTML(code)}</pre></figure>"
|
||||
end
|
||||
|
||||
def block_code(code, lang)
|
||||
lang = lang && lang.split.first || "text"
|
||||
add_code_tags(code_wrap(code), lang)
|
||||
end
|
||||
end
|
||||
|
||||
module WithRouge
|
||||
def block_code(_code, lang)
|
||||
code = "<pre>#{super}</pre>"
|
||||
|
||||
"<div class=\"highlight\">#{add_code_tags(code, lang)}</div>"
|
||||
end
|
||||
|
||||
protected
|
||||
def rouge_formatter(_lexer)
|
||||
Jekyll::Utils::Rouge.html_formatter(:wrap => false)
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(config)
|
||||
unless defined?(Redcarpet)
|
||||
Jekyll::External.require_with_graceful_fail("redcarpet")
|
||||
end
|
||||
@config = config
|
||||
@redcarpet_extensions = {}
|
||||
@config["redcarpet"]["extensions"].each do |e|
|
||||
@redcarpet_extensions[e.to_sym] = true
|
||||
end
|
||||
|
||||
@renderer ||= class_with_proper_highlighter(@config["highlighter"])
|
||||
end
|
||||
|
||||
def class_with_proper_highlighter(highlighter)
|
||||
Class.new(Redcarpet::Render::HTML) do
|
||||
case highlighter
|
||||
when "pygments"
|
||||
include WithPygments
|
||||
when "rouge"
|
||||
Jekyll::External.require_with_graceful_fail(%w(
|
||||
rouge rouge/plugins/redcarpet
|
||||
))
|
||||
|
||||
unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0")
|
||||
abort "Please install Rouge 1.3.0 or greater and try running Jekyll again."
|
||||
end
|
||||
|
||||
include Rouge::Plugins::Redcarpet
|
||||
include CommonMethods
|
||||
include WithRouge
|
||||
else
|
||||
include WithoutHighlighting
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def convert(content)
|
||||
@redcarpet_extensions[:fenced_code_blocks] = \
|
||||
!@redcarpet_extensions[:no_fenced_code_blocks]
|
||||
if @redcarpet_extensions[:smart]
|
||||
@renderer.send :include, Redcarpet::Render::SmartyPants
|
||||
end
|
||||
markdown = Redcarpet::Markdown.new(
|
||||
@renderer.new(@redcarpet_extensions),
|
||||
@redcarpet_extensions
|
||||
)
|
||||
markdown.render(content)
|
||||
end
|
||||
end
|
||||
@@ -31,9 +31,12 @@ module Jekyll
|
||||
|
||||
def filter(entries)
|
||||
entries.reject do |e|
|
||||
unless included?(e)
|
||||
special?(e) || backup?(e) || excluded?(e) || symlink?(e)
|
||||
end
|
||||
# Reject this entry if it is a symlink.
|
||||
next true if symlink?(e)
|
||||
# Do not reject this entry if it is included.
|
||||
next false if included?(e)
|
||||
# Reject this entry if it is special, a backup file, or excluded.
|
||||
special?(e) || backup?(e) || excluded?(e)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ module Jekyll
|
||||
#
|
||||
# Returns the relative_path for the doc this excerpt belongs to with #excerpt appended
|
||||
def relative_path
|
||||
@relative_path ||= File.join(doc.relative_path, "#excerpt")
|
||||
File.join(doc.relative_path, "#excerpt")
|
||||
end
|
||||
|
||||
# Check if excerpt includes a string
|
||||
@@ -128,7 +128,7 @@ module Jekyll
|
||||
#
|
||||
# Returns excerpt String
|
||||
|
||||
LIQUID_TAG_REGEX = %r!{%\s*(\w+).+\s*%}!m
|
||||
LIQUID_TAG_REGEX = %r!{%-?\s*(\w+).+\s*-?%}!m
|
||||
MKDWN_LINK_REF_REGEX = %r!^ {0,3}\[[^\]]+\]:.+$!
|
||||
|
||||
def extract_excerpt(doc_content)
|
||||
@@ -141,7 +141,7 @@ module Jekyll
|
||||
head =~ LIQUID_TAG_REGEX
|
||||
tag_name = Regexp.last_match(1)
|
||||
|
||||
if liquid_block?(tag_name) && head.match(%r!{%\s*end#{tag_name}\s*%}!).nil?
|
||||
if liquid_block?(tag_name) && head.match(%r!{%-?\s*end#{tag_name}\s*-?%}!).nil?
|
||||
print_build_warning
|
||||
head << "\n{% end#{tag_name} %}"
|
||||
end
|
||||
@@ -158,6 +158,11 @@ module Jekyll
|
||||
|
||||
def liquid_block?(tag_name)
|
||||
Liquid::Template.tags[tag_name].superclass == Liquid::Block
|
||||
rescue NoMethodError
|
||||
Jekyll.logger.error "Error:",
|
||||
"A Liquid tag in the excerpt of #{doc.relative_path} couldn't be " \
|
||||
"parsed."
|
||||
raise
|
||||
end
|
||||
|
||||
def print_build_warning
|
||||
|
||||
@@ -9,7 +9,6 @@ module Jekyll
|
||||
#
|
||||
def blessed_gems
|
||||
%w(
|
||||
jekyll-compose
|
||||
jekyll-docs
|
||||
jekyll-import
|
||||
)
|
||||
|
||||
@@ -21,7 +21,12 @@ module Jekyll
|
||||
end
|
||||
|
||||
def file(filename)
|
||||
Jekyll.logger.info "FILENAME:", filename
|
||||
filename.match(filename_regex)
|
||||
|
||||
Jekyll.logger.info "CAPTURES:", Regexp.last_match.captures
|
||||
puts
|
||||
|
||||
filename =
|
||||
if Regexp.last_match(1) == theme_dir("")
|
||||
::File.join(::File.basename(Regexp.last_match(1)), Regexp.last_match(2))
|
||||
|
||||
@@ -29,9 +29,7 @@ module Jekyll
|
||||
#
|
||||
# Returns nothing
|
||||
def log_level=(level)
|
||||
writer.level = level if level.is_a?(Integer) && level.between?(0, 3)
|
||||
writer.level = LOG_LEVELS[level] ||
|
||||
raise(ArgumentError, "unknown log level")
|
||||
writer.level = LOG_LEVELS.fetch(level)
|
||||
@level = level
|
||||
end
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@ module Jekyll
|
||||
|
||||
alias_method :extname, :ext
|
||||
|
||||
FORWARD_SLASH = "/".freeze
|
||||
|
||||
# Attributes for Liquid templates
|
||||
ATTRIBUTES_FOR_LIQUID = %w(
|
||||
content
|
||||
@@ -62,11 +64,11 @@ module Jekyll
|
||||
#
|
||||
# Returns the String destination directory.
|
||||
def dir
|
||||
if url.end_with?("/")
|
||||
if url.end_with?(FORWARD_SLASH)
|
||||
url
|
||||
else
|
||||
url_dir = File.dirname(url)
|
||||
url_dir.end_with?("/") ? url_dir : "#{url_dir}/"
|
||||
url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -112,8 +112,7 @@ MSG
|
||||
end
|
||||
|
||||
def render_rouge(code)
|
||||
require "rouge"
|
||||
formatter = ::Rouge::Formatters::HTMLLegacy.new(
|
||||
formatter = Jekyll::Utils::Rouge.html_formatter(
|
||||
:line_numbers => @highlight_options[:linenos],
|
||||
:wrap => false,
|
||||
:css_class => "highlight",
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
module Jekyll
|
||||
module Tags
|
||||
class IncludeTagError < StandardError
|
||||
attr_accessor :path
|
||||
|
||||
def initialize(msg, path)
|
||||
super(msg)
|
||||
@path = path
|
||||
end
|
||||
end
|
||||
|
||||
class IncludeTag < Liquid::Tag
|
||||
VALID_SYNTAX = %r!
|
||||
([\w-]+)\s*=\s*
|
||||
|
||||
@@ -18,17 +18,14 @@ module Jekyll
|
||||
def render(context)
|
||||
site = context.registers[:site]
|
||||
|
||||
liquid = site.liquid_renderer.file("(jekyll:link)")
|
||||
relative_path = liquid.parse(@relative_path).render(context)
|
||||
|
||||
site.each_site_file do |item|
|
||||
return item.url if item.relative_path == relative_path
|
||||
return item.url if item.relative_path == @relative_path
|
||||
# This takes care of the case for static files that have a leading /
|
||||
return item.url if item.relative_path == "/#{relative_path}"
|
||||
return item.url if item.relative_path == "/#{@relative_path}"
|
||||
end
|
||||
|
||||
raise ArgumentError, <<-MSG
|
||||
Could not find document '#{relative_path}' in tag '#{self.class.tag_name}'.
|
||||
Could not find document '#{@relative_path}' in tag '#{self.class.tag_name}'.
|
||||
|
||||
Make sure the document exists and the path is correct.
|
||||
MSG
|
||||
|
||||
@@ -7,6 +7,7 @@ module Jekyll
|
||||
autoload :Exec, "jekyll/utils/exec"
|
||||
autoload :Internet, "jekyll/utils/internet"
|
||||
autoload :Platforms, "jekyll/utils/platforms"
|
||||
autoload :Rouge, "jekyll/utils/rouge"
|
||||
autoload :ThreadEvent, "jekyll/utils/thread_event"
|
||||
autoload :WinTZ, "jekyll/utils/win_tz"
|
||||
|
||||
|
||||
22
lib/jekyll/utils/rouge.rb
Normal file
22
lib/jekyll/utils/rouge.rb
Normal file
@@ -0,0 +1,22 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
Jekyll::External.require_with_graceful_fail("rouge")
|
||||
|
||||
module Jekyll
|
||||
module Utils
|
||||
module Rouge
|
||||
|
||||
def self.html_formatter(*args)
|
||||
if old_api?
|
||||
::Rouge::Formatters::HTML.new(*args)
|
||||
else
|
||||
::Rouge::Formatters::HTMLLegacy.new(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def self.old_api?
|
||||
::Rouge.version.to_s < "2"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,5 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Jekyll
|
||||
VERSION = "3.8.1".freeze
|
||||
VERSION = "3.8.4".freeze
|
||||
end
|
||||
|
||||
1
lib/site_template/.gitignore
vendored
1
lib/site_template/.gitignore
vendored
@@ -1,4 +1,3 @@
|
||||
_site
|
||||
.sass-cache
|
||||
.jekyll-metadata
|
||||
vendor
|
||||
|
||||
25
rake/docs.rake
Normal file
25
rake/docs.rake
Normal file
@@ -0,0 +1,25 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
#############################################################################
|
||||
#
|
||||
# Packaging tasks for jekyll-docs
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
namespace :docs do
|
||||
desc "Release #{docs_name} v#{version}"
|
||||
task :release => :build do
|
||||
unless `git branch` =~ %r!^\* master$!
|
||||
puts "You must be on the master branch to release!"
|
||||
exit!
|
||||
end
|
||||
sh "gem push pkg/#{docs_name}-#{version}.gem"
|
||||
end
|
||||
|
||||
desc "Build #{docs_name} v#{version} into pkg/"
|
||||
task :build do
|
||||
mkdir_p "pkg"
|
||||
sh "gem build #{docs_name}.gemspec"
|
||||
sh "mv #{docs_name}-#{version}.gem pkg"
|
||||
end
|
||||
end
|
||||
@@ -36,6 +36,7 @@ Jekyll.logger = Logger.new(StringIO.new, :error)
|
||||
|
||||
unless jruby?
|
||||
require "rdiscount"
|
||||
require "redcarpet"
|
||||
end
|
||||
|
||||
require "kramdown"
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title: LIQUID_TAG_REGEX excerpt whitespace control test
|
||||
layout: post
|
||||
---
|
||||
|
||||
{%- for post in site.posts -%}
|
||||
You are in a maze of twisty little passages, all alike.
|
||||
There's lots more to say about this, but that's enough for now.
|
||||
{%- endfor -%}
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
title: LIQUID_TAG_REGEX excerpt whitespace control test
|
||||
layout: post
|
||||
---
|
||||
|
||||
{%- assign xyzzy = 'You are in a maze of twisty little passages, all alike.' %}
|
||||
{{- xyzzy -}}
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: LIQUID_TAG_REGEX excerpt whitespace control test
|
||||
layout: post
|
||||
---
|
||||
|
||||
{%- for post in site.posts -%}
|
||||
You are in a maze of twisty little passages, all alike.
|
||||
|
||||
There's lots more to say about this, but that's enough for now.
|
||||
{%- endfor -%}
|
||||
1
test/source/symlink-test/symlinked-file-outside-source
Symbolic link
1
test/source/symlink-test/symlinked-file-outside-source
Symbolic link
@@ -0,0 +1 @@
|
||||
/etc/passwd
|
||||
@@ -5,7 +5,7 @@ require "helper"
|
||||
class TestEntryFilter < JekyllUnitTest
|
||||
context "Filtering entries" do
|
||||
setup do
|
||||
@site = Site.new(site_configuration)
|
||||
@site = fixture_site
|
||||
end
|
||||
|
||||
should "filter entries" do
|
||||
@@ -87,7 +87,7 @@ class TestEntryFilter < JekyllUnitTest
|
||||
# no support for symlinks on Windows
|
||||
skip_if_windows "Jekyll does not currently support symlinks on Windows."
|
||||
|
||||
site = Site.new(site_configuration("safe" => true))
|
||||
site = fixture_site("safe" => true)
|
||||
site.reader.read_directories("symlink-test")
|
||||
|
||||
assert_equal %w(main.scss symlinked-file).length, site.pages.length
|
||||
@@ -99,11 +99,22 @@ class TestEntryFilter < JekyllUnitTest
|
||||
# no support for symlinks on Windows
|
||||
skip_if_windows "Jekyll does not currently support symlinks on Windows."
|
||||
|
||||
site = Site.new(site_configuration)
|
||||
@site.reader.read_directories("symlink-test")
|
||||
refute_equal [], @site.pages
|
||||
refute_equal [], @site.static_files
|
||||
end
|
||||
|
||||
should "include only safe symlinks in safe mode even when included" do
|
||||
# no support for symlinks on Windows
|
||||
skip_if_windows "Jekyll does not currently support symlinks on Windows."
|
||||
|
||||
site = fixture_site("safe" => true, "include" => ["symlinked-file-outside-source"])
|
||||
site.reader.read_directories("symlink-test")
|
||||
refute_equal [], site.pages
|
||||
refute_equal [], site.static_files
|
||||
|
||||
# rubocop:disable Performance/FixedSize
|
||||
assert_equal %w(main.scss symlinked-file).length, site.pages.length
|
||||
refute_includes site.static_files.map(&:name), "symlinked-file-outside-source"
|
||||
# rubocop:enable Performance/FixedSize
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -212,4 +212,56 @@ class TestExcerpt < JekyllUnitTest
|
||||
assert_equal true, @excerpt.is_a?(Jekyll::Excerpt)
|
||||
end
|
||||
end
|
||||
|
||||
context "An excerpt with non-closed but valid Liquid block tag with whitespace control" do
|
||||
setup do
|
||||
clear_dest
|
||||
@site = fixture_site
|
||||
@post = setup_post("2018-05-15-open-liquid-block-excerpt-whitespace-control.md")
|
||||
@excerpt = @post.data["excerpt"]
|
||||
|
||||
assert_includes @post.content, "{%- for"
|
||||
refute_includes @post.content.split("\n\n")[0], "{%- endfor -%}"
|
||||
end
|
||||
|
||||
should "be appended to as necessary and generated" do
|
||||
assert_includes @excerpt.content, "{% endfor %}"
|
||||
refute_includes @excerpt.content, "{% endfor %}\n\n{% endfor %}"
|
||||
assert_equal true, @excerpt.is_a?(Jekyll::Excerpt)
|
||||
end
|
||||
end
|
||||
|
||||
context "An excerpt with valid closed Liquid block tag with whitespace control" do
|
||||
setup do
|
||||
clear_dest
|
||||
@site = fixture_site
|
||||
@post = setup_post("2018-05-15-closed-liquid-block-excerpt-whitespace-control.md")
|
||||
@excerpt = @post.data["excerpt"]
|
||||
|
||||
assert_includes @post.content, "{%- for"
|
||||
assert_includes @post.content.split("\n\n")[0], "{%- endfor -%}"
|
||||
end
|
||||
|
||||
should "not be appended to but generated as is" do
|
||||
assert_includes @excerpt.content, "{%- endfor -%}"
|
||||
refute_includes @excerpt.content, "{% endfor %}\n\n{% endfor %}"
|
||||
assert_equal true, @excerpt.is_a?(Jekyll::Excerpt)
|
||||
end
|
||||
end
|
||||
|
||||
context "An excerpt with valid Liquid variable with whitespace control" do
|
||||
setup do
|
||||
clear_dest
|
||||
@site = fixture_site
|
||||
@post = setup_post("2018-05-15-excerpt-whitespace-control-variable.md")
|
||||
@excerpt = @post.data["excerpt"]
|
||||
|
||||
assert_includes @post.content, "{%- assign"
|
||||
end
|
||||
|
||||
should "not be appended to but generated as is" do
|
||||
assert_includes @excerpt.content, "{{- xyzzy -}}"
|
||||
assert_equal true, @excerpt.is_a?(Jekyll::Excerpt)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -16,7 +16,7 @@ class TestGeneratedSite < JekyllUnitTest
|
||||
end
|
||||
|
||||
should "ensure post count is as expected" do
|
||||
assert_equal 54, @site.posts.size
|
||||
assert_equal 57, @site.posts.size
|
||||
end
|
||||
|
||||
should "insert site.posts into the index" do
|
||||
|
||||
@@ -20,7 +20,7 @@ class TestKramdown < JekyllUnitTest
|
||||
"bold_every" => 8,
|
||||
"css" => :class,
|
||||
"css_class" => "highlight",
|
||||
"formatter" => ::Rouge::Formatters::HTMLLegacy,
|
||||
"formatter" => Jekyll::Utils::Rouge.html_formatter.class,
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -91,7 +91,8 @@ class TestKramdown < JekyllUnitTest
|
||||
puts "Hello World"
|
||||
~~~
|
||||
MARKDOWN
|
||||
div_highlight = ">div.highlight"
|
||||
div_highlight = ""
|
||||
div_highlight = ">div.highlight" unless Utils::Rouge.old_api?
|
||||
selector = "div.highlighter-rouge#{div_highlight}>pre.highlight>code"
|
||||
refute result.css(selector).empty?
|
||||
end
|
||||
|
||||
@@ -31,5 +31,51 @@ class TestLayoutReader < JekyllUnitTest
|
||||
assert_equal LayoutReader.new(@site).layout_directory, source_dir("blah/_layouts")
|
||||
end
|
||||
end
|
||||
|
||||
context "when a layout is a symlink" do
|
||||
setup do
|
||||
FileUtils.ln_sf("/etc/passwd", source_dir("_layouts", "symlink.html"))
|
||||
@site = fixture_site(
|
||||
"safe" => true,
|
||||
"include" => ["symlink.html"]
|
||||
)
|
||||
end
|
||||
|
||||
teardown do
|
||||
FileUtils.rm(source_dir("_layouts", "symlink.html"))
|
||||
end
|
||||
|
||||
should "only read the layouts which are in the site" do
|
||||
skip_if_windows "Jekyll does not currently support symlinks on Windows."
|
||||
|
||||
layouts = LayoutReader.new(@site).read
|
||||
|
||||
refute layouts.key?("symlink"), "Should not read the symlinked layout"
|
||||
end
|
||||
end
|
||||
|
||||
context "with a theme" do
|
||||
setup do
|
||||
FileUtils.ln_sf("/etc/passwd", theme_dir("_layouts", "theme-symlink.html"))
|
||||
@site = fixture_site(
|
||||
"include" => ["theme-symlink.html"],
|
||||
"theme" => "test-theme",
|
||||
"safe" => true
|
||||
)
|
||||
end
|
||||
|
||||
teardown do
|
||||
FileUtils.rm(theme_dir("_layouts", "theme-symlink.html"))
|
||||
end
|
||||
|
||||
should "not read a symlink'd theme" do
|
||||
skip_if_windows "Jekyll does not currently support symlinks on Windows."
|
||||
|
||||
layouts = LayoutReader.new(@site).read
|
||||
|
||||
refute layouts.key?("theme-symlink"), \
|
||||
"Should not read symlinked layout from theme"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
94
test/test_redcarpet.rb
Normal file
94
test/test_redcarpet.rb
Normal file
@@ -0,0 +1,94 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "helper"
|
||||
|
||||
class TestRedcarpet < JekyllUnitTest
|
||||
context "redcarpet" do
|
||||
setup do
|
||||
if jruby?
|
||||
then skip(
|
||||
"JRuby does not perform well with CExt, test disabled."
|
||||
)
|
||||
end
|
||||
|
||||
@config = {
|
||||
"markdown" => "redcarpet",
|
||||
"redcarpet" => {
|
||||
"extensions" => %w(smart strikethrough filter_html),
|
||||
},
|
||||
}
|
||||
|
||||
@markdown = Converters::Markdown.new @config
|
||||
|
||||
@sample = Jekyll::Utils.strip_heredoc(<<-EOS
|
||||
```ruby
|
||||
puts "Hello world"
|
||||
```
|
||||
EOS
|
||||
)
|
||||
end
|
||||
|
||||
should "pass redcarpet options" do
|
||||
assert_equal "<h1>Some Header</h1>", @markdown.convert("# Some Header #").strip
|
||||
end
|
||||
|
||||
should "pass redcarpet SmartyPants options" do
|
||||
assert_equal "<p>“smart”</p>", @markdown.convert('"smart"').strip
|
||||
end
|
||||
|
||||
should "pass redcarpet extensions" do
|
||||
assert_equal "<p><del>deleted</del></p>", @markdown.convert("~~deleted~~").strip
|
||||
end
|
||||
|
||||
should "pass redcarpet render options" do
|
||||
assert_equal "<p><strong>bad code not here</strong>: i am bad</p>",
|
||||
@markdown.convert("**bad code not here**: <script>i am bad</script>").strip
|
||||
end
|
||||
|
||||
context "with pygments enabled" do
|
||||
setup do
|
||||
@markdown = Converters::Markdown.new @config.merge(
|
||||
{ "highlighter" => "pygments" }
|
||||
)
|
||||
end
|
||||
|
||||
should "render fenced code blocks with syntax highlighting" do
|
||||
assert_equal(
|
||||
%(<div class="highlight"><pre><code class="language-ruby" ) +
|
||||
%(data-lang="ruby"><span></span><span class="nb">puts</span> <span ) +
|
||||
%(class="s2">"Hello world"</span>\n</code></pre></div>),
|
||||
@markdown.convert(@sample).strip
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "with rouge enabled" do
|
||||
setup do
|
||||
@markdown = Converters::Markdown.new @config.merge({ "highlighter" => "rouge" })
|
||||
end
|
||||
|
||||
should "render fenced code blocks with syntax highlighting" do
|
||||
assert_equal(
|
||||
%(<div class="highlight"><pre><code class="language-ruby" ) +
|
||||
%(data-lang="ruby"><span class="nb">puts</span> <span ) +
|
||||
%(class="s2">"Hello world"</span>\n</code></pre></div>),
|
||||
@markdown.convert(@sample).strip
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "without any highlighter" do
|
||||
setup do
|
||||
@markdown = Converters::Markdown.new @config.merge({ "highlighter" => nil })
|
||||
end
|
||||
|
||||
should "render fenced code blocks without syntax highlighting" do
|
||||
assert_equal(
|
||||
%(<figure class="highlight"><pre><code class="language-ruby" ) +
|
||||
%(data-lang="ruby">puts "Hello world"\n</code></pre></figure>),
|
||||
@markdown.convert(@sample).strip
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -323,7 +323,8 @@ EOS
|
||||
)
|
||||
end
|
||||
|
||||
should "render markdown with rouge with line numbers" do
|
||||
should "render markdown with rouge 2 with line numbers" do
|
||||
skip "Skipped because using an older version of Rouge" if Utils::Rouge.old_api?
|
||||
assert_match(
|
||||
%(<table class="rouge-table"><tbody>) +
|
||||
%(<tr><td class="gutter gl">) +
|
||||
@@ -333,6 +334,18 @@ EOS
|
||||
@result
|
||||
)
|
||||
end
|
||||
|
||||
should "render markdown with rouge 1 with line numbers" do
|
||||
skip "Skipped because using a newer version of Rouge" unless Utils::Rouge.old_api?
|
||||
assert_match(
|
||||
%(<table style="border-spacing: 0"><tbody>) +
|
||||
%(<tr><td class="gutter gl" style="text-align: right">) +
|
||||
%(<pre class="lineno">1</pre></td>) +
|
||||
%(<td class="code"><pre>test<span class="w">\n</span></pre></td></tr>) +
|
||||
%(</tbody></table>),
|
||||
@result
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "post content has raw tag" do
|
||||
@@ -351,7 +364,18 @@ CONTENT
|
||||
create_post(content)
|
||||
end
|
||||
|
||||
should "render markdown with rouge" do
|
||||
should "render markdown with rouge 1" do
|
||||
skip "Skipped because using a newer version of Rouge" unless Utils::Rouge.old_api?
|
||||
|
||||
assert_match(
|
||||
%(<div class="language-liquid highlighter-rouge"><pre class="highlight"><code>),
|
||||
@result
|
||||
)
|
||||
end
|
||||
|
||||
should "render markdown with rouge 2" do
|
||||
skip "Skipped because using an older version of Rouge" if Utils::Rouge.old_api?
|
||||
|
||||
assert_match(
|
||||
%(<div class="language-liquid highlighter-rouge">) +
|
||||
%(<div class="highlight"><pre class="highlight"><code>),
|
||||
@@ -447,12 +471,24 @@ This should not be highlighted, right?
|
||||
EOS
|
||||
end
|
||||
|
||||
should "should stop highlighting at boundary with rouge" do
|
||||
should "should stop highlighting at boundary with rouge 2" do
|
||||
skip "Skipped because using an older version of Rouge" if Utils::Rouge.old_api?
|
||||
expected = <<-EOS
|
||||
<p>This is not yet highlighted</p>\n
|
||||
<figure class="highlight"><pre><code class="language-php" data-lang="php"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
|
||||
</pre></td><td class="code"><pre><span class="nx">test</span></pre></td></tr></tbody></table></code></pre></figure>\n
|
||||
<p>This should not be highlighted, right?</p>
|
||||
EOS
|
||||
assert_match(expected, @result)
|
||||
end
|
||||
|
||||
should "should stop highlighting at boundary with rouge 1" do
|
||||
skip "Skipped because using a newer version of Rouge" unless Utils::Rouge.old_api?
|
||||
expected = <<-EOS
|
||||
<p>This is not yet highlighted</p>\n
|
||||
<figure class="highlight"><pre><code class="language-php" data-lang="php"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre>test<span class="w">
|
||||
</span></pre></td></tr></tbody></table></code></pre></figure>\n
|
||||
<p>This should not be highlighted, right?</p>
|
||||
EOS
|
||||
assert_match(expected, @result)
|
||||
end
|
||||
@@ -494,7 +530,7 @@ EOS
|
||||
setup do
|
||||
@content = <<CONTENT
|
||||
---
|
||||
title: Kramdown vs. RDiscount
|
||||
title: Kramdown vs. RDiscount vs. Redcarpet
|
||||
---
|
||||
|
||||
_FIGHT!_
|
||||
@@ -536,6 +572,25 @@ CONTENT
|
||||
assert_match %r!<em>FINISH HIM</em>!, @result
|
||||
end
|
||||
end
|
||||
|
||||
context "using Redcarpet" do
|
||||
setup do
|
||||
if jruby?
|
||||
skip(
|
||||
"JRuby does not perform well with CExt, test disabled."
|
||||
)
|
||||
end
|
||||
|
||||
create_post(@content, {
|
||||
"markdown" => "redcarpet",
|
||||
})
|
||||
end
|
||||
|
||||
should "parse correctly" do
|
||||
assert_match %r{<em>FIGHT!</em>}, @result
|
||||
assert_match %r!<em>FINISH HIM</em>!, @result
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "simple page with post linking" do
|
||||
@@ -734,45 +789,6 @@ CONTENT
|
||||
end
|
||||
end
|
||||
|
||||
context "simple page with dynamic linking to a page" do
|
||||
setup do
|
||||
content = <<CONTENT
|
||||
---
|
||||
title: linking
|
||||
---
|
||||
|
||||
{% assign contacts_filename = 'contacts' %}
|
||||
{% assign contacts_ext = 'html' %}
|
||||
{% link {{contacts_filename}}.{{contacts_ext}} %}
|
||||
{% assign info_path = 'info.md' %}
|
||||
{% link {{\ info_path\ }} %}
|
||||
{% assign screen_css_path = '/css' %}
|
||||
{% link {{ screen_css_path }}/screen.css %}
|
||||
CONTENT
|
||||
create_post(content, {
|
||||
"source" => source_dir,
|
||||
"destination" => dest_dir,
|
||||
"read_all" => true,
|
||||
})
|
||||
end
|
||||
|
||||
should "not cause an error" do
|
||||
refute_match(%r!markdown\-html\-error!, @result)
|
||||
end
|
||||
|
||||
should "have the URL to the 'contacts' item" do
|
||||
assert_match(%r!/contacts\.html!, @result)
|
||||
end
|
||||
|
||||
should "have the URL to the 'info' item" do
|
||||
assert_match(%r!/info\.html!, @result)
|
||||
end
|
||||
|
||||
should "have the URL to the 'screen.css' item" do
|
||||
assert_match(%r!/css/screen\.css!, @result)
|
||||
end
|
||||
end
|
||||
|
||||
context "simple page with linking" do
|
||||
setup do
|
||||
content = <<CONTENT
|
||||
@@ -799,33 +815,6 @@ CONTENT
|
||||
end
|
||||
end
|
||||
|
||||
context "simple page with dynamic linking" do
|
||||
setup do
|
||||
content = <<CONTENT
|
||||
---
|
||||
title: linking
|
||||
---
|
||||
|
||||
{% assign yaml_with_dots_path = '_methods/yaml_with_dots.md' %}
|
||||
{% link {{yaml_with_dots_path}} %}
|
||||
CONTENT
|
||||
create_post(content, {
|
||||
"source" => source_dir,
|
||||
"destination" => dest_dir,
|
||||
"collections" => { "methods" => { "output" => true } },
|
||||
"read_collections" => true,
|
||||
})
|
||||
end
|
||||
|
||||
should "not cause an error" do
|
||||
refute_match(%r!markdown\-html\-error!, @result)
|
||||
end
|
||||
|
||||
should "have the URL to the 'yaml_with_dots' item" do
|
||||
assert_match(%r!/methods/yaml_with_dots\.html!, @result)
|
||||
end
|
||||
end
|
||||
|
||||
context "simple page with nested linking" do
|
||||
setup do
|
||||
content = <<CONTENT
|
||||
@@ -878,28 +867,6 @@ CONTENT
|
||||
end
|
||||
end
|
||||
|
||||
context "simple page with invalid dynamic linking" do
|
||||
should "cause an error" do
|
||||
content = <<CONTENT
|
||||
---
|
||||
title: Invalid linking
|
||||
---
|
||||
|
||||
{% assign non_existent_path = 'non-existent-collection-item' %}
|
||||
{% link {{\ non_existent_path\ }} %}
|
||||
CONTENT
|
||||
|
||||
assert_raises ArgumentError do
|
||||
create_post(content, {
|
||||
"source" => source_dir,
|
||||
"destination" => dest_dir,
|
||||
"collections" => { "methods" => { "output" => true } },
|
||||
"read_collections" => true,
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "include tag with parameters" do
|
||||
context "with symlink'd include" do
|
||||
should "not allow symlink includes" do
|
||||
|
||||
Reference in New Issue
Block a user