mirror of
https://github.com/jekyll/jekyll.git
synced 2026-04-28 03:01:03 -04:00
Compare commits
52 Commits
release-pl
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
202df57131 | ||
|
|
d68f76e160 | ||
|
|
5cf05d7d09 | ||
|
|
08c22eefb3 | ||
|
|
3ed83f6450 | ||
|
|
ff0d4dd78d | ||
|
|
65d534a701 | ||
|
|
baab7bf785 | ||
|
|
f07d4f77bc | ||
|
|
d0cf1791f6 | ||
|
|
3c45d9e377 | ||
|
|
26ec089058 | ||
|
|
7e79e461f4 | ||
|
|
b49aa9b707 | ||
|
|
ebe567c1d2 | ||
|
|
4d3db3a83d | ||
|
|
6da6739952 | ||
|
|
161f654409 | ||
|
|
e1b5fd6a15 | ||
|
|
2fe6977e8d | ||
|
|
e91ed76d97 | ||
|
|
a1a42bdb5c | ||
|
|
a2c27b70ec | ||
|
|
0760420670 | ||
|
|
3934fc3184 | ||
|
|
40ac06ed3e | ||
|
|
76982c73c0 | ||
|
|
55024b37ae | ||
|
|
59d5d9ae62 | ||
|
|
a2330bb3b3 | ||
|
|
79a8e16f22 | ||
|
|
e2e1ee8eaa | ||
|
|
2a37caac83 | ||
|
|
84437a5052 | ||
|
|
01781355ef | ||
|
|
fa5575c806 | ||
|
|
cc583c218c | ||
|
|
5f877c347b | ||
|
|
dfbd86db50 | ||
|
|
1b617d7281 | ||
|
|
f6d9f86e04 | ||
|
|
148c1d395c | ||
|
|
07a01b0bc9 | ||
|
|
82efcc4c51 | ||
|
|
1e4696457d | ||
|
|
f320d0d5d7 | ||
|
|
193d2eca7f | ||
|
|
0db8443b41 | ||
|
|
e4f0c58395 | ||
|
|
1f319fb273 | ||
|
|
c5cd1fb04f | ||
|
|
33e8a84a00 |
8
.github/SECURITY.markdown
vendored
8
.github/SECURITY.markdown
vendored
@@ -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
|
||||
|
||||
|
||||
2
.github/actions/spelling/allow.txt
vendored
2
.github/actions/spelling/allow.txt
vendored
@@ -1,3 +1,4 @@
|
||||
azion
|
||||
builtins
|
||||
github
|
||||
hakiri
|
||||
@@ -7,6 +8,7 @@ Microsoft
|
||||
ssh
|
||||
Statictastic
|
||||
statictastic
|
||||
supranode
|
||||
ubuntu
|
||||
Wikipedia
|
||||
workaround
|
||||
|
||||
5
.github/actions/spelling/expect.txt
vendored
5
.github/actions/spelling/expect.txt
vendored
@@ -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
17
.github/release-please-config.json
vendored
Normal 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
3
.github/release-please-manifest.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
".": "4.4.1"
|
||||
}
|
||||
50
.github/workflows/conventional-commits.yml
vendored
Normal file
50
.github/workflows/conventional-commits.yml
vendored
Normal 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
44
.github/workflows/release-please.yml
vendored
Normal 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
|
||||
34
.github/workflows/release.yml
vendored
34
.github/workflows/release.yml
vendored
@@ -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 }}
|
||||
2
.github/workflows/spelling.yml
vendored
2
.github/workflows/spelling.yml
vendored
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
[](../../graphs/contributors)
|
||||
[](../../graphs/contributors)
|
||||
|
||||
### Backers
|
||||
|
||||
|
||||
18
Rakefile
18
Rakefile
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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/).
|
||||
|
||||
|
||||
10
docs/_posts/2025-01-29-jekyll-4-4-1-released.markdown
Normal file
10
docs/_posts/2025-01-29-jekyll-4-4-1-released.markdown
Normal 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.
|
||||
@@ -1 +1 @@
|
||||
4.4.0
|
||||
4.4.1
|
||||
|
||||
@@ -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/)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
#
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Jekyll
|
||||
VERSION = "4.4.0"
|
||||
VERSION = "4.4.1"
|
||||
end
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
11
script/test
11
script/test
@@ -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
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<svg></svg>
|
||||
|
Before Width: | Height: | Size: 13 B |
@@ -1,3 +0,0 @@
|
||||
---
|
||||
speciality: Ruby
|
||||
---
|
||||
@@ -1 +0,0 @@
|
||||
<svg></svg>
|
||||
|
Before Width: | Height: | Size: 13 B |
@@ -1,3 +0,0 @@
|
||||
---
|
||||
speciality: JS Frameworks
|
||||
---
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
42
test/test_publisher.rb
Normal 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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user