Compare commits

...

52 Commits

Author SHA1 Message Date
mariuslp
202df57131 docs: update wsl installation procedure (#9968)
This is a 🔦 documentation change.

## Summary

The install documentation for WSL offers to install Ruby through
BrightBox. However, BrightBox does not support Ubuntu Jammy (which is
the default for latest WSL builds). Instead, this commit just redirects
the WSL user to the Ubuntu installation procedure to avoid duplicate
documentation.
2026-04-22 09:49:27 -05:00
iBug
d68f76e160 fix: Run release-please workflow only in jekyll/jekyll repo (#9969)
This is a 🐛 bug fix.

## Summary

The `release-please.yml` workflow doesn't make sense in forked
repositories. Let's restrict its execution to jekyll/jekyll only.

I did not expect a "workflow failed" notification soon after catching up
with the upstream in my forked repo:

<img width="1542" height="961" alt="image"
src="https://github.com/user-attachments/assets/5049f2ca-1b1b-42b8-b6ea-4c91ce66a6c3"
/>
2026-04-22 08:50:23 -05:00
Matt Rogers
5cf05d7d09 feat!: Streamline the release process for Jekyll (#9760)
This is a 🙋 feature or enhancement. 
This is a 🔨 code refactoring. 

## Summary

Improve and streamline our release processes with some extra automation
and a bit more rigor around PRs/commits.

## Context

With Jekyll 4.4 released, and under the assumption that the next release
will indeed be 5.0, I think it makes a lot of sense to take some time
and evaluate our development practices and streamline the process of
shipping. We generally go a long time (four months between 4.3.4 and
4.4.0, two years between 4.3.0 and 4.4.0) between releases and this is
my attempt at trying to improve that. While this PR is currently
incomplete, if there's interest in going this direction, I'll make time
over the next few days to clean it up and get it ready to actually ship.

In order to do this, I'm relying on the
[`release-please`](https://github.com/googleapis/release-please-action)
action from Google to do the majority of the heavy lifting. Please read
the release-please README in order to learn how release-please works and
what it does. In order to make it easier to adopt release-please, I've
made two additional changes. ~~The first is to rename `History.markdown`
to `CHANGELOG.md` since that's what `release-please` works with out of
the box.~~ The other is to add two new github actions workflows to run
release-please and to enforce conventional commit conventions on PR
titles. Because we squash merge, the PR title becomes the commit message
and `release-please` uses the commit messages to know when to bump the
version number.

One potential caveat with this is that it may become harder to maintain
stable branches. My point of view on this is that we've done a
relatively poor job of maintaining them regardless and I think it's more
important to release often, even if we end up bumping major or minor
version numbers more frequently than before. My stance on this is that
version bumps have no inherent goodness or badness. They are a
communication mechanism. We should let go of having to wait a certain
amount of time to do major version bumps or avoid work because it would
cause a major version bump, for example.

### Process changes

The use of release-please means that we can stop using jekyllbot to do
the merges and update History.markdown for us, as release-please will
take care of that when we cut the release. We will also no longer need
labels on PRs as the use of conventional commits will explain exactly
what is changing.

The process for releasing becomes:
 - Merge the docs PR
 - Merge the automatically generated release-please PR, which will
trigger the workflows to do the tagging, releasing, gem publishing, etc.

### Remaining work to do:

- [x] Change the pull request settings to only allow squash merges, as
jekyllbot enforces this for us today.
- [x] ~Update the site publishing process to pull from `CHANGELOG.md`
instead of `History.markdown`~ No longer needed.
- [x] Integrate jekyllbot into release-please (the release-please PRs
will be made by jekyllbot). This allows actions to be triggered on the
release-please PRs.
 - [x] Test the workflows to make sure they generate a PR correctly.
 - [x] ~Integrate the release publishing workflow into release-please
when it creates a release.~ Happens automatically with the existing
workflows.
2026-04-17 13:38:58 -05:00
jekyllbot
08c22eefb3 Update history to reflect merge of #9960 [ci skip] 2026-04-14 10:56:52 -07:00
Waishnav
3ed83f6450 Add GitCMS to resources docs (#9960)
Merge pull request 9960
2026-04-14 10:56:50 -07:00
jekyllbot
ff0d4dd78d Update history to reflect merge of #9954 [ci skip] 2026-03-29 20:53:03 -07:00
Matt Rogers
65d534a701 build: fix broken CI on newer rubies (#9954)
Merge pull request 9954
2026-03-29 20:53:01 -07:00
jekyllbot
baab7bf785 Update history to reflect merge of #9925 [ci skip] 2026-03-11 08:39:49 -07:00
Mike Dalton
f07d4f77bc Allow configuring future metadata for individual collections (#9925)
Merge pull request 9925
2026-03-11 08:39:47 -07:00
jekyllbot
d0cf1791f6 Update history to reflect merge of #9914 [ci skip] 2026-02-13 09:06:16 -08:00
Andrew Nesbitt
3c45d9e377 Add .ruby-lsp to default excludes (#9914)
Merge pull request 9914
2026-02-13 09:06:14 -08:00
jekyllbot
26ec089058 Update history to reflect merge of #9920 [ci skip] 2026-02-13 08:48:18 -08:00
Jimmy Bourassa
7e79e461f4 Add logger to Gemfile for Ruby 4.0 (#9920)
Merge pull request 9920
2026-02-13 08:48:17 -08:00
jekyllbot
b49aa9b707 Update history to reflect merge of #9923 [ci skip] 2026-01-05 09:11:47 -08:00
Nemo
ebe567c1d2 Bump supported versions (#9923)
Merge pull request 9923
2026-01-05 09:11:46 -08:00
jekyllbot
4d3db3a83d Update history to reflect merge of #9897 [ci skip] 2025-12-21 12:48:21 -08:00
Y.D.X.
6da6739952 Update WDM (0.1.1 → 0.2.0) in the Windows docs (#9897)
Merge pull request 9897
2025-12-21 12:48:19 -08:00
jekyllbot
161f654409 Update history to reflect merge of #9912 [ci skip] 2025-12-21 12:46:35 -08:00
Chanmi Lee | Kate
e1b5fd6a15 docs: Update contributor badge in README to include avatar height and limit parameters (#9912)
Merge pull request 9912
2025-12-21 12:46:33 -08:00
jekyllbot
2fe6977e8d Update history to reflect merge of #9889 [ci skip] 2025-11-07 14:30:00 -08:00
Álvaro Mondéjar Rubio
e91ed76d97 Fix flaky test that depends on current minute (#9889)
Merge pull request 9889
2025-11-07 14:29:59 -08:00
jekyllbot
a1a42bdb5c Update history to reflect merge of #9882 [ci skip] 2025-10-14 07:57:08 -07:00
Ian
a2c27b70ec Add jekyllup.com to themes documentation (#9882)
Merge pull request 9882
2025-10-14 07:57:06 -07:00
jekyllbot
0760420670 Update history to reflect merge of #9867 [ci skip] 2025-08-27 12:59:07 -07:00
Florian Weingarten
3934fc3184 Fix servlet do_GET header logic (#9867)
Merge pull request 9867
2025-08-27 12:59:05 -07:00
jekyllbot
40ac06ed3e Update history to reflect merge of #9850 [ci skip] 2025-07-11 05:07:19 -07:00
fauno
76982c73c0 Do not treat colons in url_placeholders as URI delimiters (#9850)
Merge pull request 9850
2025-07-11 05:07:17 -07:00
jekyllbot
55024b37ae Update history to reflect merge of #9832 [ci skip] 2025-06-05 08:30:47 -07:00
Sam Cole
59d5d9ae62 Add ruby-erb prerequisite for Arch Linux installations (#9832)
Merge pull request 9832
2025-06-05 08:30:45 -07:00
jekyllbot
a2330bb3b3 Update history to reflect merge of #9776 [ci skip] 2025-06-05 07:51:06 -07:00
Jefferson Quesado
79a8e16f22 feat: Allowing post_url tag to receive liquid variables (#9776)
Merge pull request 9776
2025-06-05 07:51:04 -07:00
jekyllbot
e2e1ee8eaa Update history to reflect merge of #9829 [ci skip] 2025-06-02 08:07:04 -07:00
Ashwin Maroli
2a37caac83 Improve readability of post_url tag (#9829)
Merge pull request 9829
2025-06-02 08:07:02 -07:00
jekyllbot
84437a5052 Update history to reflect merge of #9813 [ci skip] 2025-04-24 05:08:01 -07:00
printfn
01781355ef Fix logs containing IPv6 URLs (#9813)
Merge pull request 9813
2025-04-24 05:08:00 -07:00
Ashwin Maroli
fa5575c806 Configure spell-check to allow azion 2025-04-23 19:02:11 +05:30
jekyllbot
cc583c218c Update history to reflect merge of #9811 [ci skip] 2025-04-22 07:32:19 -07:00
Bruno Germano
5f877c347b Add Azion to the 3rd party deployment docs (#9811)
Merge pull request 9811
2025-04-22 07:32:17 -07:00
Ashwin Maroli
dfbd86db50 Edit History doc to reflect updated pull request titles [skip ci] 2025-04-09 18:04:48 +05:30
Molly Exten
1b617d7281 Updated note on Gemfiles in 10-deployment.md (#9805)
This is a 🔦 documentation change.

I've adjusted the documentation to include a note that Gemfile is
already installed if the reader has completed step 1 in this tutorial. I
thought it was kind of confusing to see instructions on adding a Gemfile
when I had already done that step in the first part of the tutorial.

---------

Co-authored-by: Matt Rogers <mattr-@github.com>
2025-04-08 11:15:23 -05:00
Matt Rogers
f6d9f86e04 Update spelling allow list after merging 9786 [ci skip] 2025-04-08 10:58:01 -05:00
jekyllbot
148c1d395c Update history to reflect merge of #9784 [ci skip] 2025-04-08 08:09:47 -07:00
Ashwin Maroli
07a01b0bc9 Avoid caching resource when called via include_relative tag (#9784)
Merge pull request 9784
2025-04-08 08:09:45 -07:00
jekyllbot
82efcc4c51 Update history to reflect merge of #9786 [ci skip] 2025-04-08 08:08:28 -07:00
Fernando Tapia Rico
1e4696457d Add Supranode to third-party deployment guide (#9786)
Merge pull request 9786
2025-04-08 08:08:26 -07:00
jekyllbot
f320d0d5d7 Update history to reflect merge of #9802 [ci skip] 2025-04-08 08:07:48 -07:00
Reinhard Söllradl
193d2eca7f Update resources.md (#9802)
Merge pull request 9802
2025-04-08 08:07:46 -07:00
jekyllbot
0db8443b41 Update history to reflect merge of #9803 [ci skip] 2025-04-08 08:06:47 -07:00
Molly Exten
e4f0c58395 Small documentation update for 09-collections.md (#9803)
Merge pull request 9803
2025-04-08 08:06:45 -07:00
Ashwin Maroli
1f319fb273 Release 💎 v4.4.1 2025-01-29 18:16:50 +05:30
Ashwin Maroli
c5cd1fb04f Restore globbed path behavior in front matter defaults (#9762)
Restore existing behavior in v4.3.x wherein a scope with path
`_*/**/index.md` matches `_label/index.md` as well instead of just
`_label/dir/index.md`.
2025-01-29 18:01:40 +05:30
Ashwin Maroli
33e8a84a00 Add unrecognized words to expected spelling data [skip ci] 2025-01-29 17:39:01 +05:30
52 changed files with 490 additions and 229 deletions

View File

@@ -2,13 +2,13 @@
## Supported Versions
Security updates are applied to the latest MINOR version of Jekyll, and the version used by GitHub Pages, v3.9.x.
Security updates are applied to the latest MINOR version of Jekyll, and the version used by GitHub Pages, v3.10.x.
| Version | Supported |
| ------- | ------------------ |
| 4.2.x | :white_check_mark: |
| 3.9.x | :white_check_mark: |
| < 3.9.x | :x: |
| 4.4.x | :white_check_mark: |
| 3.10.x | :white_check_mark: |
| < 3.10.x | :x: |
## Reporting a Vulnerability

View File

@@ -1,3 +1,4 @@
azion
builtins
github
hakiri
@@ -7,6 +8,7 @@ Microsoft
ssh
Statictastic
statictastic
supranode
ubuntu
Wikipedia
workaround

View File

@@ -83,6 +83,7 @@ DCEU
Debian
defunkt
delegators
devcontainer
digitalocean
disqus
ditaa
@@ -182,6 +183,7 @@ jekyllized
jekylllayoutconcept
jekyllrb
jekyllthemes
jekyllup
jemoji
jmcglone
johnreilly
@@ -360,7 +362,7 @@ shingo
shopify
shortlinks
shortlog
Shoulda
shoulda
sieversii
sigpipe
Singhaniya
@@ -446,6 +448,7 @@ vnd
vohedge
vps
vwochnik
WAI
wdm
We'd
webfonts

17
.github/release-please-config.json vendored Normal file
View File

@@ -0,0 +1,17 @@
{
"pull-request-title-pattern": "chore: release 💎 ${version}",
"packages": {
".": {
"changelog-path": "History.markdown",
"release-type": "ruby",
"bump-minor-pre-major": false,
"bump-patch-for-minor-pre-major": false,
"draft": false,
"prerelease": false,
"include-component-in-tag": false,
"include-v-in-tag": true,
"version-file": "lib/jekyll/version.rb"
}
},
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json"
}

3
.github/release-please-manifest.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
".": "4.4.1"
}

View File

@@ -0,0 +1,50 @@
# This workflow checks to ensure that all PR titles conform to the conventional
# commit spec and use the correct type and scopes. The spec for conventional
# commits can be found at https://www.conventionalcommits.org and there is a
# nice cheatsheet in a github gist at
# https://gist.github.com/qoomon/5dfcdf8eec66a051ecd85625518cfd13
#
# The types in this workflow match the spec. The scopes are custom to
# Jekyll and can be changed if desired.
name: Conventional Commit Check
permissions:
pull-requests: read
on:
pull_request_target:
types: [opened, edited, synchronize, reopened, ready_for_review]
branches:
- master
jobs:
commit_lint:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5.5.3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
feat
fix
perf
refactor
docs
style
test
chore
scopes: |
core
cli
commands
plugins
site
helpers
converters
filters
tags
drops
tests
docs
requireScope: false

44
.github/workflows/release-please.yml vendored Normal file
View File

@@ -0,0 +1,44 @@
name: "Release, please!"
on:
push:
branches:
- master
permissions:
contents: write
pull-requests: write
jobs:
release-please:
if: ${{ github.repository == 'jekyll/jekyll' }}
runs-on: ubuntu-latest
outputs:
release_created: ${{ steps.release.outputs.release_created }}
tag_name: ${{ steps.release.outputs.tag_name }}
steps:
- name: Run Release Please
id: release
uses: googleapis/release-please-action@v4
with:
config-file: .github/release-please-config.json
manifest-file: .github/release-please-manifest.json
token: ${{ secrets.JEKYLLBOT_TOKEN }}
publish-gem:
needs: release-please
if: ${{ needs.release-please.outputs.release_created == 'true' }}
runs-on: ubuntu-latest
permissions:
id-token: write
contents: write
steps:
- name: Checkout Repository
uses: actions/checkout@v6
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
bundler-cache: true
- name: Build and Publish Gem
uses: rubygems/release-gem@v1

View File

@@ -1,34 +0,0 @@
name: Release Gem
on:
push:
branches:
- master
- "*-stable"
paths:
- "lib/**/version.rb"
jobs:
release:
if: "github.repository_owner == 'jekyll'"
name: "Release Gem (Ruby ${{ matrix.ruby_version }})"
runs-on: "ubuntu-latest"
strategy:
fail-fast: true
matrix:
ruby_version:
- 2.7
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: "Set up Ruby ${{ matrix.ruby_version }}"
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby_version }}
bundler-cache: true
- name: Build and Publish Gem
uses: ashmaroli/release-gem@dist
with:
gemspec_name: jekyll
env:
GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_GEM_PUSH_API_KEY }}

View File

@@ -65,7 +65,7 @@ jobs:
steps:
- name: check-spelling
id: spelling
uses: check-spelling/check-spelling@v0.0.24
uses: check-spelling/check-spelling@v0.0.26
with:
# This workflow runs in response to both `push` and `pull_request`, if there's an open `pull_request` in the same repository
# for a given branch, there's no reason to spend resources checking both the `push` and the `pull_request`, so this flag tells

View File

@@ -1,3 +1,45 @@
## HEAD
### Bug Fixes
* Avoid caching resource when called via `include_relative` tag (#9784)
* Fix logs containing IPv6 URLs (#9813)
* Do not treat colons in `url_placeholders` as URI delimiters (#9850)
* Fix servlet do_GET header logic (#9867)
* Add logger to Gemfile for Ruby 4.0 (#9920)
### Documentation
* Improve documentation on collections in step-by-step walkthrough (#9803)
* Add `https://form.taxi` as a third-party resource for forms (#9802)
* Add Supranode to third-party deployment guide (#9786)
* Document the need for a `Gemfile` in deployment step of step-by-step walkthrough (#9805)
* Add Azion to the 3rd party deployment docs (#9811)
* Add ruby-erb prerequisite for Arch Linux installations (#9832)
* Add jekyllup.com to themes documentation (#9882)
* docs: Update contributor badge in README to include avatar height and limit parameters (#9912)
* Update WDM (0.1.1 → 0.2.0) in the Windows docs (#9897)
* Bump supported versions (#9923)
* Add GitCMS to resources docs (#9960)
### Development Fixes
* Improve readability of `post_url` tag (#9829)
* Fix flaky test that depends on current minute (#9889)
* build: fix broken CI on newer rubies (#9954)
### Minor Enhancements
* feat: Allowing post_url tag to receive liquid variables (#9776)
* Add .ruby-lsp to default excludes (#9914)
* Allow configuring future metadata for individual collections (#9925)
## 4.4.1 / 2025-01-29
### Bug Fixes
* Restore globbed path behavior in front matter defaults (#9762)
## 4.4.0 / 2025-01-27
### Minor Enhancements

View File

@@ -69,7 +69,7 @@ Support this project by becoming a sponsor. Your logo will show up in this READM
### Contributors
This project exists thanks to all the people who contribute.
[![Jekyll Contributors](https://opencollective.com/jekyll/contributors.svg?width=890&button=false)](../../graphs/contributors)
[![Jekyll Contributors](https://opencollective.com/jekyll/contributors.svg?width=890&&avatarHeight=24&limit=100&button=false)](../../graphs/contributors)
### Backers

View File

@@ -8,6 +8,7 @@ require "yaml"
$LOAD_PATH.unshift File.expand_path("lib", __dir__)
require "jekyll/version"
require "bundler/gem_tasks"
Dir.glob("rake/**.rake").each { |f| import f }
@@ -42,11 +43,15 @@ def gem_file
end
def normalize_bullets(markdown)
markdown.gsub(%r!\n\s{2}\*{1}!, "\n-")
# Normalize both old-style indented bullets (" *") and
# release-please-style non-indented bullets ("*") to "-"
markdown.gsub(%r!\n\s{0,2}\*{1}!, "\n-")
end
def linkify_prs(markdown)
markdown.gsub(%r!(?<\!&)#(\d+)!) do |word|
# Match bare PR references like #1234 but skip those already linkified
# by release-please as [#1234](url)
markdown.gsub(%r{(?<!&)(?<!\[)#(\d+)}) do |word|
"[#{word}]({{ site.repository }}/issues/#{word.delete("#")})"
end
end
@@ -60,8 +65,10 @@ def liquid_escape(markdown)
end
def custom_release_header_anchors(markdown)
header_regexp = %r!^(\d{1,2})\.(\d{1,2})\.(\d{1,2}) \/ \d{4}-\d{2}-\d{2}!
section_regexp = %r!^### \w+ \w+$!
# Match old format: "X.Y.Z / YYYY-MM-DD"
# Match new release-please format: "[X.Y.Z](compare-url) (YYYY-MM-DD)"
header_regexp = %r!^(?:\[?)(\d{1,2})\.(\d{1,2})\.(\d{1,2})(?:\]\([^)]*\))? [\(/]\s?\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
@@ -75,7 +82,8 @@ def slugify(header)
end
def remove_head_from_history(markdown)
index = markdown =~ %r!^##\s+\d+\.\d+\.\d+!
# Match both old format "## X.Y.Z" and release-please format "## [X.Y.Z]"
index = markdown =~ %r!^##\s+\[?\d+\.\d+\.\d+!
markdown[index..-1]
end

View File

@@ -1,5 +1,5 @@
---
version: 4.4.0
version: 4.4.1
name: Jekyll • Simple, blog-aware, static sites
description: Transform your plain text into static websites and blogs
url: https://jekyllrb.com

View File

@@ -124,6 +124,16 @@ You can link to the generated page using the `url` attribute:
```
{% endraw %}
## Future
You can configure a collection to show future items by setting the `future` metadata to `true` in the collection's configuration.
```yaml
collections:
staff_members:
future: true
```
## Permalinks
There are special [permalink variables for collections]({{ '/docs/permalinks/#collections' | relative_url }}) to

View File

@@ -47,9 +47,9 @@ Read this [Jekyll step-by-step guide](https://www.netlify.com/blog/2020/04/02/a-
[Render](https://render.com) provides zero config continuous deployment for static sites. The service is free under 100GB monthly bandwidth.
## Hostman
## Hostman
[Hostman](https://hostman.com) allows you to host websites for free with no configurations. Read [this guide](https://hostman.com/docs/jekyll) to deploy your Jekyll site on Hostman.
[Hostman](https://hostman.com) allows you to host websites for free with no configurations. Read [this guide](https://hostman.com/docs/jekyll) to deploy your Jekyll site on Hostman.
## Static Publisher
@@ -70,7 +70,17 @@ Read this [Jekyll step-by-step guide](https://www.21yunbox.com/docs/#/deploy-jek
[Layer0](https://www.layer0.co) is an all-in-one platform to develop, deploy, preview, experiment on, monitor, and run your headless frontend. It is focused on large, dynamic websites and best-in-class performance through EdgeJS (a JavaScript-based Content Delivery Network), predictive prefetching, and performance monitoring. Layer0 offers a free tier. Get started in just a few minutes by following [Layer0's guide to deploying Jekyll](https://docs.layer0.co/guides/jekyll).
## Kinsta Application Hosting
[Kinsta Application Hosting](https://kinsta.com/application-hosting) is a Cloud Platform designed to help your company and dev teams ship web projects faster and more efficiently. You can host your apps, databases, and sites all in one place. Easily connect with GitHub and automate deployments and get 24/7 support for all your favorite languages and frameworks.
Read [this guide](https://kinsta.com/docs/jekyll-static-site-example/) to learn how to deploy Jekyll site on Kinsta.
## Supranode
[Supranode](https://supranode.com) offers customizable continuous deployment for static websites, featuring automatic HTTPS, a high-performance CDN, secret management, deployment previews, password protection, and more.
## Azion
[Azion](https://www.azion.com/en/) is an web platform that provides a wide range of services. It allows you to host static sites, including Jekyll-powered websites, with features like automatic HTTPS, custom domains, and real-time analytics. Azion's platform is designed for performance and scalability, making it an excellent choice for hosting global websites.
In [this guide](https://www.azion.com/en/documentation/products/guides/jekyll-boilerplate/) you can learn how to deploy a Jekyll site on Azion.

View File

@@ -4,6 +4,15 @@ permalink: "/docs/history/"
note: This file is autogenerated. Edit /History.markdown instead.
---
## 4.4.1 / 2025-01-29
{: #v4-4-1}
### Bug Fixes
{: #bug-fixes-v4-4-1}
- Restore globbed path behavior in front matter defaults ([#9762]({{ site.repository }}/issues/9762))
## 4.4.0 / 2025-01-27
{: #v4-4-0}

View File

@@ -40,7 +40,7 @@ sudo emerge --ask --verbose jekyll
### ArchLinux
```sh
sudo pacman -S ruby base-devel
sudo pacman -S ruby base-devel ruby-erb
```
### OpenSUSE

View File

@@ -45,37 +45,9 @@ You must have [Windows Subsystem for Linux](https://msdn.microsoft.com/en-us/com
Make sure all your packages and repositories are up to date. Open a new Command Prompt or PowerShell window and type `bash`.
Your terminal should now be a Bash instance. Next, update your repository lists and packages:
Your terminal should now be a Bash instance. Then, [follow the installation procedure for Ubuntu](https://jekyllrb.com/docs/installation/ubuntu/).
```sh
sudo apt-get update -y && sudo apt-get upgrade -y
```
Next, install Ruby. To do this, let's use a repository from [BrightBox](https://www.brightbox.com/docs/ruby/ubuntu/),
which hosts optimized versions of Ruby for Ubuntu.
```sh
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get install ruby2.5 ruby2.5-dev build-essential dh-autoreconf
```
Next, update your Ruby gems:
```sh
gem update
```
Install Jekyll:
```sh
gem install jekyll bundler
```
{: .note .info}
No `sudo` here.
Check your Jekyll version:
Once this is done, check your Jekyll version:
```sh
jekyll -v
@@ -138,7 +110,7 @@ While `listen` has built-in support for UNIX systems, it may require an extra ge
Add the following to the `Gemfile` for your site if you have issues with auto-regeneration on Windows alone:
```ruby
gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform?
gem "wdm", "~> 0.2.0", :install_if => Gem.win_platform?
```
You have to use a [Ruby+Devkit](https://rubyinstaller.org/downloads/) version of the RubyInstaller and install

View File

@@ -188,3 +188,25 @@ You can also use this tag to create a link to a post in Markdown as follows:
[Name of Link]({% post_url 2010-07-21-name-of-post %})
```
{% endraw %}
Now lets say you have a [datafile]({{ '/docs/datafiles/' | relative_url }}) `_data/cool_posts.yaml` used to keep track
of certain posts that you intend to be listed as say *Cool Posts*:
```yaml
- title: "An Awesome Post"
slug: "2010-07-21-name-of-post"
- title: "Another Awesome Post"
slug: "2016-07-26-name-of-post"
```
You may list such posts using the `post_url` tag as well (from {%- include docs_version_badge.html version="4.5.0" -%}):
{% raw %}
```liquid
Cool posts:
{%- for cool_post in site.data.cool_posts %}
- [{{ cool_post.title }}]({% post_url {{ cool_post.slug }} %})
{%- endfor %}
```
{% endraw %}

View File

@@ -57,7 +57,7 @@ Ted has been eating fruit since he was baby.
Let's add a page which lists all the authors on the site. Jekyll makes the
collection available at `site.authors`.
Create `staff.html` and iterate over `site.authors` to output all the staff:
Create `staff.html` in the root directory and iterate over `site.authors` to output all the staff:
{% raw %}
```liquid

View File

@@ -11,7 +11,7 @@ It's good practice to have a [Gemfile](/docs/ruby-101/#gemfile) for your site.
This ensures the version of Jekyll and other gems remains consistent across
different environments.
Create a `Gemfile` in the root.
If you completed step one in this tutorial, you have already created a Gemfile. If you skipped step one, create a `Gemfile` in the root.
The file should be called 'Gemfile' and should *not* have any extension.
You can create a Gemfile with Bundler and then add the `jekyll` gem:
@@ -20,7 +20,7 @@ bundle init
bundle add jekyll
```
Your file should look something like:
Your `Gemfile` should look something like:
```ruby
# frozen_string_literal: true

View File

@@ -14,6 +14,7 @@ You can find and preview themes on different galleries:
- [jekyllthemes.org](http://jekyllthemes.org/)
- [jekyllthemes.io](https://jekyllthemes.io/)
- [jekyll-themes.com](https://jekyll-themes.com/)
- [jekyllup.com](https://jekyllup.com/)
See also: [resources](/resources/).

View File

@@ -0,0 +1,10 @@
---
title: 'Jekyll 4.4.1 Released'
date: 2025-01-29 18:15:32 +0530
author: ashmaroli
version: 4.4.1
category: release
---
Publishing a patch release to restore existing behavior around defining front matter defaults
where a scope with path containing glob patterns are lax in matching paths on disk.

View File

@@ -1 +1 @@
4.4.0
4.4.1

View File

@@ -44,6 +44,7 @@ Use a SaaS service as a backend for functionality on your Jekyll site
- [Contentful](https://github.com/contentful/jekyll-contentful-data-import): Content infrastructure for digital teams
- [TinaCMS.io](https://tina.io/): Tina is an open-source, Git-backed headless content management system (CMS) that empowers both developers and content creators to collaborate seamlessly on a single platform
- [Decap CMS](https://decapcms.org/): Decap CMS (formerly Netlify CMS) is an open source content management system for your Git workflow that enables you to provide editors with a friendly UI and intuitive workflows
- [GitCMS](https://gitcms.dev/): Built for markdown-first content sites with a friendly Notion-like interface, a structured editorial publishing workflow, and MCP support which turns ChatGPT/Claude into content agent.
- [Siteleaf](https://www.siteleaf.com/): Built for developers, Loved by everyone
- [Kentico Kontent](https://rubygems.org/gems/kontent-jekyll/): A headless CMS with full control over content presentation
@@ -62,6 +63,7 @@ Use a SaaS service as a backend for functionality on your Jekyll site
- [Formspark](https://formspark.io/)
- [Formspree (open source)](https://formspree.io/)
- [formX](https://formx.stream)
- [Form.taxi](https://form.taxi/en/backend)
- [Simple Form](https://getsimpleform.com/)
- [SmartForms](https://smartforms.dev/)
- [Typeform](https://www.typeform.com/templates/c/forms/)

View File

@@ -58,3 +58,22 @@ Feature: include_relative Tag
Then I should get a zero exit status
And the _site directory should exist
And I should see "Welcome back Dear Reader!" in "_site/index.html"
Scenario: Include multiple files relative to a page at root
Given I have an "apple.md" page with foo "bar" that contains "{{ page.path }}, {{ page.foo }}"
And I have an "banana.md" page with content:
"""
{% include_relative apple.md %}
{% include_relative cherry.md %}
{{ page.path }}
"""
And I have an "cherry.md" page with foo "lipsum" that contains "{{ page.path }}, {{ page.foo }}"
When I run jekyll build
Then I should get a zero exit status
And the _site directory should exist
And I should see "<p>apple.md, bar</p>" in "_site/apple.html"
And I should see "<hr />\n<p>foo: bar" in "_site/banana.html"
And I should see "<hr />\n<p>foo: lipsum" in "_site/banana.html"
And I should see "<p>cherry.md, lipsum</p>" in "_site/cherry.html"
But I should not see "foo: lipsum" in "_site/cherry.html"

View File

@@ -157,3 +157,37 @@ Feature: PostUrl Tag
But the _site directory should exist
And I should see "<p><a href=\"/cats%20and%20dogs/2019/02/04/hello-world.html\">Post 1</a></p>" in "_site/index.html"
And I should see "<p><a href=\"/2019/02/05/hello-again.html\">Post 2</a></p>" in "_site/index.html"
Scenario: Calling for a post via a liquid variable
Given I have a _posts directory
And I have the following post:
| title | date | content |
| Hello World | 2019-02-04 | Lorem ipsum dolor |
And I have an "index.md" page with content:
"""
{% assign value='2019-02-04-hello-world' %}
[Welcome]({% post_url {{ value }} %})
"""
When I run jekyll build
Then I should get a zero exit status
And the _site directory should exist
And I should see "<p><a href=\"/2019/02/04/hello-world.html\">Welcome</a></p>" in "_site/index.html"
Scenario: Calling for posts via a liquid variable in a for tag
Given I have a _posts directory
And I have the following post:
| title | date | content |
| Hello World | 2019-02-04 | Lorem ipsum dolor |
| We Meet Again | 2019-02-05 | Alpha beta gamma |
And I have an "index.md" page with content:
"""
{% assign posts = '2019-02-04-hello-world;2019-02-05-we-meet-again' | split: ';' %}
{%- for slug in posts -%}
[{{ slug }}]({% post_url {{ slug }} %})
{%- endfor %}
"""
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=\"/2019/02/04/hello-world.html\">2019-02-04-hello-world</a>" in "_site/index.html"
And I should see "<a href=\"/2019/02/05/we-meet-again.html\">2019-02-05-we-meet-again</a>" in "_site/index.html"

View File

@@ -363,7 +363,21 @@ end
#
Then(%r!^I should see today's time in "(.*)"$!) do |file|
step %(I should see "#{seconds_agnostic_time(Time.now)}" in "#{file}")
seconds = 3
build_time = Time.now
content = file_contents(file)
date_time_pattern = /(\d{4}-\d{2}-\d{2}\s\d+:\d{2}:\d{2})/
match_data = content.match(date_time_pattern)
expect(match_data).not_to be_nil, "No date-time pattern found in #{file}"
date_time_str = match_data.captures
file_time = Time.parse("#{date_time_str}")
time_difference = (build_time - file_time).abs
expect(time_difference).to be <= seconds, <<~MSG
Expected time in #{file} to be within #{seconds} seconds of build time.
Build time: #{build_time}
File time: #{file_time}
Difference: #{time_difference} seconds
MSG
end
#

View File

@@ -145,25 +145,6 @@ end
#
def seconds_agnostic_datetime(datetime = Time.now)
date, time, zone = datetime.to_s.split(" ")
time = seconds_agnostic_time(time)
[
Regexp.escape(date),
"#{time}:\\d{2}",
Regexp.escape(zone),
].join("\\ ")
end
#
def seconds_agnostic_time(time)
time = time.strftime("%H:%M:%S") if time.is_a?(Time)
hour, minutes, = time.split(":")
"#{hour}:#{minutes}"
end
# Helper method for Windows
def dst_active?
config = Jekyll.configuration("quiet" => true)

View File

@@ -44,6 +44,7 @@ Gem::Specification.new do |s|
s.add_runtime_dependency("kramdown", "~> 2.3", ">= 2.3.1")
s.add_runtime_dependency("kramdown-parser-gfm", "~> 1.0")
s.add_runtime_dependency("liquid", "~> 4.0")
s.add_runtime_dependency("logger", "~> 1.3")
s.add_runtime_dependency("mercenary", "~> 0.3", ">= 0.3.6")
s.add_runtime_dependency("pathutil", "~> 0.9")
s.add_runtime_dependency("rouge", ">= 3.0", "< 5.0")

View File

@@ -243,7 +243,7 @@ module Jekyll
def format_url(ssl_enabled, address, port, baseurl = nil)
format("%<prefix>s://%<address>s:%<port>i%<baseurl>s",
:prefix => ssl_enabled ? "https" : "http",
:address => address,
:address => address.include?(":") ? "[#{address}]" : address,
:port => port,
:baseurl => baseurl ? "#{baseurl}/" : "")
end

View File

@@ -55,8 +55,9 @@ module Jekyll
EM.schedule { @started_event.set }
EM.add_shutdown_hook { @stopped_event.set }
host = opts["host"].include?(":") ? "[#{opts["host"]}]" : opts["host"]
Jekyll.logger.info "LiveReload address:",
"http://#{opts["host"]}:#{opts["livereload_port"]}"
"http://#{host}:#{opts["livereload_port"]}"
end
end
@thread.abort_on_exception = true

View File

@@ -160,9 +160,7 @@ module Jekyll
def do_GET(req, res)
rtn = super
if @jekyll_opts["livereload"]
return rtn if SkipAnalyzer.skip_processing?(req, res, @jekyll_opts)
if @jekyll_opts["livereload"] && !SkipAnalyzer.skip_processing?(req, res, @jekyll_opts)
processor = BodyProcessor.new(res.body, @jekyll_opts)
processor.process!
res.body = processor.new_body

View File

@@ -253,7 +253,7 @@ module Jekyll
end
DEFAULT_EXCLUDES = %w(
.sass-cache .jekyll-cache
.sass-cache .jekyll-cache .ruby-lsp
gemfiles Gemfile Gemfile.lock
node_modules
vendor/bundle/ vendor/cache/ vendor/gems/ vendor/ruby/

View File

@@ -109,7 +109,7 @@ module Jekyll
sanitized_path = sanitize_path(path)
if rel_scope_path.include?("*")
File.fnmatch?(strip_collections_dir(rel_scope_path), sanitized_path)
glob_scope(sanitized_path, rel_scope_path)
else
path_is_subpath?(sanitized_path, strip_collections_dir(rel_scope_path))
end

View File

@@ -11,7 +11,10 @@ module Jekyll
end
def hidden_in_the_future?(thing)
thing.respond_to?(:date) && !@site.future && thing.date.to_i > @site.time.to_i
thing.respond_to?(:date) &&
!@site.future &&
!collection_allows_future?(thing) &&
thing.date.to_i > @site.time.to_i
end
private
@@ -19,5 +22,9 @@ module Jekyll
def can_be_published?(thing)
thing.data.fetch("published", true) || @site.unpublished
end
def collection_allows_future?(thing)
thing.respond_to?(:collection) && !!thing.collection.metadata["future"]
end
end
end

View File

@@ -249,6 +249,11 @@ module Jekyll
end
class IncludeRelativeTag < IncludeTag
def load_cached_partial(path, context)
context.registers[:cached_partials] ||= {}
context.registers[:cached_partials][path] ||= parse_partial(path, context)
end
def tag_includes_dirs(context)
Array(page_path(context)).freeze
end
@@ -267,6 +272,17 @@ module Jekyll
path = File.join(site.config["collections_dir"], path) if page["collection"]
path.delete_suffix("/#excerpt")
end
# Since Jekyll 4 caches convertibles based on their path within the only instance of
# `LiquidRenderer`, initialize a new LiquidRenderer instance on every render of this
# tag to bypass caching rendered output of page / document.
def parse_partial(path, context)
LiquidRenderer.new(context.registers[:site]).file(path).parse(read_file(path, context))
rescue Liquid::Error => e
e.template_name = path
e.markup_context = "included " if e.markup_context.nil?
raise e
end
end
end
end

View File

@@ -3,34 +3,39 @@
module Jekyll
module Tags
class PostComparer
# Deprecated (soft; No interpreter warnings).
# To be removed in v5.0.
# Use private constant `POST_PATH_MATCHER` instead.
MATCHER = %r!^(.+/)*(\d+-\d+-\d+)-(.*)$!.freeze
POST_PATH_MATCHER = %r!\A(.+/)*?(\d{2,4}-\d{1,2}-\d{1,2})-([^/]*)\z!.freeze
private_constant :POST_PATH_MATCHER
attr_reader :path, :date, :slug, :name
def initialize(name)
@name = name
all, @path, @date, @slug = *name.sub(%r!^/!, "").match(MATCHER)
all, @path, @date, @slug = *name.delete_prefix("/").match(POST_PATH_MATCHER)
unless all
raise Jekyll::Errors::InvalidPostNameError,
"'#{name}' does not contain valid date and/or title."
end
basename_pattern = "#{date}-#{Regexp.escape(slug)}\\.[^.]+"
@name_regex = %r!^_posts/#{path}#{basename_pattern}|^#{path}_posts/?#{basename_pattern}!
@name_regex = %r!\A_posts/#{path}#{basename_pattern}|\A#{path}_posts/?#{basename_pattern}!
end
def post_date
@post_date ||= Utils.parse_date(
date,
"'#{date}' does not contain valid date and/or title."
)
@post_date ||= Utils.parse_date(date, "Path '#{name}' does not contain valid date.")
end
# Returns `MatchData` or `nil`.
def ==(other)
other.relative_path.match(@name_regex)
end
# Deprecated. To be removed in v5.0.
def deprecated_equality(other)
slug == post_slug(other) &&
post_date.year == other.date.year &&
@@ -40,9 +45,9 @@ module Jekyll
private
# Construct the directory-aware post slug for a Jekyll::Post
# Construct the directory-aware post slug for a Jekyll::Document object.
#
# other - the Jekyll::Post
# other - the Jekyll::Document object.
#
# Returns the post slug with the subdirectory (relative to _posts)
def post_slug(other)
@@ -58,47 +63,71 @@ module Jekyll
class PostUrl < Liquid::Tag
include Jekyll::Filters::URLFilters
def initialize(tag_name, post, tokens)
def initialize(tag_name, markup, tokens)
super
@orig_post = post.strip
begin
@post = PostComparer.new(@orig_post)
rescue StandardError => e
raise Jekyll::Errors::PostURLError, <<~MSG
Could not parse name of post "#{@orig_post}" in tag 'post_url'.
Make sure the post exists and the name is correct.
#{e.class}: #{e.message}
MSG
end
@markup = markup.strip
@template = Liquid::Template.parse(@markup) if @markup.include?("{{")
# Deprecated instance_variables.
# To be removed in Jekyll v5.0.
@orig_post = @markup
@post = nil
end
def render(context)
@context = context
@resolved_markup = @template&.render(@context) || @markup
site = context.registers[:site]
site.posts.docs.each do |document|
return relative_url(document) if @post == document
begin
@post_comparer = PostComparer.new(@resolved_markup)
rescue StandardError
raise_markup_parse_error
end
# For backwards compatibility only; deprecated instance_variable.
# To be removed in Jekyll v5.0.
@post = @post_comparer
# First pass-through.
site.posts.docs.each do |post|
return relative_url(post) if @post_comparer == post
end
# New matching method did not match, fall back to old method
# with deprecation warning if this matches
# First pass-through did not yield the requested post. Search again using legacy matching
# method. Log deprecation warning if a post is detected via this round.
site.posts.docs.each do |post|
next unless @post_comparer.deprecated_equality(post)
site.posts.docs.each do |document|
next unless @post.deprecated_equality document
Jekyll::Deprecator.deprecation_message(
"A call to '{% post_url #{@post.name} %}' did not match a post using the new " \
"matching method of checking name (path-date-slug) equality. Please make sure " \
"that you change this tag to match the post's name exactly."
)
return relative_url(document)
log_legacy_usage_deprecation
return relative_url(post)
end
raise_post_not_found_error
end
private
def raise_markup_parse_error
raise Jekyll::Errors::PostURLError, <<~MSG
Could not find post "#{@orig_post}" in tag 'post_url'.
Make sure the post exists and the name is correct.
Could not parse name of post #{@resolved_markup.inspect} in tag 'post_url'.
Make sure the correct name is given to the tag.
MSG
end
def raise_post_not_found_error
raise Jekyll::Errors::PostURLError, <<~MSG
Could not find post #{@resolved_markup.inspect} in tag 'post_url'.
Make sure the post exists and the correct name is given to the tag.
MSG
end
def log_legacy_usage_deprecation
Jekyll::Deprecator.deprecation_message(
"A call to '{% post_url #{@resolved_markup} %}' did not match a post using the new " \
"matching method of checking name (path-date-slug) equality. Please make sure that " \
"you change this tag to match the post's name exactly."
)
end
end
end
end

View File

@@ -144,7 +144,13 @@ module Jekyll
# pct-encoded = "%" HEXDIG HEXDIG
# sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
# / "*" / "+" / "," / ";" / "="
Addressable::URI.encode(path).encode("utf-8").sub("#", "%23")
#
# `Addressable::URI::CharacterClassesRegexps::PATH` is used to encode
# non-alphanumeric characters such as "[", "]", etc.
Addressable::URI.encode_component(
path,
Addressable::URI::CharacterClassesRegexps::PATH
).encode("utf-8").sub("#", "%23")
end
# Unescapes a URL path segment

View File

@@ -1,5 +1,5 @@
# frozen_string_literal: true
module Jekyll
VERSION = "4.4.0"
VERSION = "4.4.1"
end

View File

@@ -1,30 +0,0 @@
# frozen_string_literal: true
#############################################################################
#
# Packaging tasks
#
#############################################################################
desc "Release #{name} v#{version}"
task :release => :build do
current_branch = `git branch`.to_s.strip.match(%r!^\* (.+)$!)[1]
unless current_branch == "master" || current_branch.end_with?("-stable")
puts "You must be on the master branch to release!"
exit!
end
sh "git commit --allow-empty -m 'Release :gem: #{version}'"
sh "git tag v#{version}"
sh "git push origin #{current_branch}"
sh "git push origin v#{version}"
sh "gem push pkg/#{name}-#{version}.gem"
puts "Do not forget to build and release the docs gem as well."
puts "https://github.com/jekyll/jekyll-docs#releasing"
end
desc "Build #{name} v#{version} into pkg/"
task :build do
mkdir_p "pkg"
sh "gem build #{gemspec_file}"
sh "mv #{gem_file} pkg"
end

View File

@@ -1,4 +1,4 @@
#!/bin/bash
#!/usr/bin/env bash
# -----------------------------------------------------------------------------
# If you send us a ruby then we use that, if you do not then we test with
# whatever we can detect, this way you can run both suites when you test out

View File

@@ -35,16 +35,9 @@ else
fi
# Tests only pass when timezone offset is zero.
TZ=UTC
export TZ=UTC
for ruby in $rubies; do
if [[ "$ruby" == "jruby" ]]
then
testopts=""
else
testopts="--profile"
fi
if [[ $# -lt 1 ]]
then
set -x
@@ -53,6 +46,6 @@ for ruby in $rubies; do
else
set -x
time $ruby -S bundle exec ruby -I test \
"$@" $testops
"$@" $testopts
fi
done

View File

@@ -1 +0,0 @@
<svg></svg>

Before

Width:  |  Height:  |  Size: 13 B

View File

@@ -1,3 +0,0 @@
---
speciality: Ruby
---

View File

@@ -1 +0,0 @@
<svg></svg>

Before

Width:  |  Height:  |  Size: 13 B

View File

@@ -1,3 +0,0 @@
---
speciality: JS Frameworks
---

View File

@@ -73,6 +73,7 @@ class TestConfiguration < JekyllUnitTest
exclude = @config["exclude"]
assert_includes exclude, ".sass-cache"
assert_includes exclude, ".jekyll-cache"
assert_includes exclude, ".ruby-lsp"
end
end

View File

@@ -25,6 +25,10 @@ class TestFrontMatterDefaults < JekyllUnitTest
assert_equal "val", @affected.data["key"]
assert_nil @not_affected.data["key"]
end
should "not call Dir.glob block" do
refute_includes @output, "Globbed Scope Path:"
end
end
context "A site with full front matter defaults (glob)" do
@@ -49,38 +53,9 @@ class TestFrontMatterDefaults < JekyllUnitTest
assert_equal "val", @affected.data["key"]
assert_nil @not_affected.data["key"]
end
end
context "A site with collections and front matter defaults with glob patterns" do
setup do
site = fixture_site(
"collections_dir" => "gathering",
"collections" => { "staff" => { "output" => true } },
"defaults" => [
{
"scope" => { "path" => "_staff/**/*.md", "type" => "staff" },
"values" => { "layout" => "simple" },
},
{
"scope" => { "path" => "_staff/**/*.svg" },
"values" => { "css_class" => "epilson" },
},
]
)
site.read
@staff = site.collections["staff"]
end
should "affect the appropriate items only" do
@staff.docs.each do |item|
assert_equal "simple", item.data["layout"]
assert_nil item.data["css_class"]
end
@staff.files.each do |item|
assert_equal "epilson", item.data["css_class"]
assert_nil item.data["layout"]
end
should "call Dir.glob block" do
assert_includes @output, "Globbed Scope Path:"
end
end

View File

@@ -64,7 +64,7 @@ class TestPageWithoutAFile < JekyllUnitTest
assert_equal "All the properties.\n", regular_page["content"]
assert_equal "properties.html", regular_page["name"]
basic_attrs = %w(dir name path url excerpt)
basic_attrs = %w(dir name path url)
attrs = {
"content" => nil,
"dir" => "/",

42
test/test_publisher.rb Normal file
View File

@@ -0,0 +1,42 @@
# frozen_string_literal: true
require "helper"
class TestPublisher < JekyllUnitTest
context "default configuration" do
setup do
site = fixture_site
collection = Jekyll::Collection.new(site, "methods")
@thing = Jekyll::Document.new(
source_dir("methods/method.md"),
:site => site,
:collection => collection
)
@thing.data["date"] = (Time.now + (60 * 60 * 24)).to_i # tomorrow
@publisher = Jekyll::Publisher.new(site)
end
should "be hidden in the future" do
assert @publisher.hidden_in_the_future?(@thing)
end
end
context "when a thing's collection is configured to show future posts" do
setup do
site = fixture_site
collection = Jekyll::Collection.new(site, "methods")
collection.metadata["future"] = true
@thing = Jekyll::Document.new(
source_dir("methods/method.md"),
:site => site,
:collection => collection
)
@thing.data["date"] = (Time.now + (60 * 60 * 24)).to_i # tomorrow
@publisher = Jekyll::Publisher.new(site)
end
should "not be hidden in the future" do
refute @publisher.hidden_in_the_future?(@thing)
end
end
end

View File

@@ -80,5 +80,16 @@ class TestURL < JekyllUnitTest
).to_s
end
end
should "not treat colons in placeholders as uri delimiters" do
assert_equal "/foo/foo%20bar:foobar/", URL.new(
:template => "/:x/:y/",
:placeholders => { :x => "foo", :y => "foo bar:foobar" }
).to_s
end
should "unescape urls with colons" do
assert_equal "/foo/foo bar:foobar/", Jekyll::URL.unescape_path("/foo/foo%20bar:foobar/")
end
end
end