open-source-documentation-jekyll-theme 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4dd75823dbf82183f77e41b275c70dc646d836f016d4a32bca7a97aba54a7704
4
+ data.tar.gz: 8dc0f7837268c42be5ca4e1d64a74b108c47441280188bb7946e1871826892ed
5
+ SHA512:
6
+ metadata.gz: c8c33cfc8cb52876fd631d2d63c4a238181ff88beeeadfbaaa33475c1afe0723f20b058143d2532490da719c524e7499caf629c83eed9dd7f3dab866094e865a
7
+ data.tar.gz: 8decfd233ea6981277646bea19d5e872143c729d0f532c496f574f7b945e381cdb47dd7963bdbb2fe93aaba4daeac3cd5ddca7b91ce4cceda5be98611edf0407
data/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # Changelog
2
+
3
+ All notable changes to the [Open Source Documentation (Jekyll Theme)](https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme) will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/) and this project adheres to [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [v1.1.0](https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme/releases/tag/v1.1.0) (June 27, 2026)
8
+ * Added Open Graph and Twitter Card meta tags, configurable at the site or page level, via the new `image`, `twitter_site`/`twitter_creator` site options and the new `image` and `og_type` page options
9
+ * Added page-level `description` support so a page can override the site description for its meta description and social tags
10
+ * Added page-level `keywords` support so a page can override the site keywords in its meta tags
11
+ * Added an optional `nav` site option for navigation links that are not tied to a page, merged with page-based links and sorted together by `nav_order`
12
+ * Limited the social links aside to the first ten entries so the icon grid stays intact
13
+ * Changed syntax highlighting to be self-hosted instead of loaded from a CDN — highlight.js is now vendored from the `@highlightjs/cdn-assets` npm package and built with gulp, with the styles stripped to colour, weight and style declarations so they cannot conflict with the stylesheet
14
+ * Added support for older browsers via cross-browser JavaScript fallbacks
15
+ * Added automated install tracking with an installs badge and a generated `INSTALLS.md` report
16
+ * Hardened HTML output by escaping interpolated configuration values (titles, descriptions, labels and URLs) to prevent broken markup from special characters
17
+ * Added support for installing the theme as a RubyGem in addition to `remote_theme`
18
+
19
+ ## [v1.0.0](https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme/releases/tag/v1.0.0) (June 14, 2026)
20
+ * Initial release of the theme
data/LICENSE ADDED
@@ -0,0 +1,16 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026 Andrew G. Johnson <andrew@andrewgjohnson.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6
+ documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
7
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
8
+ persons to whom the Software is furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
11
+ Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
14
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # Open Source Documentation (Jekyll Theme)
2
+
3
+ [![MIT License](https://img.shields.io/badge/license-MIT-0366d6.png?colorB=0366d6&style=flat-square)](https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme/blob/main/LICENSE)
4
+ [![Current Release](https://img.shields.io/github/release/andrewgjohnson/open-source-documentation-jekyll-theme.png?colorB=0366d6&style=flat-square&logoColor=white&logo=github)](https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme/releases)
5
+ [![Issues](https://img.shields.io/github/issues/andrewgjohnson/open-source-documentation-jekyll-theme.png?colorB=0366d6&style=flat-square&logoColor=white&logo=github)](https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme/issues)
6
+ [![Installs](assets/images/installs-badge.png)](INSTALLS.md)
7
+ [![Patreon](assets/images/patreon-badge.png)](https://patreon.com/agjopensource)
8
+
9
+ <p align="center">
10
+ <a href="https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme" title="Open Source Documentation (Jekyll Theme)">
11
+ <img src="assets/images/avatar.png" width="400" alt="Open Source Documentation (Jekyll Theme)" />
12
+ </a>
13
+ </p>
14
+
15
+ ## Description
16
+
17
+ **Open Source Documentation (Jekyll Theme)** is a shared Jekyll theme started by [Andrew G. Johnson](https://github.com/andrewgjohnson) for open source documentation.
18
+
19
+ ## Usage/Installation
20
+
21
+ The theme can be used as a RubyGem or via `remote_theme`.
22
+
23
+ ### As a gem
24
+
25
+ Add to your `Gemfile`:
26
+
27
+ ```ruby
28
+ gem "open-source-documentation-jekyll-theme"
29
+ ```
30
+
31
+ And to your `_config.yml`:
32
+
33
+ ```yaml
34
+ theme: open-source-documentation-jekyll-theme
35
+ ```
36
+
37
+ ### Via `remote_theme` (e.g. GitHub Pages)
38
+
39
+ ```yaml
40
+ remote_theme: andrewgjohnson/open-source-documentation-jekyll-theme
41
+ plugins:
42
+ - jekyll-remote-theme
43
+ ```
44
+
45
+ ## Variables
46
+
47
+ ### Site config (`_config.yml`)
48
+
49
+ | Variable | Required | Description |
50
+ |----------|----------|-------------|
51
+ | `name` | yes | Project name displayed in the wordmark and social links aside |
52
+ | `title` | yes | Site title used in `<title>` and keywords meta tag |
53
+ | `description` | yes | Site description used in meta tags; overridable per page with page-level `description` |
54
+ | `favicon` | no | URL of the favicon |
55
+ | `image` | no | Absolute URL of the default Open Graph / Twitter share image |
56
+ | `twitter_site` | no | Twitter/X `@handle` for the site, emitted as `twitter:site` |
57
+ | `twitter_creator` | no | Twitter/X `@handle` for the author, emitted as `twitter:creator` |
58
+ | `cover_image` | no | Filename (without extension) of a bundled cover image — `mountains` or `forest` |
59
+ | `cover_image_url` | no | Absolute URL of a custom cover image, takes precedence over `cover_image` |
60
+ | `menu_url` | no | URL for the menu toggle link — if omitted the toggle renders as a `<span>` instead of `<a>` |
61
+ | `keywords` | no | Comma-separated keywords prepended to the auto-generated keywords meta tag |
62
+ | `social_links` | no | Array of social links shown in the aside — each entry has `platform`, `url`, and `label` fields |
63
+ | `nav` | no | Array of navigation links not tied to a page — each entry has `url`, `label`, and `nav_order`. Merged with page-based nav links and sorted together by `nav_order` |
64
+ | `footer_text` | no | Text displayed in the footer before the copyright notice |
65
+ | `footer_url` | no | Absolute URL that wraps `footer_text` as a link — only used when `footer_text` is also set |
66
+ | `copyright_year_start` | no | Four-digit year the project was first released (e.g. `2013`) — when set and different from the current year, renders as a year range |
67
+ | `syntax_highlighting` | no | Set to `true` to include highlight.js CSS and JS |
68
+ | `custom_head` | no | Raw HTML injected at the end of `<head>` |
69
+ | `custom_body` | no | Raw HTML injected at the end of `<body>` |
70
+
71
+ #### `social_links` example
72
+
73
+ ```yaml
74
+ social_links:
75
+ - platform: github
76
+ url: https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme
77
+ label: GitHub Repository
78
+ - platform: facebook
79
+ url: https://www.facebook.com/andrewgjohnson
80
+ label: Facebook Profile
81
+ - platform: homepage
82
+ url: https://www.andrewgjohnson.com/
83
+ label: Personal Homepage
84
+ ```
85
+
86
+ Supported platforms: `bluesky`, `codepen`, `dev`, `discord`, `facebook`, `github`, `gitlab`, `instagram`, `linkedin`, `mastodon`, `npm`, `packagist`, `patreon`, `reddit`, `slack`, `stackoverflow`, `threads`, `tiktok`, `twitch`, `twitter`, `x` and `youtube`. Any unrecognized platform will render a generic link icon.
87
+
88
+ #### `nav` example
89
+
90
+ Extra links (typically external) that appear in the main navigation alongside pages, ordered by `nav_order`:
91
+
92
+ ```yaml
93
+ nav:
94
+ - url: https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme
95
+ label: GitHub
96
+ nav_order: 101
97
+ - url: https://example.com/changelog/
98
+ label: Changelog
99
+ nav_order: 102
100
+ ```
101
+
102
+ Page-based links use the page's `nav_order`; `nav` links use their own. Because both share a single ordering you can interleave them. Unlike page links, `nav` URLs are used verbatim (no `baseurl` is prepended), so use absolute URLs.
103
+
104
+ ### Page frontmatter
105
+
106
+ | Variable | Required | Description |
107
+ |----------|----------|-------------|
108
+ | `nav_order` | no | Integer controlling this page’s position in the navigation — pages without this set are excluded from the nav entirely |
109
+ | `nav_text` | no | Label for this page’s navigation link — required when `nav_order` is set |
110
+ | `canonical` | no | Canonical URL injected as `<link rel="canonical">` in `<head>` |
111
+ | `description` | no | Overrides `site.description` for this page (meta description + Open Graph/Twitter) |
112
+ | `image` | no | Absolute URL of this page’s share image — overrides `site.image` |
113
+ | `og_type` | no | Open Graph `og:type` for this page (defaults to `website`; use `article` for posts) |
114
+
115
+ ## Layout
116
+
117
+ The theme provides a single `default` layout. Used by setting `layout: default` in the page frontmatter.
118
+
119
+ ## Projects using this theme
120
+
121
+ You can see projects currently using this theme in the [INSTALLS.md](INSTALLS.md) file.
122
+
123
+ ## Acknowledgements
124
+
125
+ This theme was started by [Andrew G. Johnson (@andrewgjohnson)](https://github.com/andrewgjohnson).
126
+
127
+ Full list of contributors:
128
+ * [Andrew G. Johnson (@andrewgjohnson)](https://github.com/andrewgjohnson)
129
+
130
+ Our [security policies and procedures](https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme/blob/main/.github/SECURITY.md) come via the [atomist/samples](https://github.com/atomist/samples/blob/master/SECURITY.md) project. Our [issue templates](https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme/tree/main/.github/ISSUE_TEMPLATE) come via the [tensorflow/tensorflow](https://github.com/tensorflow/tensorflow/tree/master/.github/ISSUE_TEMPLATE) project. Our [pull request template](https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme/blob/main/.github/PULL_REQUEST_TEMPLATE.md) comes via the [stevemao/github-issue-templates](https://github.com/stevemao/github-issue-templates) project. The [mountains photo](https://unsplash.com/photos/qJvpykJ5SKs) comes via [Gabriel Garcia Marengo](https://unsplash.com/@gabrielgm). The [forest photo](https://unsplash.com/photos/RfTD9NoLMEE) comes via [Radek Homola](https://unsplash.com/@radekhomola).
131
+
132
+ ## Changelog
133
+
134
+ You can find all notable changes in the [changelog](CHANGELOG.md).
@@ -0,0 +1,195 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ /**
4
+ * Open Source Documentation (Jekyll Theme)
5
+ *
6
+ * Copyright (c) 2026 Andrew G. Johnson <andrew@andrewgjohnson.com>
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
8
+ * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
9
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
10
+ * permit persons to whom the Software is furnished to do so, subject to the following conditions:
11
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
12
+ * Software.
13
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
14
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
17
+ *
18
+ * @category AndrewGJohnson
19
+ * @package Open Source Documentation (Jekyll Theme)
20
+ * @author Andrew G. Johnson <andrew@andrewgjohnson.com>
21
+ * @copyright 2026 Andrew G. Johnson <andrew@andrewgjohnson.com>
22
+ * @license https://opensource.org/licenses/mit/ The MIT License
23
+ * @link https://github.com/andrewgjohnson/open-source-documentation-jekyll-theme
24
+ */
25
+ -->
26
+ <html lang="en">
27
+ <head>
28
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
29
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
30
+ {% assign meta_title = page.title | default: site.title %}
31
+ {% assign meta_description = page.description | default: site.description %}
32
+ {% assign meta_keywords = page.keywords | default: site.keywords %}
33
+ {% assign meta_image = page.image | default: site.image %}
34
+ {% assign meta_url = page.canonical | default: page.url | absolute_url %}
35
+ <title>{{ meta_title | escape }}</title>
36
+ <meta name="description" content="{{ meta_description | escape }}" />
37
+ <meta name="keywords" content="{% if meta_keywords %}{{ meta_keywords | escape }},{% endif %}{% if page.title %}{{ page.title | escape }},{% endif %}{% if site.title %}{{ site.title | escape }}{% endif %}" />
38
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
39
+ <link rel="shortcut icon" href="{{ site.favicon | escape }}" />
40
+ <link rel="icon" href="{{ site.favicon | escape }}" />
41
+ {% if page.canonical %}
42
+ <link rel="canonical" href="{{ page.canonical | escape }}" />
43
+ {% endif %}
44
+ <meta property="og:type" content="{{ page.og_type | default: 'website' | escape }}" />
45
+ <meta property="og:site_name" content="{{ site.name | escape }}" />
46
+ <meta property="og:title" content="{{ meta_title | escape }}" />
47
+ <meta property="og:description" content="{{ meta_description | escape }}" />
48
+ <meta property="og:url" content="{{ meta_url | escape }}" />
49
+ {% if meta_image %}
50
+ <meta property="og:image" content="{{ meta_image | absolute_url | escape }}" />
51
+ {% endif %}
52
+ <meta name="twitter:card" content="{% if meta_image %}summary_large_image{% else %}summary{% endif %}" />
53
+ <meta name="twitter:title" content="{{ meta_title | escape }}" />
54
+ <meta name="twitter:description" content="{{ meta_description | escape }}" />
55
+ {% if meta_image %}
56
+ <meta name="twitter:image" content="{{ meta_image | absolute_url | escape }}" />
57
+ {% endif %}
58
+ {% assign twitter_site = page.twitter_site | default: site.twitter_site %}
59
+ {% if twitter_site %}
60
+ <meta name="twitter:site" content="{{ twitter_site | escape }}" />
61
+ {% endif %}
62
+ {% assign twitter_creator = page.twitter_creator | default: site.twitter_creator %}
63
+ {% if twitter_creator %}
64
+ <meta name="twitter:creator" content="{{ twitter_creator | escape }}" />
65
+ {% endif %}
66
+ {% if jekyll.environment == "production" %}
67
+ <link rel="stylesheet" href="{{ '/assets/css/stylesheet.min.css' | prepend: site.baseurl }}?_={{ site.time | date: '%Y%m%d%H%M%S' }}" />
68
+ {% else %}
69
+ <link rel="stylesheet" href="{{ '/assets/css/stylesheet.css' | prepend: site.baseurl }}" />
70
+ {% endif %}
71
+ {% if site.cover_image_url %}
72
+ <style>#cover-image { background-image:url("{{ site.cover_image_url | uri_escape }}") }</style>
73
+ {% elsif site.cover_image %}
74
+ <style>#cover-image { background-image:url("{{ '/assets/images/cover/' | append: site.cover_image | append: '.jpg' | prepend: site.baseurl | uri_escape }}") }</style>
75
+ {% endif %}
76
+ {% if site.syntax_highlighting %}
77
+ <link rel="stylesheet" href="{{ '/assets/css/highlight-js.min.css' | prepend: site.baseurl }}?_={{ site.time | date: '%Y%m%d%H%M%S' }}" />
78
+ {% endif %}
79
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css" integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw==" crossorigin="anonymous" />
80
+ {% if site.custom_head %}
81
+ {{ site.custom_head }}
82
+ {% endif %}
83
+ </head>
84
+ <body>
85
+ <div id="container">
86
+ <main>
87
+ {{ content }}
88
+ </main>
89
+ {% if site.social_links %}
90
+ <aside aria-label="Social links">
91
+ {% assign social_limit = 10 %}
92
+ {% assign social_count = site.social_links | size %}
93
+ {% if social_count > social_limit %}
94
+ {% assign social_count = social_limit %}
95
+ {% endif %}
96
+ <div id="aside" class="aside-{{ social_count }}">
97
+ <p>Follow <strong>{{ site.name | escape }}</strong> online</p>
98
+ <ul>
99
+ {% for social_link in site.social_links limit: social_limit %}
100
+ <li>
101
+ <a href="{{ social_link.url | escape }}" title="{{ social_link.label | escape }}">
102
+ <span>{{ social_link.label | escape }}</span>
103
+ {% case social_link.platform %}
104
+ {% when 'bluesky' %}<i class="fab fa-bluesky" aria-hidden="true"></i>
105
+ {% when 'codepen' %}<i class="fab fa-codepen" aria-hidden="true"></i>
106
+ {% when 'dev' %}<i class="fab fa-dev" aria-hidden="true"></i>
107
+ {% when 'discord' %}<i class="fab fa-discord" aria-hidden="true"></i>
108
+ {% when 'facebook' %}<i class="fab fa-facebook" aria-hidden="true"></i>
109
+ {% when 'github' %}<i class="fab fa-github" aria-hidden="true"></i>
110
+ {% when 'gitlab' %}<i class="fab fa-gitlab" aria-hidden="true"></i>
111
+ {% when 'instagram' %}<i class="fab fa-instagram" aria-hidden="true"></i>
112
+ {% when 'linkedin' %}<i class="fab fa-linkedin" aria-hidden="true"></i>
113
+ {% when 'mastodon' %}<i class="fab fa-mastodon" aria-hidden="true"></i>
114
+ {% when 'npm' %}<i class="fab fa-npm" aria-hidden="true"></i>
115
+ {% when 'packagist' %}<i class="fa-solid fa-box-open" aria-hidden="true"></i>
116
+ {% when 'patreon' %}<i class="fab fa-patreon" aria-hidden="true"></i>
117
+ {% when 'reddit' %}<i class="fab fa-reddit" aria-hidden="true"></i>
118
+ {% when 'slack' %}<i class="fab fa-slack" aria-hidden="true"></i>
119
+ {% when 'stackoverflow' %}<i class="fab fa-stack-overflow" aria-hidden="true"></i>
120
+ {% when 'threads' %}<i class="fab fa-threads" aria-hidden="true"></i>
121
+ {% when 'tiktok' %}<i class="fab fa-tiktok" aria-hidden="true"></i>
122
+ {% when 'twitch' %}<i class="fab fa-twitch" aria-hidden="true"></i>
123
+ {% when 'twitter' %}<i class="fab fa-twitter" aria-hidden="true"></i>
124
+ {% when 'x' %}<i class="fab fa-x-twitter" aria-hidden="true"></i>
125
+ {% when 'youtube' %}<i class="fab fa-youtube" aria-hidden="true"></i>
126
+ {% else %}<i class="fa-solid fa-link" aria-hidden="true"></i>
127
+ {% endcase %}
128
+ </a>
129
+ </li>
130
+ {% endfor %}
131
+ </ul>
132
+ </div>
133
+ </aside>
134
+ {% endif %}
135
+ </div>
136
+ <header>
137
+ <div id="header">
138
+ <div id="header-inner">
139
+ {% assign nav_items = site.pages | where_exp: "item", "item.nav_order != nil" %}
140
+ {% if site.nav %}
141
+ {% assign nav_items = nav_items | concat: site.nav %}
142
+ {% endif %}
143
+ {% assign nav_items = nav_items | sort: 'nav_order' %}
144
+ <p>
145
+ <a href="{{ '/' | prepend: site.baseurl }}" title="{{ site.name | escape }}" id="wordmark">{{ site.name | escape }}</a>
146
+ {% if nav_items.size > 0 %}
147
+ {% if site.menu_url %}
148
+ <a href="{{ site.menu_url | prepend: site.baseurl | escape }}" title="Menu" id="menu-toggle" aria-expanded="false" aria-controls="nav">Menu</a>
149
+ {% else %}
150
+ <span title="Menu" id="menu-toggle" role="button" tabindex="0" aria-expanded="false" aria-controls="nav">Menu</span>
151
+ {% endif %}
152
+ {% endif %}
153
+ </p>
154
+ {% if nav_items.size > 0 %}
155
+ <nav aria-label="Main navigation" id="nav">
156
+ <ul>
157
+ {% for nav_item in nav_items %}
158
+ {% assign nav_text = nav_item.nav_text | default: nav_item.title %}
159
+ <li>
160
+ <a href="{{ nav_item.url | relative_url | escape }}" title="{{ nav_text | escape }}">{{ nav_text | escape }}</a>
161
+ </li>
162
+ {% endfor %}
163
+ </ul>
164
+ </nav>
165
+ {% endif %}
166
+ </div>
167
+ </div>
168
+ </header>
169
+ <footer>
170
+ <div id="footer">
171
+ <p>
172
+ {% if site.footer_url %}<a href="{{ site.footer_url | escape }}" title="{{ site.footer_text | default: site.footer_url | escape }}">{{ site.footer_text | default: site.footer_url | escape }}</a>{% elsif site.footer_text %}{{ site.footer_text | escape }} {% endif %}
173
+ &#169;
174
+ {% assign current_year = site.time | date: '%Y' | plus: 0 %}
175
+ {% if site.copyright_year_start and site.copyright_year_start != current_year %}{{ site.copyright_year_start }}&ndash;{% endif %}{{ site.time | date: '%Y' }}
176
+ </p>
177
+ </div>
178
+ </footer>
179
+ <div id="cover-image" aria-hidden="true"></div>
180
+ {% if jekyll.environment == "production" %}
181
+ <script type="text/javascript" src="{{ '/assets/js/javascript.min.js' | prepend: site.baseurl }}?_={{ site.time | date: '%Y%m%d%H%M%S' }}"></script>
182
+ {% else %}
183
+ <script type="text/javascript" src="{{ '/assets/js/javascript.js' | prepend: site.baseurl }}"></script>
184
+ {% endif %}
185
+ {% if site.syntax_highlighting %}
186
+ <script type="text/javascript" src="{{ '/assets/js/highlight-js.min.js' | prepend: site.baseurl }}?_={{ site.time | date: '%Y%m%d%H%M%S' }}"></script>
187
+ <script type="text/javascript">
188
+ hljs.highlightAll();
189
+ </script>
190
+ {% endif %}
191
+ {% if site.custom_body %}
192
+ {{ site.custom_body }}
193
+ {% endif %}
194
+ </body>
195
+ </html>
@@ -0,0 +1,7 @@
1
+ /**
2
+ * GENERATED FILE - do not edit by hand.
3
+ * Regenerate with `npx gulp` (sourced from the @highlightjs/cdn-assets
4
+ * npm package; bump that dependency to update). Only the color, font-style, font-weight
5
+ * properties are kept so layout rules cannot conflict with stylesheet.css.
6
+ * highlight.js (c) highlight.js contributors, BSD-3-Clause.
7
+ */.hljs{color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}
@@ -0,0 +1,112 @@
1
+ /**
2
+ YUI 3.18.1 (build f7e7bcb)
3
+ Copyright 2014 Yahoo! Inc. All rights reserved.
4
+ Licensed under the BSD License.
5
+ */
6
+ html{color:#000;background:#FFF}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;*font-size:100%}legend{color:#000}#yui3-css-stamp.cssreset{display:none}
7
+
8
+ html,body,code { color:#24292e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px }
9
+ a,a code { color:#0366d6;text-decoration:none }
10
+ a:hover { text-decoration:underline }
11
+ strong { font-weight:bold }
12
+ em { font-style:italic }
13
+ strong em,em strong { font-style:italic;font-weight:bold }
14
+ h1,h2,h3,h4,h5,h6 { border-bottom:1px solid #dbdddf;clear:both;font-size:32px;font-weight:600;padding:15px 10px 5px }
15
+ h2 { font-size:24px }
16
+ h3,h4,h5,h6 { border-bottom:0;font-size:20px;padding-bottom:0 }
17
+ h4 { font-size:16px }
18
+ h5 { font-size:15px }
19
+ h6 { font-size:14px }
20
+ p,ul,ol { line-height:150%;margin:0;padding:10px 10px 0 }
21
+ ul,ol { padding-left:35px }
22
+ ul li { list-style-type:disc }
23
+ ol li { list-style-type:decimal }
24
+ img { box-sizing:border-box;max-width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box }
25
+ table { display:block;line-height:150%;max-width:100%;overflow:auto;padding:10px 10px 0;width:100%;width:max-content }
26
+ table tr { background-color:#ffffff;border-top:1px solid #dbdddf }
27
+ table tr:nth-child(even) { background-color:#f6f8fa }
28
+ table tr:hover { background-color:#ffffdd }
29
+ table th,table td { border:1px solid #dbdddf;padding:6px 13px }
30
+ table th { background-color:#ffffff;font-weight:bold;text-align:center }
31
+ table tr:nth-child(even) code { background-color:#e9eaea }
32
+ table tr:nth-child(even):hover code { background-color:#f3f4f4 }
33
+ code { background-color:#f3f4f4;padding:0 5px }
34
+ pre,pre code { background-color:#f6f8fa;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;line-height:150%;padding:0 }
35
+ pre { border:0 solid #ffffff;border-width:0 10px;box-sizing:border-box;display:block;margin:10px 0 0;-moz-box-sizing:border-box;overflow-x:scroll;overflow-y:visible;padding:10px;-webkit-box-sizing:border-box;width:100% }
36
+ hr { background-color:#eceef0;border:0;color:#eceef0;height:1px;margin:15px auto 0;padding:0;width:100% }
37
+ hr + p,hr + ul,hr + ol { padding-top:15px }
38
+
39
+ div.highlight { position:relative }
40
+ span.copy-code { background-color:#ffffff;background-color:rgba(255,255,255,0.67);border-radius:5px;color:#48525c;cursor:pointer;display:block;float:right;font-size:13px;-moz-border-radius:5px;padding:3px 5px;position:absolute;right:10px;top:10px;z-index:8 }
41
+ div.highlight span.copy-code { right:20px }
42
+ span.copy-code:hover { background-color:#ffffff;text-decoration:underline }
43
+ span.copy-code i { color:#6c7b8a;margin-right:5px }
44
+
45
+ form.interactive { background-color:#eeeeee;border:1px solid #dddddd;margin:10px 10px 0;overflow:auto;position:relative }
46
+ form.interactive p,form.interactive pre { display:block;float:left;padding-bottom:10px;padding-top:10px;width:200px }
47
+ form.interactive pre { background-color:#f9f9f9;border:0 solid #dddddd;border-width:0 0 0 1px;float:none;font-family:'Consolas','Courier New','Courier',mono-space;font-size:12px;margin:0 0 0 195px;_margin:0;width:598px;_width:595px }
48
+ form.interactive-tall pre { bottom:0;position:absolute;right:0;top:0 }
49
+ form.interactive pre li { height:14px;*height:auto }
50
+ form.interactive select,form.interactive input { display:block;float:left;font-size:12px;height:20px;*height:24px;margin-right:5px }
51
+ form.interactive input { height:16px;padding:1px;width:111px }
52
+ form.interactive-tall input,form.interactive-tall select { box-sizing:border-box;height:22px;-moz-box-sizing:border-box;padding:1px;-webkit-box-sizing:border-box;width:175px }
53
+ form.interactive input.checkbox { height:25px;margin-right:10px;padding:0;width:25px }
54
+ form.interactive input.submit { background-color:#0366d6;border:0;border-radius:5px;color:#ffffff;cursor:pointer;font-size:16px;font-weight:bold;height:auto;-moz-border-radius:5px;padding:10px 20px;width:auto }
55
+ form.interactive br { clear:both }
56
+ form.interactive + p { padding-top:0;text-align:right }
57
+
58
+ #container { background-color:#ffffff;margin:0 auto;max-width:840px;padding:61px 10px 30px;position:relative;*width:840px;_width:840px;z-index:8 }
59
+ #header { background-color:#f6f8fa;border-bottom:1px solid #dbdddf;height:60px;left:0;position:fixed;right:0;top:0;z-index:9 }
60
+ #header-inner { margin:0 auto;max-width:840px;padding:0;position:relative;*width:840px;_width:840px;z-index:9 }
61
+ #wordmark { display:block;float:left;font-weight:bold;height:60px;left:0;line-height:60px;padding:0 10px;position:absolute;top:0;z-index:2 }
62
+ #menu-toggle { display:none }
63
+ #header ul { float:right;padding:0 5px 0 0;position:absolute;right:5px;top:0 }
64
+ #header li { display:block;float:left;list-style-type:none }
65
+ #header ul a { display:block;float:left;height:60px;line-height:60px;padding:0 5px }
66
+ #aside { background-color:#eeeeee;border-radius:5px;margin:15px 10px 0;-moz-border-radius:5px;padding:5px 15px 15px;text-align:center }
67
+ #aside ul { font-size:48px;height:48px;padding:5px 5% 0;width:90% }
68
+ #aside li { display:block;float:left;height:48px;list-style-type:none;padding:0 }
69
+ div.aside-1 li { width:100% }
70
+ div.aside-2 li { width:50% }
71
+ div.aside-3 li { width:33.3% }
72
+ div.aside-4 li { width:25% }
73
+ div.aside-5 li { width:20% }
74
+ div.aside-6 li { width:16.6% }
75
+ div.aside-7 li { font-size:33px;width:14.2% }
76
+ div.aside-8 li { font-size:30px;width:12.5% }
77
+ div.aside-9 li { font-size:27px;width:11.1% }
78
+ div.aside-10 li { font-size:24px;width:10% }
79
+ #aside a { cursor:pointer;display:block;float:left;height:48px;line-height:48px;width:100% }
80
+ #aside a:hover { color:#000000;text-decoration:none }
81
+ #aside i { margin:0 auto }
82
+ #aside span { display:none }
83
+ #footer { margin:0 auto;max-width:860px;position:relative;*width:860px;_width:860px;z-index:8 }
84
+ #footer p { background-color:#ffffff;border-radius:0 0 5px 5px;border-top:1px solid #eceef0;clear:both;color:#caccce;-moz-border-radius:0 0 5px 5px;padding-bottom:15px;padding-top:15px;text-align:center }
85
+ #cover-image { background-color:#eceef0;background-position:50% 50%;background-repeat:no-repeat;background-size:cover;height:400px;left:0;margin:0;padding:0;position:absolute;right:0;top:61px;z-index:2 }
86
+ #cover-image:before { background-image:linear-gradient(to bottom,rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);background-image:-moz-linear-gradient(top,rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,0)),color-stop(100%,rgba(255,255,255,1)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);bottom:0;content:"";display:block;left:0;height:200px;position:absolute;right:0;z-index:2 }
87
+
88
+ @media only screen and (max-width : 879px) {
89
+ h1,h2,h3,h4,h5,h6 { font-size:24px;overflow:hidden;text-overflow:ellipsis }
90
+ h2 { font-size:21px }
91
+ h3 { font-size:18px }
92
+ h4 { font-size:16px }
93
+ h5 { font-size:15px }
94
+ h6 { font-size:14px }
95
+ span.copy-code { display:none }
96
+ form.interactive p { float:none;padding-bottom:20px;padding-top:15px;overflow:auto;width:auto }
97
+ form.interactive pre { border-width:1px 0 0;margin-left:0;width:auto }
98
+ form.interactive-tall pre { bottom:auto;position:static;right:auto;top:auto }
99
+ #container { max-width:none }
100
+ #header-inner { max-width:none }
101
+ #wordmark { padding-left:20px;padding-right:20px }
102
+ #menu-toggle { background-color:#eceef0;border:1px solid #dbdddf;border-radius:5px;color:#5d5f61;cursor:pointer;display:block;font-size:10px;font-weight:bold;height:22px;line-height:22px;-moz-border-radius:5px;padding:16px 0 0;position:absolute;right:10px;text-align:center;text-decoration:none!important;top:10px;width:38px;z-index:3 }
103
+ #menu-toggle:before { background-color:#5d5f61;content:"";height:12px;left:10px;position:absolute;right:10px;top:6px }
104
+ #menu-toggle:after { border:0 solid #eceef0;border-width:3px 0;content:"";height:2px;left:10px;position:absolute;right:10px;top:8px }
105
+ #header ul { background-color:#f6f8fa;border-bottom:1px solid #dbdddf;display:none;float:none;left:0;padding:0 0 5px;position:absolute;right:0;top:60px }
106
+ body.menu-open #header ul { display:block }
107
+ #header li { float:none }
108
+ #header ul a { float:none;height:auto;line-height:normal;padding:5px 10px;text-align:center }
109
+ #aside { margin-left:0;margin-right:0 }
110
+ #aside ul { font-size:36px;padding-left:2.5%;padding-right:2.5%;width:95% }
111
+ #cover-image { display:none }
112
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ YUI 3.18.1 (build f7e7bcb)
3
+ Copyright 2014 Yahoo! Inc. All rights reserved.
4
+ Licensed under the BSD License.
5
+ */html{color:#000;background:#fff}blockquote,body,code,dd,div,dl,dt,fieldset,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:after,q:before{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,select,textarea{font-family:inherit;font-size:inherit;font-weight:inherit;*font-size:100%}legend{color:#000}#yui3-css-stamp.cssreset{display:none}body,code,html{color:#24292e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px}a,a code{color:#0366d6;text-decoration:none}a:hover{text-decoration:underline}strong{font-weight:bold}em{font-style:italic}em strong,strong em{font-style:italic;font-weight:bold}h1,h2,h3,h4,h5,h6{border-bottom:1px solid #dbdddf;clear:both;font-size:32px;font-weight:600;padding:15px 10px 5px}h2{font-size:24px}h3,h4,h5,h6{border-bottom:0;font-size:20px;padding-bottom:0}h4{font-size:16px}h5{font-size:15px}h6{font-size:14px}ol,p,ul{line-height:150%;margin:0;padding:10px 10px 0}ol,ul{padding-left:35px}ul li{list-style-type:disc}ol li{list-style-type:decimal}img{box-sizing:border-box;max-width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}table{display:block;line-height:150%;max-width:100%;overflow:auto;padding:10px 10px 0;width:100%;width:max-content}table tr{background-color:#fff;border-top:1px solid #dbdddf}table tr:nth-child(even){background-color:#f6f8fa}table tr:hover{background-color:#ffd}table td,table th{border:1px solid #dbdddf;padding:6px 13px}table th{background-color:#fff;font-weight:bold;text-align:center}table tr:nth-child(even) code{background-color:#e9eaea}table tr:nth-child(even):hover code{background-color:#f3f4f4}code{background-color:#f3f4f4;padding:0 5px}pre,pre code{background-color:#f6f8fa;font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;line-height:150%;padding:0}pre{border:0 solid #fff;border-width:0 10px;box-sizing:border-box;display:block;margin:10px 0 0;-moz-box-sizing:border-box;overflow-x:scroll;overflow-y:visible;padding:10px;-webkit-box-sizing:border-box;width:100%}hr{background-color:#eceef0;border:0;color:#eceef0;height:1px;margin:15px auto 0;padding:0;width:100%}hr+ol,hr+p,hr+ul{padding-top:15px}div.highlight{position:relative}span.copy-code{background-color:#fff;background-color:rgba(255,255,255,.67);border-radius:5px;color:#48525c;cursor:pointer;display:block;float:right;font-size:13px;-moz-border-radius:5px;padding:3px 5px;position:absolute;right:10px;top:10px;z-index:8}div.highlight span.copy-code{right:20px}span.copy-code:hover{background-color:#fff;text-decoration:underline}span.copy-code i{color:#6c7b8a;margin-right:5px}form.interactive{background-color:#eee;border:1px solid #ddd;margin:10px 10px 0;overflow:auto;position:relative}form.interactive p,form.interactive pre{display:block;float:left;padding-bottom:10px;padding-top:10px;width:200px}form.interactive pre{background-color:#f9f9f9;border:0 solid #ddd;border-width:0 0 0 1px;float:none;font-family:Consolas,'Courier New',Courier,mono-space;font-size:12px;margin:0 0 0 195px;_margin:0;width:598px;_width:595px}form.interactive-tall pre{bottom:0;position:absolute;right:0;top:0}form.interactive pre li{height:14px;*height:auto}form.interactive input,form.interactive select{display:block;float:left;font-size:12px;height:20px;*height:24px;margin-right:5px}form.interactive input{height:16px;padding:1px;width:111px}form.interactive-tall input,form.interactive-tall select{box-sizing:border-box;height:22px;-moz-box-sizing:border-box;padding:1px;-webkit-box-sizing:border-box;width:175px}form.interactive input.checkbox{height:25px;margin-right:10px;padding:0;width:25px}form.interactive input.submit{background-color:#0366d6;border:0;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:bold;height:auto;-moz-border-radius:5px;padding:10px 20px;width:auto}form.interactive br{clear:both}form.interactive+p{padding-top:0;text-align:right}#container{background-color:#fff;margin:0 auto;max-width:840px;padding:61px 10px 30px;position:relative;*width:840px;_width:840px;z-index:8}#header{background-color:#f6f8fa;border-bottom:1px solid #dbdddf;height:60px;left:0;position:fixed;right:0;top:0;z-index:9}#header-inner{margin:0 auto;max-width:840px;padding:0;position:relative;*width:840px;_width:840px;z-index:9}#wordmark{display:block;float:left;font-weight:bold;height:60px;left:0;line-height:60px;padding:0 10px;position:absolute;top:0;z-index:2}#menu-toggle{display:none}#header ul{float:right;padding:0 5px 0 0;position:absolute;right:5px;top:0}#header li{display:block;float:left;list-style-type:none}#header ul a{display:block;float:left;height:60px;line-height:60px;padding:0 5px}#aside{background-color:#eee;border-radius:5px;margin:15px 10px 0;-moz-border-radius:5px;padding:5px 15px 15px;text-align:center}#aside ul{font-size:48px;height:48px;padding:5px 5% 0;width:90%}#aside li{display:block;float:left;height:48px;list-style-type:none;padding:0}div.aside-1 li{width:100%}div.aside-2 li{width:50%}div.aside-3 li{width:33.3%}div.aside-4 li{width:25%}div.aside-5 li{width:20%}div.aside-6 li{width:16.6%}div.aside-7 li{font-size:33px;width:14.2%}div.aside-8 li{font-size:30px;width:12.5%}div.aside-9 li{font-size:27px;width:11.1%}div.aside-10 li{font-size:24px;width:10%}#aside a{cursor:pointer;display:block;float:left;height:48px;line-height:48px;width:100%}#aside a:hover{color:#000;text-decoration:none}#aside i{margin:0 auto}#aside span{display:none}#footer{margin:0 auto;max-width:860px;position:relative;*width:860px;_width:860px;z-index:8}#footer p{background-color:#fff;border-radius:0 0 5px 5px;border-top:1px solid #eceef0;clear:both;color:#caccce;-moz-border-radius:0 0 5px 5px;padding-bottom:15px;padding-top:15px;text-align:center}#cover-image{background-color:#eceef0;background-position:50% 50%;background-repeat:no-repeat;background-size:cover;height:400px;left:0;margin:0;padding:0;position:absolute;right:0;top:61px;z-index:2}#cover-image:before{background-image:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%);background-image:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fff 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fff 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fff 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,0)),color-stop(100%,#fff));background-image:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fff 100%);bottom:0;content:"";display:block;left:0;height:200px;position:absolute;right:0;z-index:2}@media only screen and (max-width :879px){h1,h2,h3,h4,h5,h6{font-size:24px;overflow:hidden;text-overflow:ellipsis}h2{font-size:21px}h3{font-size:18px}h4{font-size:16px}h5{font-size:15px}h6{font-size:14px}span.copy-code{display:none}form.interactive p{float:none;padding-bottom:20px;padding-top:15px;overflow:auto;width:auto}form.interactive pre{border-width:1px 0 0;margin-left:0;width:auto}form.interactive-tall pre{bottom:auto;position:static;right:auto;top:auto}#container{max-width:none}#header-inner{max-width:none}#wordmark{padding-left:20px;padding-right:20px}#menu-toggle{background-color:#eceef0;border:1px solid #dbdddf;border-radius:5px;color:#5d5f61;cursor:pointer;display:block;font-size:10px;font-weight:bold;height:22px;line-height:22px;-moz-border-radius:5px;padding:16px 0 0;position:absolute;right:10px;text-align:center;text-decoration:none!important;top:10px;width:38px;z-index:3}#menu-toggle:before{background-color:#5d5f61;content:"";height:12px;left:10px;position:absolute;right:10px;top:6px}#menu-toggle:after{border:0 solid #eceef0;border-width:3px 0;content:"";height:2px;left:10px;position:absolute;right:10px;top:8px}#header ul{background-color:#f6f8fa;border-bottom:1px solid #dbdddf;display:none;float:none;left:0;padding:0 0 5px;position:absolute;right:0;top:60px}body.menu-open #header ul{display:block}#header li{float:none}#header ul a{float:none;height:auto;line-height:normal;padding:5px 10px;text-align:center}#aside{margin-left:0;margin-right:0}#aside ul{font-size:36px;padding-left:2.5%;padding-right:2.5%;width:95%}#cover-image{display:none}}
Binary file
Binary file
Binary file
Binary file
Binary file