jekyll-theme-amethyst 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/doc-search.yaml +25 -0
- data/.github/workflows/gem.yaml +25 -0
- data/.github/workflows/github-pages.yaml +47 -0
- data/.github/workflows/spider-check.yaml +52 -0
- data/.gitignore +4 -0
- data/404.md +9 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +35 -0
- data/_config.yml +91 -0
- data/_data/sidebar_api.yml +13 -0
- data/_data/sidebar_blog.yml +11 -0
- data/_data/sitenav.yml +11 -0
- data/_includes/opengraph.html +49 -0
- data/_includes/search-js.html +113 -0
- data/_includes/search.html +14 -0
- data/_includes/sidebar.html +89 -0
- data/_includes/version.html +28 -0
- data/_layouts/group.html +14 -0
- data/_layouts/home.html +25 -0
- data/_layouts/page-api.html +32 -0
- data/_layouts/page.html +17 -0
- data/_layouts/post.html +37 -0
- data/_layouts/posts-archive.html +17 -0
- data/_layouts/posts-author.html +21 -0
- data/_layouts/posts-tag.html +24 -0
- data/_layouts/posts-year.html +24 -0
- data/_layouts/posts.html +28 -0
- data/_layouts/wrapper.html +132 -0
- data/_posts/2006-01-26-announcing-the-blog.md +13 -0
- data/_posts/2006-10-18-foo-110.md +13 -0
- data/_posts/2007-10-18-foo-112.md +13 -0
- data/_posts/2008-10-18-foo-126.md +13 -0
- data/_posts/2009-10-18-foo-132.md +13 -0
- data/_posts/2010-10-18-foo-143.md +13 -0
- data/_posts/2011-10-18-foo-171.md +13 -0
- data/_posts/2012-10-18-foo-183.md +13 -0
- data/_posts/2013-10-18-foo-191.md +13 -0
- data/_posts/2014-10-18-foo-211.md +13 -0
- data/_posts/2015-10-18-foo-300.md +13 -0
- data/_posts/2017-10-18-foo-321.md +13 -0
- data/_posts/2018-10-18-foo-331.md +13 -0
- data/_posts/2019-10-18-foo-341.md +13 -0
- data/_posts/2020-04-01-foo-350.md +13 -0
- data/_posts/2020-10-18-foo-351.md +13 -0
- data/_posts/2021-04-01-hello-world.md +51 -0
- data/_sass/amethyst-variables.scss +22 -0
- data/_sass/amethyst.scss +906 -0
- data/_sass/custom.scss +2 -0
- data/_sass/highlight.scss +131 -0
- data/about.md +28 -0
- data/amethyst.gemspec +23 -0
- data/api/deprecated.md +5 -0
- data/api/foo/baz.md +49 -0
- data/api/foo/index.md +5 -0
- data/api/foo/quux.md +9 -0
- data/api/index.md +8 -0
- data/api/lorem/dolor.md +14 -0
- data/api/lorem/index.md +5 -0
- data/api/lorem/sit.md +15 -0
- data/api/removed.md +5 -0
- data/assets/logo-algolia.svg +1 -0
- data/assets/styles.scss +7 -0
- data/blog-archive.md +4 -0
- data/blog.md +4 -0
- data/docs/config.md +122 -0
- data/docs/getting-started.md +77 -0
- data/favicon.svg +3 -0
- data/guides.md +11 -0
- data/index.md +51 -0
- data/intro.md +41 -0
- data/lib/jekyll-theme-amethyst.rb +39 -0
- data/tag/event.md +5 -0
- data/tag/release.md +5 -0
- metadata +222 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ae1f567530a5c557779c453ab8ea18940c3620baa598d0362fe922bd2b6fff2f
|
4
|
+
data.tar.gz: 1c202be8204ee0d9073f337cff0b5145a3ef7019b8b1c59e835e750fe1353c72
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f633624fe399ba7a0258b0109c530d3c45155d2b6c350b3bb655895e36beb07b844275f9b479d3b37794bb98b0ac833120c79be16a9a609f5d5e8605849844f8
|
7
|
+
data.tar.gz: 0102d31b93866380a0018c5529c0c78e018ba10833eb8fa57300fe2463acfc3de746ba4d64894cfe1d4b5bf8e201bab107dbd6e1f677b57f37abb1600df8f26f
|
@@ -0,0 +1,25 @@
|
|
1
|
+
name: Update search index
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches:
|
5
|
+
- main
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
run:
|
9
|
+
name: Update search index
|
10
|
+
runs-on: ubuntu-18.04
|
11
|
+
steps:
|
12
|
+
- uses: actions/checkout@v2
|
13
|
+
|
14
|
+
- uses: ruby/setup-ruby@v1
|
15
|
+
# If your site is in a subdirectory
|
16
|
+
# working-directory: ./
|
17
|
+
with:
|
18
|
+
ruby-version: 2.7
|
19
|
+
bundler-cache: true
|
20
|
+
|
21
|
+
- run: bundle exec jekyll algolia
|
22
|
+
# If your site is in a subdirectory
|
23
|
+
# working-directory: ./
|
24
|
+
env:
|
25
|
+
ALGOLIA_API_KEY: "${{ secrets.ALGOLIA_API_KEY }}"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
name: Gem
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
tags:
|
5
|
+
- 'v*.*.*'
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
gem-push:
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
steps:
|
11
|
+
- uses: actions/checkout@v2
|
12
|
+
- name: Publish Gem package
|
13
|
+
env:
|
14
|
+
GEM_HOST_API_KEY: "${{ secrets.RUBYGEMS_API_PUSH }}"
|
15
|
+
# Inspired by https://github.com/bodyshopbidsdotcom/gh-action-publish-gem-on-tag/blob/1.0.1/entrypoint.sh
|
16
|
+
# Docs: https://guides.rubygems.org/command-reference/#gem-push
|
17
|
+
run: |
|
18
|
+
GIT_VERSION=$(echo "$GITHUB_REF" | cut -d'/' -f 3-)
|
19
|
+
SPEC_VERSION=$(ruby -e 'require "rubygems"; gemspec = Dir.entries(".").find { |file| file =~ /.*\.gemspec/ }; spec = Gem::Specification::load(gemspec); puts spec.version')
|
20
|
+
if [[ "$GIT_VERSION" != "v${SPEC_VERSION}" ]]; then
|
21
|
+
echo "Ignoring, git tag version differs from gem spec version."
|
22
|
+
exit 2;
|
23
|
+
fi
|
24
|
+
gem build *.gemspec
|
25
|
+
gem push *.gem
|
@@ -0,0 +1,47 @@
|
|
1
|
+
name: GitHub Pages
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches:
|
5
|
+
- main
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
deploy:
|
9
|
+
name: Deploy
|
10
|
+
runs-on: ubuntu-20.04
|
11
|
+
env:
|
12
|
+
DEPLOY_DIR: _site/
|
13
|
+
DEPLOY_BRANCH: gh-pages
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v2
|
16
|
+
|
17
|
+
- name: Prepare branch
|
18
|
+
run: |
|
19
|
+
mkdir "${DEPLOY_DIR}"
|
20
|
+
cd "${DEPLOY_DIR}"
|
21
|
+
# Clone and checkout existing branch, or initialise with a new and empty branch
|
22
|
+
git clone --depth 5 --branch "${DEPLOY_BRANCH}" "https://github.com/${GITHUB_REPOSITORY}.git" . || git init -b "${DEPLOY_BRANCH}"
|
23
|
+
|
24
|
+
- uses: ruby/setup-ruby@v1
|
25
|
+
# If your site is in a subdirectory
|
26
|
+
# working-directory: ./
|
27
|
+
with:
|
28
|
+
ruby-version: 2.7
|
29
|
+
bundler-cache: true
|
30
|
+
|
31
|
+
- name: Jekyll build
|
32
|
+
# If your site is in a subdirectory
|
33
|
+
# working-directory: ./
|
34
|
+
run: bundle exec jekyll build
|
35
|
+
|
36
|
+
- name: Push to branch
|
37
|
+
# Inspired by https://github.com/helaili/jekyll-action/blob/2.2.0/entrypoint.sh
|
38
|
+
env:
|
39
|
+
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
40
|
+
run: |
|
41
|
+
cd "${DEPLOY_DIR}"
|
42
|
+
touch .nojekyll
|
43
|
+
git config user.name "${GITHUB_ACTOR}" && \
|
44
|
+
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" && \
|
45
|
+
git add . && \
|
46
|
+
git commit --allow-empty -m "Build commit ${GITHUB_SHA}" && \
|
47
|
+
git push "https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" "HEAD:${DEPLOY_BRANCH}"
|
@@ -0,0 +1,52 @@
|
|
1
|
+
name: spider-check
|
2
|
+
on:
|
3
|
+
# Once a week on Friday at 00:00
|
4
|
+
schedule:
|
5
|
+
- cron: '0 0 * * 5'
|
6
|
+
# Or manually
|
7
|
+
workflow_dispatch:
|
8
|
+
# Or when developing this workflow
|
9
|
+
push:
|
10
|
+
paths:
|
11
|
+
- .github/workflows/spider-check.yaml
|
12
|
+
pull_request:
|
13
|
+
paths:
|
14
|
+
- .github/workflows/spider-check.yaml
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
spider-check:
|
18
|
+
env:
|
19
|
+
# Site address to crawl
|
20
|
+
#
|
21
|
+
# If empty, will be derived from a CNAME file or the repo name.
|
22
|
+
#
|
23
|
+
# MY_SITE: https://example.org
|
24
|
+
# MY_SITE: https://example.github.io
|
25
|
+
# MY_SITE: https://example.github.io/my-project/
|
26
|
+
#
|
27
|
+
MY_SITE:
|
28
|
+
runs-on: ubuntu-latest
|
29
|
+
steps:
|
30
|
+
- uses: actions/checkout@v2
|
31
|
+
with:
|
32
|
+
repository: jquery/hydra-link-checker
|
33
|
+
ref: v1.0.2
|
34
|
+
|
35
|
+
- name: Get site address
|
36
|
+
run: |
|
37
|
+
if [[ "$MY_SITE" == "" ]]; then
|
38
|
+
MY_SITE=$(cat CNAME 2>/dev/null || echo "")
|
39
|
+
if [[ "$MY_SITE" == "" ]]; then
|
40
|
+
REPO_BASENAME=$(echo "$GITHUB_REPOSITORY" | cut -d'/' -f 2)
|
41
|
+
REPO_OWNER=$(echo "$GITHUB_REPOSITORY" | cut -d'/' -f 1)
|
42
|
+
if [[ "$REPO_BASENAME" == "${REPO_OWNER}.github.io" ]]; then
|
43
|
+
MY_SITE="${REPO_OWNER}.github.io"
|
44
|
+
else
|
45
|
+
MY_SITE="${REPO_OWNER}.github.io/${REPO_BASENAME}"
|
46
|
+
fi
|
47
|
+
fi
|
48
|
+
echo "MY_SITE=https://${MY_SITE}" >> $GITHUB_ENV
|
49
|
+
fi
|
50
|
+
|
51
|
+
- name: Run hydra-link-checker
|
52
|
+
run: python3 hydra.py "$MY_SITE"
|
data/.gitignore
ADDED
data/404.md
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2020 Timo Tijhof
|
2
|
+
Copyright (c) 2018 Trent Willis
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
[![Build Status: spider-check](https://github.com/qunitjs/jekyll-theme-amethyst/actions/workflows/spider-check.yaml/badge.svg)](https://github.com/qunitjs/jekyll-theme-amethyst/actions/workflows/spider-check.yaml)
|
2
|
+
|
3
|
+
# Amethyst theme
|
4
|
+
|
5
|
+
This repository houses the Amethyst theme for Jekyll.
|
6
|
+
|
7
|
+
## Getting started
|
8
|
+
|
9
|
+
To create a new site, use the **[Getting started](docs/getting-started.md)** guide,
|
10
|
+
or browse the minimal example in the [example](https://github.com/qunitjs/jekyll-theme-amethyst/tree/example) branch.
|
11
|
+
|
12
|
+
## Credits
|
13
|
+
|
14
|
+
The theme was designed by [Trent Willis](https://github.com/trentmwillis/) in 2018 for the [qunitjs.com](https://qunitjs.com/) website ([qunitjs/qunitjs.com#151](https://github.com/qunitjs/qunitjs.com/issues/151#issuecomment-655154878)).
|
15
|
+
|
16
|
+
Thanks to [Leo Balter](https://github.com/leobalter) for initiating the use of Markdown-based static sites for QUnit in 2015 ([qunitjs/api.qunitjs.com#150](https://github.com/qunitjs/api.qunitjs.com/pull/150)).
|
17
|
+
|
18
|
+
## Contributing
|
19
|
+
|
20
|
+
Requirements:
|
21
|
+
|
22
|
+
* [Ruby](https://www.ruby-lang.org/) (tested with Ruby 2.7+)
|
23
|
+
* [Bundler](https://bundler.io/) (if missing, install with `gem install bundler`)
|
24
|
+
|
25
|
+
To install or update Jekyll and plugins:
|
26
|
+
|
27
|
+
```shell
|
28
|
+
bundle update
|
29
|
+
```
|
30
|
+
|
31
|
+
To generate the site and serve it locally at <http://localhost:4000/>:
|
32
|
+
|
33
|
+
```shell
|
34
|
+
bundle exec jekyll serve
|
35
|
+
```
|
data/_config.yml
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# Configuration for the Amethyst development site
|
2
|
+
#
|
3
|
+
# DO NOT COPY
|
4
|
+
#
|
5
|
+
# To create your own site with this theme, use the example branch as
|
6
|
+
# your clean and minimal starting point:
|
7
|
+
# https://github.com/qunitjs/jekyll-theme-amethyst/tree/example
|
8
|
+
#
|
9
|
+
# -------
|
10
|
+
|
11
|
+
# Site settings
|
12
|
+
#
|
13
|
+
# Docs: https://jekyllrb.com/docs/configuration/
|
14
|
+
title: Amethyst Demo
|
15
|
+
description: "An amazing website."
|
16
|
+
url: https://qunitjs.github.io
|
17
|
+
baseurl: /jekyll-theme-amethyst
|
18
|
+
# For pages (not blog posts) this is equivalant to /:title/
|
19
|
+
permalink: /:year/:month/:day/:title/
|
20
|
+
lang: en
|
21
|
+
timezone: UTC
|
22
|
+
# Files that will not be converted or published
|
23
|
+
exclude:
|
24
|
+
# Exclude internal repo files from site output
|
25
|
+
- docs
|
26
|
+
- lib
|
27
|
+
# Avoid the following on GitHub CI:
|
28
|
+
# > Error: could not read file
|
29
|
+
# > vendor/jekyll/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb:
|
30
|
+
# > Invalid date '<%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>':
|
31
|
+
# > Document does not have a valid date in the YAML front matter.
|
32
|
+
- vendor
|
33
|
+
plugins:
|
34
|
+
- jekyll-theme-amethyst
|
35
|
+
|
36
|
+
|
37
|
+
# Theme settings
|
38
|
+
#
|
39
|
+
# Amethyst theme options are documented at:
|
40
|
+
# https://github.com/qunitjs/jekyll-theme-amethyst/blob/main/docs/config.md
|
41
|
+
#
|
42
|
+
theme: jekyll-theme-amethyst
|
43
|
+
amethyst:
|
44
|
+
edituri_base: https://github.com/qunitjs/jekyll-theme-amethyst/blob/main/
|
45
|
+
release_base: https://github.com/qunitjs/qunit/releases/tag/
|
46
|
+
github: qunitjs
|
47
|
+
gitter: qunitjs/qunit
|
48
|
+
# https://github.com/qunitjs/jekyll-theme-amethyst/blob/main/docs/getting-started.md#enable-algolia-search
|
49
|
+
algolia:
|
50
|
+
search_only_api_key: f37678e47d7730bbf340e904a81fbbbd
|
51
|
+
|
52
|
+
|
53
|
+
# Conversion settings
|
54
|
+
#
|
55
|
+
highlighter: rouge
|
56
|
+
markdown: kramdown
|
57
|
+
kramdown:
|
58
|
+
input: GFM
|
59
|
+
toc_levels: "1,2"
|
60
|
+
|
61
|
+
|
62
|
+
# Sass settings
|
63
|
+
#
|
64
|
+
# Docs: https://jekyllrb.com/docs/assets/#sassscss
|
65
|
+
sass:
|
66
|
+
style: compressed
|
67
|
+
sourcemap: never
|
68
|
+
|
69
|
+
|
70
|
+
# Backend search settings
|
71
|
+
#
|
72
|
+
# Docs: https://github.com/algolia/jekyll-algolia
|
73
|
+
algolia:
|
74
|
+
application_id: 4HMKKPGKKN
|
75
|
+
index_name: amethyst-demo
|
76
|
+
# By default only HTML paragraphs are indexed (and headings, albeit through a different mechanism).
|
77
|
+
# * Include list items (similar to paragraphs).
|
78
|
+
# * Include tables (index per row for better excerpts).
|
79
|
+
# * Include <pre> (typically code examples, omit if it "poisons" results too much).
|
80
|
+
nodes_to_index: "p,li,tr,pre"
|
81
|
+
|
82
|
+
|
83
|
+
# Blog archives
|
84
|
+
#
|
85
|
+
# Docs: https://github.com/jekyll/jekyll-archives/
|
86
|
+
jekyll-archives:
|
87
|
+
enabled:
|
88
|
+
- year
|
89
|
+
layout: posts-year
|
90
|
+
permalinks:
|
91
|
+
year: "/:year/"
|
data/_data/sitenav.yml
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
{%- assign feed_page = site.pages | where: 'url', '/feed.xml' | first -%}
|
2
|
+
{%- if feed_page -%}
|
3
|
+
<link rel="alternate" type="application/rss+xml" href="{{ feed_page.url | relative_url | escape }}" title="{{ site.title | escape }}">
|
4
|
+
{% endif -%}
|
5
|
+
|
6
|
+
{%- assign page_title = page.title -%}
|
7
|
+
{%- if page_title == nil and page.date -%}
|
8
|
+
{%- comment -%}
|
9
|
+
Deal with jekyll-archives refusing to add, or facilitate addition of, a title to archive pages.
|
10
|
+
{%- endcomment -%}
|
11
|
+
{%- if page.type == "year" -%}
|
12
|
+
{%- assign page_title = page.date | date: '%Y' -%}
|
13
|
+
{%- elsif page.type == "month" -%}
|
14
|
+
{%- assign page_title = page.date | date: '%B %Y' -%}
|
15
|
+
{%- endif -%}
|
16
|
+
{%- endif -%}
|
17
|
+
|
18
|
+
<title>{% if page.url != '/' and page_title %}{{ page_title | escape }} | {% endif %}{{ site.title | escape }}</title>
|
19
|
+
|
20
|
+
{%- comment -%}
|
21
|
+
See https://ogp.me/
|
22
|
+
{%- endcomment %}
|
23
|
+
{% capture opengraph %}
|
24
|
+
|
25
|
+
<meta property="og:title" content="{{ page_title | default: site.title | escape }}">
|
26
|
+
|
27
|
+
{% if page.excerpt %}
|
28
|
+
{%- assign excerpt = page.excerpt %}
|
29
|
+
{% elsif page.layout == "home" %}
|
30
|
+
{% assign excerpt = site.description %}
|
31
|
+
{% else %}
|
32
|
+
{% assign excerpt = "" %}
|
33
|
+
{% endif %}
|
34
|
+
{% if excerpt and excerpt != empty %}
|
35
|
+
<meta name="description" content="{{ excerpt | strip_html | truncate: 200 | normalize_whitespace | escape }}">
|
36
|
+
<meta property="og:description" content="{{ excerpt | strip_html | truncate: 200 | normalize_whitespace | escape }}">
|
37
|
+
{% endif %}
|
38
|
+
|
39
|
+
{% if site.amethyst.mastodon %}
|
40
|
+
<link rel="me" href="{{ site.amethyst.mastodon | escape }}">
|
41
|
+
{% endif %}
|
42
|
+
{% if site.amethyst.twitter %}
|
43
|
+
<meta name="twitter:creator" content="@{{ site.amethyst.twitter | escape }}">
|
44
|
+
<meta name="twitter:site" content="@{{ site.amethyst.twitter | escape }}">
|
45
|
+
{% endif %}
|
46
|
+
<meta name="twitter:card" content="summary_large_image">
|
47
|
+
|
48
|
+
{% endcapture -%}
|
49
|
+
{{ opengraph | strip_newlines }}
|
@@ -0,0 +1,113 @@
|
|
1
|
+
{%- comment -%}
|
2
|
+
|
3
|
+
For releases and integrity hashes (SRI), see:
|
4
|
+
* https://www.jsdelivr.com/package/npm/algoliasearch
|
5
|
+
* https://www.jsdelivr.com/package/npm/autocomplete.js
|
6
|
+
|
7
|
+
We use type="module" as a natural way to cut the mustard,
|
8
|
+
executing the script only on modern browsers with ES6 support,
|
9
|
+
and causing no errors on older browsers.
|
10
|
+
|
11
|
+
<https://responsivenews.tumblr.com/post/18948466399/cutting-the-mustard>
|
12
|
+
<http://web.archive.org/web/20150305005331/http://responsivenews.co.uk/post/18948466399/cutting-the-mustard>
|
13
|
+
|
14
|
+
{%- endcomment -%}
|
15
|
+
<script type="module">
|
16
|
+
const loadSearch = () => Promise.all([
|
17
|
+
new Promise((resolve) => document.body.append(Object.assign(document.createElement('script'), {
|
18
|
+
crossOrigin: 'anonymous',
|
19
|
+
integrity: 'sha256-YuyfhK9VEyfW6ejFiPbfOX2SELbFrgFU/8tU3MHuh60=',
|
20
|
+
src: 'https://cdn.jsdelivr.net/npm/algoliasearch@4.3.1/dist/algoliasearch-lite.umd.js',
|
21
|
+
onload: resolve
|
22
|
+
}))),
|
23
|
+
new Promise((resolve) => document.body.append(Object.assign(document.createElement('script'), {
|
24
|
+
crossOrigin: 'anonymous',
|
25
|
+
integrity: 'sha256-YVWQosorZnr6fALvOW9VALYuInld27RkSPkElGBdCaU=',
|
26
|
+
src: 'https://cdn.jsdelivr.net/npm/autocomplete.js@0.37.1/dist/autocomplete.min.js',
|
27
|
+
onload: resolve
|
28
|
+
})))
|
29
|
+
]);
|
30
|
+
const input = document.querySelector('#aa-search-input');
|
31
|
+
const form = document.querySelector('#site-search-form');
|
32
|
+
let restoreFocus = false;
|
33
|
+
async function setupSearch(e) {
|
34
|
+
{% comment -%}
|
35
|
+
// Whether to restore focus after autocomplete.js replaces the input element.
|
36
|
+
// This is before the setup check to account for input before load ends.
|
37
|
+
{%- endcomment -%}
|
38
|
+
restoreFocus = restoreFocus || (e && (e.type === 'click' || e.type === 'focus'));
|
39
|
+
if (setupSearch.setup) return;
|
40
|
+
setupSearch.setup = true;
|
41
|
+
await loadSearch();
|
42
|
+
|
43
|
+
const client = algoliasearch('{{ site.amethyst.algolia.application_id | default: site.algolia.application_id }}', '{{ site.amethyst.algolia.search_only_api_key }}');
|
44
|
+
{% if site.amethyst.algolia.sources -%}
|
45
|
+
const indexSources = {{ site.amethyst.algolia.sources | jsonify }};
|
46
|
+
{%- elsif site.algolia.index_name -%}
|
47
|
+
const indexSources = [{ index: {{ site.algolia.index_name | jsonify }}, base: {{ '' | relative_url | jsonify }} }];
|
48
|
+
{%- else -%}
|
49
|
+
const indexSources = [];
|
50
|
+
{%- endif %}
|
51
|
+
const escapeString = autocomplete.escapeHighlightedString;
|
52
|
+
const autocompleteOptions = {
|
53
|
+
// Debug allows inspecting the suggestions
|
54
|
+
debug: true,
|
55
|
+
// (Re)open suggestions on (re)focus when input is non-empty
|
56
|
+
openOnFocus: true,
|
57
|
+
hint: false,
|
58
|
+
ariaLabel: 'search input',
|
59
|
+
templates: {
|
60
|
+
// https://github.com/algolia/autocomplete.js/issues/248
|
61
|
+
empty(query) {
|
62
|
+
return `No results for "${escapeString(query.query)}".`;
|
63
|
+
}
|
64
|
+
{%- if site.amethyst.algolia.branding != "none" %},
|
65
|
+
footer: '<div class="aa-footer">Search by <a class="aa-logo" href="https://algolia.com" target="_blank">Algolia</a></div>'{% endif %}
|
66
|
+
}
|
67
|
+
};
|
68
|
+
function formatURL(suggestion) {
|
69
|
+
return (suggestion.anchor && !suggestion.url.includes('#')) ? suggestion.url + '#' + suggestion.anchor : suggestion.url;
|
70
|
+
}
|
71
|
+
function newHitsSource(index, params) {
|
72
|
+
return function(query, cb) {
|
73
|
+
index.search(query, params).then(
|
74
|
+
res => { cb(res.hits, res); },
|
75
|
+
err => { cb([]); console.error(err); }
|
76
|
+
);
|
77
|
+
};
|
78
|
+
}
|
79
|
+
const autocompleteSources = indexSources.map(source => ({
|
80
|
+
source: newHitsSource(client.initIndex(source.index), { hitsPerPage: 5 }),
|
81
|
+
displayKey: '',
|
82
|
+
templates: {
|
83
|
+
suggestion(suggestion) {
|
84
|
+
const title = [ suggestion.title ].concat(suggestion.headings || []).join(' › ');
|
85
|
+
const content = suggestion._highlightResult.content && suggestion._highlightResult.content.value || '';
|
86
|
+
suggestion._href = (source.base || '') + formatURL(suggestion);
|
87
|
+
return `<a href="${suggestion._href}" tabindex="-1">
|
88
|
+
<p class="aa-suggestion_title">${title}</p>
|
89
|
+
<p class="aa-suggestion_content">${content}</p>
|
90
|
+
</a>`;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
}));
|
94
|
+
const $input = autocomplete('#aa-search-input', autocompleteOptions, autocompleteSources)
|
95
|
+
.on('autocomplete:selected', (e, suggestion) => location.href = suggestion._href || suggestion.url);
|
96
|
+
|
97
|
+
if (restoreFocus) $input.focus();
|
98
|
+
|
99
|
+
// Disable fallback form
|
100
|
+
form.addEventListener('submit', (e) => {
|
101
|
+
e.preventDefault();
|
102
|
+
});
|
103
|
+
}
|
104
|
+
document.addEventListener('keydown', (e) => {
|
105
|
+
if (e.key === '/' && !(document.activeElement && /^(INPUT|TEXTAREA)$/.test(document.activeElement.tagName))) {
|
106
|
+
input.focus();
|
107
|
+
e.preventDefault();
|
108
|
+
}
|
109
|
+
});
|
110
|
+
input.addEventListener('focus', setupSearch, { once: true });
|
111
|
+
form.addEventListener('click', setupSearch, { once: true });
|
112
|
+
form.classList.add('site-search--bound');
|
113
|
+
</script>
|