From 53cf7defd51bfe74f84f1e3b1998e9a854166f1a Mon Sep 17 00:00:00 2001 From: Jessica Yao Date: Mon, 6 Nov 2017 13:36:24 -0800 Subject: [PATCH] Fix/re-introduce custom Jekyll tags for better glossary integration (#6163) --- Gemfile | 51 ++++- Gemfile.lock | 215 ++++++++---------- _data/glossary/_example.yml | 18 +- _data/glossary/application-architect.yaml | 2 +- _data/glossary/application-developer.yaml | 2 +- _data/glossary/approver.yaml | 2 +- _data/glossary/cla.yaml | 7 +- _data/glossary/cluster-architect.yaml | 5 +- _data/glossary/cluster-operator.yaml | 3 +- _data/glossary/cluster.yaml | 4 +- _data/glossary/code-contributor.yaml | 6 +- _data/glossary/container.yaml | 5 +- _data/glossary/contributor.yaml | 6 +- _data/glossary/cronjob.yaml | 9 +- _data/glossary/deployment.yaml | 7 +- _data/glossary/developer.yaml | 12 +- _data/glossary/downstream.yaml | 2 +- _data/glossary/helm-chart.yaml | 3 +- _data/glossary/ingress.yaml | 7 +- _data/glossary/istio.yaml | 3 +- _data/glossary/kops.yaml | 5 +- _data/glossary/kubeadm.yaml | 5 +- _data/glossary/kubectl.yaml | 7 +- _data/glossary/kubernetes-api.yaml | 3 +- _data/glossary/maintainer.yaml | 6 +- _data/glossary/member.yaml | 6 +- _data/glossary/minikube.yaml | 5 +- _data/glossary/platform-developer.yaml | 2 +- _data/glossary/pod.yaml | 7 +- _data/glossary/rbac.yaml | 7 +- _data/glossary/reviewer.yaml | 4 +- _data/glossary/service.yaml | 7 +- _data/glossary/sig.yaml | 7 +- _data/glossary/statefulset.yml | 8 +- _data/glossary/upstream.yaml | 2 +- _data/glossary/wg.yaml | 5 +- _includes/head.html | 2 + _includes/templates/glossary/snippet.md | 6 +- _plugins/README.md | 75 ++++++ _plugins/glossary_tags.rb | 122 ++++++++++ _plugins/liquify_filter.rb | 10 + css/custom-jekyll/tags.css | 56 +++++ css/glossary.css | 8 - docs/concepts/services-networking/ingress.md | 2 +- .../workloads/controllers/statefulset.md | 4 +- docs/reference/glossary.md | 5 +- docs/search.md | 6 +- .../assign-memory-resource.md | 3 +- .../define-command-argument-container.md | 2 +- .../jekyll-tags-glossary-injector.gif | Bin 0 -> 41295 bytes .../metadocs/jekyll-tags-glossary-tooltip.png | Bin 0 -> 37485 bytes js/custom-jekyll/tags.js | 15 ++ 52 files changed, 546 insertions(+), 225 deletions(-) create mode 100644 _plugins/README.md create mode 100644 _plugins/glossary_tags.rb create mode 100644 _plugins/liquify_filter.rb create mode 100644 css/custom-jekyll/tags.css create mode 100644 images/metadocs/jekyll-tags-glossary-injector.gif create mode 100644 images/metadocs/jekyll-tags-glossary-tooltip.png create mode 100644 js/custom-jekyll/tags.js diff --git a/Gemfile b/Gemfile index 3828560a73..409583e72a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,53 @@ source "https://rubygems.org" -gem "github-pages", group: :jekyll_plugins +# gem "github-pages", group: :jekyll_plugins + +gem "jekyll", "3.6.0" + +group :github_pages_compatible do + gem "json", "~> 1.7", ">= 1.7.7" + gem "coffee-script", "~> 2.4" + gem "coffee-script-source", "~> 1.12" + gem "ethon", "~> 0.10" + gem "execjs", "~> 2.7" + gem "minima", "~> 2.0" + gem "terminal-table", "~> 1.4" + gem "unicode-display_width", "~> 1.1" +end + +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.6" + gem "jekyll-sitemap" + gem "jekyll-gist" + gem "jekyll-paginate", "1.1.0" + gem "jekyll-seo-tag" + gem "jekyll-avatar", "~> 0.4" + gem "jekyll-coffeescript", "~> 1.0" + gem "jekyll-default-layout", "~> 0.1" + gem "jekyll-github-metadata", "~> 2.2" + gem "jekyll-optional-front-matter", "~> 0.1" + gem "jekyll-readme-index", "0.0.3" + gem "jekyll-redirect-from", "~> 0.11" + gem "jekyll-relative-links", "~> 0.2" + gem "jekyll-swiss", "~> 0.4" + gem "jekyll-theme-architect", "0.0.3" + gem "jekyll-theme-cayman", "0.0.3" + gem "jekyll-theme-dinky", "0.0.3" + gem "jekyll-theme-hacker", "0.0.3" + gem "jekyll-theme-leap-day", "0.0.3" + gem "jekyll-theme-merlot", "0.0.3" + gem "jekyll-theme-midnight", "0.0.3" + gem "jekyll-theme-minimal", "0.0.3" + gem "jekyll-theme-modernist", "0.0.3" + gem "jekyll-theme-primer", "~> 0.1" + gem "jekyll-theme-slate", "0.0.3" + gem "jekyll-theme-tactile", "0.0.3" + gem "jekyll-theme-time-machine", "0.0.3" + gem "jekyll-titles-from-headings", "~> 0.1" +end + gem "jekyll-include-cache", "~> 0.1" + +gem "kramdown", "~> 1.11" +gem "rouge", "~> 2.0" +gem "pry" diff --git a/Gemfile.lock b/Gemfile.lock index 09d52b8d72..577f4e69b2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,123 +1,61 @@ GEM remote: https://rubygems.org/ specs: - activesupport (4.2.7) - i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.5.0) - public_suffix (~> 2.0, >= 2.0.2) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + coderay (1.1.2) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.12.2) colorator (1.1.0) - ethon (0.10.1) + ethon (0.11.0) ffi (>= 1.3.0) execjs (2.7.0) - faraday (0.10.0) + faraday (0.13.1) multipart-post (>= 1.2, < 3) - ffi (1.9.14) + ffi (1.9.18) forwardable-extended (2.6.0) - gemoji (2.1.0) - github-pages (112) - activesupport (= 4.2.7) - github-pages-health-check (= 1.3.0) - jekyll (= 3.3.1) - jekyll-avatar (= 0.4.2) - jekyll-coffeescript (= 1.0.1) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.8.0) - jekyll-gist (= 1.4.0) - jekyll-github-metadata (= 2.2.0) - jekyll-mentions (= 1.2.0) - jekyll-optional-front-matter (= 0.1.2) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.0.3) - jekyll-redirect-from (= 0.11.0) - jekyll-relative-links (= 0.2.1) - jekyll-sass-converter (= 1.3.0) - jekyll-seo-tag (= 2.1.0) - jekyll-sitemap (= 0.12.0) - jekyll-swiss (= 0.4.0) - jekyll-theme-architect (= 0.0.3) - jekyll-theme-cayman (= 0.0.3) - jekyll-theme-dinky (= 0.0.3) - jekyll-theme-hacker (= 0.0.3) - jekyll-theme-leap-day (= 0.0.3) - jekyll-theme-merlot (= 0.0.3) - jekyll-theme-midnight (= 0.0.3) - jekyll-theme-minimal (= 0.0.3) - jekyll-theme-modernist (= 0.0.3) - jekyll-theme-primer (= 0.1.5) - jekyll-theme-slate (= 0.0.3) - jekyll-theme-tactile (= 0.0.3) - jekyll-theme-time-machine (= 0.0.3) - jekyll-titles-from-headings (= 0.1.3) - jemoji (= 0.7.0) - kramdown (= 1.11.1) - liquid (= 3.0.6) - listen (= 3.0.6) - mercenary (~> 0.3) - minima (= 2.0.0) - rouge (= 1.11.1) - terminal-table (~> 1.4) - github-pages-health-check (1.3.0) - addressable (~> 2.3) - net-dns (~> 0.8) - octokit (~> 4.0) - public_suffix (~> 2.0) - typhoeus (~> 0.7) - html-pipeline (2.4.2) - activesupport (>= 2) - nokogiri (>= 1.4) - i18n (0.7.0) - jekyll (3.3.1) + jekyll (3.6.0) addressable (~> 2.4) colorator (~> 1.0) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 1.1) - kramdown (~> 1.3) - liquid (~> 3.0) + kramdown (~> 1.14) + liquid (~> 4.0) mercenary (~> 0.3.3) pathutil (~> 0.9) - rouge (~> 1.7) + rouge (>= 1.7, < 3) safe_yaml (~> 1.0) - jekyll-avatar (0.4.2) + jekyll-avatar (0.5.0) jekyll (~> 3.0) jekyll-coffeescript (1.0.1) coffee-script (~> 2.2) jekyll-default-layout (0.1.4) jekyll (~> 3.0) - jekyll-feed (0.8.0) + jekyll-feed (0.9.2) jekyll (~> 3.3) - jekyll-gist (1.4.0) + jekyll-gist (1.4.1) octokit (~> 4.2) - jekyll-github-metadata (2.2.0) + jekyll-github-metadata (2.9.3) jekyll (~> 3.1) octokit (~> 4.0, != 4.4.0) jekyll-include-cache (0.1.0) jekyll (~> 3.3) - jekyll-mentions (1.2.0) - activesupport (~> 4.0) - html-pipeline (~> 2.3) - jekyll (~> 3.0) - jekyll-optional-front-matter (0.1.2) + jekyll-optional-front-matter (0.3.0) jekyll (~> 3.0) jekyll-paginate (1.1.0) jekyll-readme-index (0.0.3) jekyll (~> 3.0) - jekyll-redirect-from (0.11.0) - jekyll (>= 2.0) - jekyll-relative-links (0.2.1) + jekyll-redirect-from (0.12.1) jekyll (~> 3.3) - jekyll-sass-converter (1.3.0) - sass (~> 3.2) - jekyll-seo-tag (2.1.0) + jekyll-relative-links (0.5.1) jekyll (~> 3.3) - jekyll-sitemap (0.12.0) + jekyll-sass-converter (1.5.0) + sass (~> 3.4) + jekyll-seo-tag (2.3.0) + jekyll (~> 3.3) + jekyll-sitemap (1.1.1) jekyll (~> 3.3) jekyll-swiss (0.4.0) jekyll-theme-architect (0.0.3) @@ -138,66 +76,101 @@ GEM jekyll (~> 3.3) jekyll-theme-modernist (0.0.3) jekyll (~> 3.3) - jekyll-theme-primer (0.1.5) - jekyll (~> 3.3) + jekyll-theme-primer (0.5.2) + jekyll (~> 3.5) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.2) jekyll-theme-slate (0.0.3) jekyll (~> 3.3) jekyll-theme-tactile (0.0.3) jekyll (~> 3.3) jekyll-theme-time-machine (0.0.3) jekyll (~> 3.3) - jekyll-titles-from-headings (0.1.3) + jekyll-titles-from-headings (0.5.0) jekyll (~> 3.3) jekyll-watch (1.5.0) listen (~> 3.0, < 3.1) - jemoji (0.7.0) - activesupport (~> 4.0) - gemoji (~> 2.0) - html-pipeline (~> 2.2) - jekyll (>= 3.0) json (1.8.6) - kramdown (1.11.1) - liquid (3.0.6) - listen (3.0.6) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9.7) + kramdown (1.15.0) + liquid (4.0.0) + listen (3.0.8) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) mercenary (0.3.6) - mini_portile2 (2.1.0) - minima (2.0.0) - minitest (5.10.1) + method_source (0.9.0) + minima (2.1.1) + jekyll (~> 3.3) multipart-post (2.0.0) - net-dns (0.8.0) - nokogiri (1.6.8.1) - mini_portile2 (~> 2.1.0) - octokit (4.6.2) + octokit (4.7.0) sawyer (~> 0.8.0, >= 0.5.3) - pathutil (0.14.0) + pathutil (0.16.0) forwardable-extended (~> 2.6) - public_suffix (2.0.4) - rb-fsevent (0.9.8) - rb-inotify (0.9.7) - ffi (>= 0.5.0) - rouge (1.11.1) + pry (0.11.2) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + public_suffix (3.0.0) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + rouge (2.2.1) safe_yaml (1.0.4) - sass (3.4.23) + sass (3.5.3) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) sawyer (0.8.1) addressable (>= 2.3.5, < 2.6) faraday (~> 0.8, < 1.0) - terminal-table (1.7.3) - unicode-display_width (~> 1.1.1) - thread_safe (0.3.5) - typhoeus (0.8.0) - ethon (>= 0.8.0) - tzinfo (1.2.2) - thread_safe (~> 0.1) - unicode-display_width (1.1.2) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + unicode-display_width (1.3.0) PLATFORMS ruby DEPENDENCIES - github-pages + coffee-script (~> 2.4) + coffee-script-source (~> 1.12) + ethon (~> 0.10) + execjs (~> 2.7) + jekyll (= 3.6.0) + jekyll-avatar (~> 0.4) + jekyll-coffeescript (~> 1.0) + jekyll-default-layout (~> 0.1) + jekyll-feed (~> 0.6) + jekyll-gist + jekyll-github-metadata (~> 2.2) jekyll-include-cache (~> 0.1) + jekyll-optional-front-matter (~> 0.1) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.0.3) + jekyll-redirect-from (~> 0.11) + jekyll-relative-links (~> 0.2) + jekyll-seo-tag + jekyll-sitemap + jekyll-swiss (~> 0.4) + jekyll-theme-architect (= 0.0.3) + jekyll-theme-cayman (= 0.0.3) + jekyll-theme-dinky (= 0.0.3) + jekyll-theme-hacker (= 0.0.3) + jekyll-theme-leap-day (= 0.0.3) + jekyll-theme-merlot (= 0.0.3) + jekyll-theme-midnight (= 0.0.3) + jekyll-theme-minimal (= 0.0.3) + jekyll-theme-modernist (= 0.0.3) + jekyll-theme-primer (~> 0.1) + jekyll-theme-slate (= 0.0.3) + jekyll-theme-tactile (= 0.0.3) + jekyll-theme-time-machine (= 0.0.3) + jekyll-titles-from-headings (~> 0.1) + json (~> 1.7, >= 1.7.7) + kramdown (~> 1.11) + minima (~> 2.0) + pry + rouge (~> 2.0) + terminal-table (~> 1.4) + unicode-display_width (~> 1.1) BUNDLED WITH - 1.15.2 + 1.15.4 diff --git a/_data/glossary/_example.yml b/_data/glossary/_example.yml index 34268a07c3..78ef717df2 100644 --- a/_data/glossary/_example.yml +++ b/_data/glossary/_example.yml @@ -1,5 +1,6 @@ id: _example name: Example K8s Term +full-link: kubernetes.io/docs/link-to-long-dedicated-docs-page aka: - Slang K8s Term - Misnomer @@ -10,8 +11,17 @@ related: - id-of-commonly-used-with-term tags: - Some Tag -short-description: | - Required. One or two lines that provide a minimum definition. Do not repeat the term. Write about the plural of the term. Prefer fragments. Model after tooltips. End with a period. -long-description: | - Optional. Longer additional text to appear after (in conjunction with) short description. Provide where the short description is not sufficient as the intro paragraph to a topic. Write complete but concise sentences. +short-description: > + Required. + Markdown allowed (e.g. for cross-linking). + One or two lines that provide a minimum definition. + Do not repeat the term. + Prefer fragments. + End with a period. +long-description: > + Optional. + Markdown allowed. + Longer additional text to appear after (in conjunction with) short description. + Provide where the short description is not sufficient as the intro paragraph to a topic. + Write complete but concise sentences. **See /_includes/templates/glossary/README.md for the official style guide.** diff --git a/_data/glossary/application-architect.yaml b/_data/glossary/application-architect.yaml index ad14229720..387d4443ea 100644 --- a/_data/glossary/application-architect.yaml +++ b/_data/glossary/application-architect.yaml @@ -4,7 +4,7 @@ related: - application-developer tags: - user-type -short-description: | +short-description: > A person responsible for the high-level design of an application. long-description: > An architect ensures that an app's implementation allows it to interact with its surrounding components in a scalable, maintainable way. diff --git a/_data/glossary/application-developer.yaml b/_data/glossary/application-developer.yaml index 5fc2fa9f80..696e53ef6d 100644 --- a/_data/glossary/application-developer.yaml +++ b/_data/glossary/application-developer.yaml @@ -4,7 +4,7 @@ related: - application-architect tags: - user-type -short-description: | +short-description: > A person who writes an application that runs in a Kubernetes cluster. long-description: > An application developer focuses on one part of an application. diff --git a/_data/glossary/approver.yaml b/_data/glossary/approver.yaml index 5047a78283..f521314566 100644 --- a/_data/glossary/approver.yaml +++ b/_data/glossary/approver.yaml @@ -2,7 +2,7 @@ id: approver name: Approver tags: - community -short-description: | +short-description: > A person who can review and approve Kubernetes code contributions. long-description: > While code review is focused on code quality and correctness, approval is focused on the holistic acceptance of a contribution. diff --git a/_data/glossary/cla.yaml b/_data/glossary/cla.yaml index 75dd5408d3..159cb575d9 100644 --- a/_data/glossary/cla.yaml +++ b/_data/glossary/cla.yaml @@ -1,8 +1,9 @@ id: cla name: CLA (Contributor License Agreement) +full-link: https://github.com/kubernetes/community/blob/master/CLA.md tags: - community -short-description: | - Terms under which a [contributor](#term-contributor) grants a license to an open source project for their contributions. -long-description: | +short-description: > + Terms under which a {% glossary_tooltip text="contributor" term_id="contributor" %} grants a license to an open source project for their contributions. +long-description: > CLAs help resolve legal disputes involving contributed material and intellectual property (IP). diff --git a/_data/glossary/cluster-architect.yaml b/_data/glossary/cluster-architect.yaml index 9cec933e93..14b60a0e18 100644 --- a/_data/glossary/cluster-architect.yaml +++ b/_data/glossary/cluster-architect.yaml @@ -5,8 +5,7 @@ related: - cluster-operator tags: - user-type -short-description: | +short-description: > A person who designs infrastructure that involves one or more Kubernetes clusters. - -long-description: | +long-description: > Cluster architects are concerned with best practices for distributed systems, for example: high availability and security. diff --git a/_data/glossary/cluster-operator.yaml b/_data/glossary/cluster-operator.yaml index 8224517881..82eaa42a60 100644 --- a/_data/glossary/cluster-operator.yaml +++ b/_data/glossary/cluster-operator.yaml @@ -7,9 +7,8 @@ related: - cluster-architect tags: - user-type -short-description: | +short-description: > A person who configures, controls, and monitors clusters. - long-description: | Their primary responsibility is keeping a cluster up and running, which may involve periodic maintenance activities or upgrades.
diff --git a/_data/glossary/cluster.yaml b/_data/glossary/cluster.yaml index a85ce8d2f6..a86c1ab696 100644 --- a/_data/glossary/cluster.yaml +++ b/_data/glossary/cluster.yaml @@ -3,7 +3,7 @@ name: Cluster tags: - fundamental - operation -short-description: | +short-description: > A set of machines, called nodes, that run containerized applications managed by Kubernetes. -long-description: | +long-description: > A cluster has several worker nodes and at least one master node. diff --git a/_data/glossary/code-contributor.yaml b/_data/glossary/code-contributor.yaml index acc9878863..9fa8fbe82c 100644 --- a/_data/glossary/code-contributor.yaml +++ b/_data/glossary/code-contributor.yaml @@ -5,7 +5,7 @@ aka: tags: - community - user-type -short-description: | +short-description: > A person who develops and contributes code to the Kubernetes open source codebase. -long-description: | - They are also an active [community member](#term-community-member) who participates in one or more [Special Interest Groups (SIGs)](#term-sig). +long-description: > + They are also an active {% glossary_tooltip text="community member" term_id="member" %} who participates in one or more {% glossary_tooltip text="Special Interest Groups (SIGs)" term_id="sig" %}. diff --git a/_data/glossary/container.yaml b/_data/glossary/container.yaml index 4cc786f7b3..b9682d4b23 100644 --- a/_data/glossary/container.yaml +++ b/_data/glossary/container.yaml @@ -1,9 +1,10 @@ id: container name: Container +full-link: /docs/concepts/overview/what-is-kubernetes/#why-containers tags: - fundamental - workload -short-description: | +short-description: > A lightweight and portable executable image that contains software and all of its dependencies. -long-description: | +long-description: > Containers decouple applications from underlying host infrastructure to make deployment easier in different cloud or OS environments, and for easier scaling. diff --git a/_data/glossary/contributor.yaml b/_data/glossary/contributor.yaml index 333244466d..af005aac50 100644 --- a/_data/glossary/contributor.yaml +++ b/_data/glossary/contributor.yaml @@ -2,7 +2,7 @@ id: contributor name: Contributor tags: - community -short-description: | +short-description: > Someone who donates code, documentation, or their time to help the Kubernetes project or community. -long-description: | - Contributions include pull requests (PRs), issues, feedback, [special interest group (SIG)](#term-sig) participation, or organizing community events. +long-description: > + Contributions include pull requests (PRs), issues, feedback, {% glossary_tooltip text="special interest groups (SIG)" term_id="sig" %} participation, or organizing community events. diff --git a/_data/glossary/cronjob.yaml b/_data/glossary/cronjob.yaml index c220a38f75..5116cf424a 100644 --- a/_data/glossary/cronjob.yaml +++ b/_data/glossary/cronjob.yaml @@ -1,9 +1,10 @@ id: cronjob name: CronJob +full-link: /docs/concepts/workloads/controllers/cron-jobs/ tags: - core-object - workload -short-description: | - Manages a [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/) that runs on a periodic schedule. -long-description: | - Similar to a line in a *crontab* file, a [CronJob](/docs/concepts/workloads/controllers/cron-jobs/#writing-a-cron-job-spec) object specifies a schedule using the [Cron](https://en.wikipedia.org/wiki/Cron) format. +short-description: > + Manages a [Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/) that runs on a periodic schedule. +long-description: > + Similar to a line in a *crontab* file, a Cronjob object specifies a schedule using the [Cron](https://en.wikipedia.org/wiki/Cron) format. diff --git a/_data/glossary/deployment.yaml b/_data/glossary/deployment.yaml index 773f2c1518..4a8d04211a 100644 --- a/_data/glossary/deployment.yaml +++ b/_data/glossary/deployment.yaml @@ -1,10 +1,11 @@ id: deployment name: Deployment +full-link: /docs/concepts/workloads/controllers/deployment/ tags: - fundamental - core-object - workload -short-description: | +short-description: > An API object that manages a replicated application. -long-description: | - Each replica is represented by a [Pod](#term-pod), and the Pods are distributed among the nodes of a cluster. +long-description: > + Each replica is represented by a {% glossary_tooltip term_id="pod" %}, and the Pods are distributed among the nodes of a cluster. diff --git a/_data/glossary/developer.yaml b/_data/glossary/developer.yaml index eb1a68526c..38534826ab 100644 --- a/_data/glossary/developer.yaml +++ b/_data/glossary/developer.yaml @@ -5,11 +5,7 @@ aka: tags: - community - user-type -short-description: | - May refer to: [*Application Developer*](#term-application-developer), [*Code Contributor*](#term-code-contributor), or [*Platform Developer*](#term-platform-developer). -long-description: | - This overloaded term may have different meanings depending on the context. It could mean: - - * [**Application Developer**](#term-application-developer): A person who writes an application that runs in a Kubernetes cluster. - * [**Code Contributor**](#term-code-contributor): A person who develops and contributes code to the Kubernetes open source codebase. - * [**Platform Developer**](#term-platform-developer): A person who customizes the Kubernetes platform to fit the needs of their project—for example, by extending the API. +short-description: > + May refer to: {% glossary_tooltip text="Application Developer" term_id="application-developer" %}, {% glossary_tooltip text="Code Contributor" term_id="code-contributor" %}, or {% glossary_tooltip text="Platform Developer" term_id="platform-developer" %}. +long-description: > + This overloaded term may have different meanings depending on the context diff --git a/_data/glossary/downstream.yaml b/_data/glossary/downstream.yaml index 2abdd79fbc..dab6d75628 100644 --- a/_data/glossary/downstream.yaml +++ b/_data/glossary/downstream.yaml @@ -4,7 +4,7 @@ related: - upstream tags: - community -short-description: | +short-description: > May refer to: code in the Kubernetes ecosystem that depends upon the core Kubernetes codebase or a forked repo. long-description: | * In the **Kubernetes Community**: Conversations often use *downstream* to mean the ecosystem, code, or third-party tools that rely on the core Kubernetes codebase. For example, a new feature in Kubernetes may be adopted by applications *downstream* to improve their functionality. diff --git a/_data/glossary/helm-chart.yaml b/_data/glossary/helm-chart.yaml index 9688a6f716..49d916d1af 100644 --- a/_data/glossary/helm-chart.yaml +++ b/_data/glossary/helm-chart.yaml @@ -1,8 +1,9 @@ id: helm-chart name: Helm Chart +full-link: https://github.com/kubernetes/helm/blob/master/docs/charts.md tags: - tool -short-description: | +short-description: > A package of pre-configured Kubernetes resources that can be managed with the Helm tool. long-description: | Charts provide a reproducible way of creating and sharing Kubernetes applications. diff --git a/_data/glossary/ingress.yaml b/_data/glossary/ingress.yaml index 06864f8bcb..f06031ee2e 100644 --- a/_data/glossary/ingress.yaml +++ b/_data/glossary/ingress.yaml @@ -1,10 +1,13 @@ id: ingress name: Ingress +full-link: /docs/concepts/services-networking/ingress/ +aka: + - Ingress controller tags: - networking - architecture - extension -short-description: | +short-description: > An API object that manages external access to the services in a cluster, typically HTTP. -long-description: | +long-description: > Ingress can provide load balancing, SSL termination and name-based virtual hosting. diff --git a/_data/glossary/istio.yaml b/_data/glossary/istio.yaml index 81056cfac4..c05bad8e72 100644 --- a/_data/glossary/istio.yaml +++ b/_data/glossary/istio.yaml @@ -1,10 +1,11 @@ id: istio name: Istio +full-link: https://istio.io/docs/concepts/what-is-istio/overview.html tags: - networking - architecture - extension -short-description: | +short-description: > An open platform (not Kubernetes-specific) that provides a uniform way to integrate microservices, manage traffic flow, enforce policies, and aggregate telemetry data. long-description: > Adding Istio does not require changing application code. diff --git a/_data/glossary/kops.yaml b/_data/glossary/kops.yaml index b431e40616..67a40892d1 100644 --- a/_data/glossary/kops.yaml +++ b/_data/glossary/kops.yaml @@ -1,9 +1,10 @@ id: kops name: Kops +full-link: /docs/getting-started-guides/kops/ tags: - tool - operation -short-description: | +short-description: > A CLI tool that helps you create, destroy, upgrade and maintain production-grade, highly available, Kubernetes clusters. *NOTE: Officially supports AWS only, with GCE and VMware vSphere in alpha*. long-description: | `kops` provisions your cluster with: @@ -15,4 +16,4 @@ long-description: | * High availability (HA) support * The ability to directly provision, or generate terraform manifests - You can also build your own cluster using [`kubeadm`](#term-kubeadm) as a building block. `kops` builds on the kubeadm work. + You can also build your own cluster using {% glossary_tooltip term_id="kubeadm" %} as a building block. `kops` builds on the kubeadm work. diff --git a/_data/glossary/kubeadm.yaml b/_data/glossary/kubeadm.yaml index ce2a6524d5..e70b046f19 100644 --- a/_data/glossary/kubeadm.yaml +++ b/_data/glossary/kubeadm.yaml @@ -1,9 +1,10 @@ id: kubeadm name: Kubeadm +full-link: /docs/admin/kubeadm/ tags: - tool - operation -short-description: | +short-description: > A tool for quickly installing Kubernetes and setting up a secure cluster. -long-description: | +long-description: > You can use kubeadm to install both the control plane and the worker node components. diff --git a/_data/glossary/kubectl.yaml b/_data/glossary/kubectl.yaml index 05711e8013..825749811c 100644 --- a/_data/glossary/kubectl.yaml +++ b/_data/glossary/kubectl.yaml @@ -1,9 +1,10 @@ id: kubectl name: Kubectl +full-link: /docs/user-guide/kubectl-overview/ tags: - tool - fundamental -short-description: | - A command line tool for communicating with a [Kubernetes API](#term-kubernetes-api) server. -long-description: | +short-description: > + A command line tool for communicating with a {% glossary_tooltip text="Kubernetes API" term_id="kubernetes-api" %} server. +long-description: > You can use kubectl to create, inspect, update, and delete Kubernetes objects. diff --git a/_data/glossary/kubernetes-api.yaml b/_data/glossary/kubernetes-api.yaml index 74169970bf..773da6e516 100644 --- a/_data/glossary/kubernetes-api.yaml +++ b/_data/glossary/kubernetes-api.yaml @@ -1,9 +1,10 @@ id: kubernetes-api name: Kubernetes API +full-link: /docs/concepts/overview/kubernetes-api/ tags: - fundamental - architecture -short-description: | +short-description: > The application that serves Kubernetes functionality through a RESTful interface and stores the state of the cluster. long-description: > Kubernetes resources and "records of intent" are all stored as API objects, and modified via RESTful calls to the API. diff --git a/_data/glossary/maintainer.yaml b/_data/glossary/maintainer.yaml index fabfb6551c..dc97b11544 100644 --- a/_data/glossary/maintainer.yaml +++ b/_data/glossary/maintainer.yaml @@ -2,7 +2,7 @@ id: maintainer name: Maintainer tags: - community -short-description: | - A highly experienced [contributor](#term-contributor), active in multiple areas of Kubernetes, who has cross-area ownership and write access to a project's GitHub repository. -long-description: | +short-description: > + A highly experienced {% glossary_tooltip text="contributor" term_id="contributor" %}, active in multiple areas of Kubernetes, who has cross-area ownership and write access to a project's GitHub repository. +long-description: > Maintainers work holistically across the project to maintain its health and success and have made substantial contributions, both through code development and broader organizational efforts. diff --git a/_data/glossary/member.yaml b/_data/glossary/member.yaml index 3e4866625f..e78ec6bcce 100644 --- a/_data/glossary/member.yaml +++ b/_data/glossary/member.yaml @@ -2,9 +2,9 @@ id: member name: Member tags: - community -short-description: | - A continuously active [contributor](#term-contributor) in the K8s community. +short-description: > + A continuously active {% glossary_tooltip text="contributor" term_id="contributor" %} in the K8s community. long-description: > - Members can have issues and PRs assigned to them and participate in [special interest groups (SIGs)](#term-sig) through GitHub teams. + Members can have issues and PRs assigned to them and participate in {% glossary_tooltip text="special interest groups (SIGs)" term_id="sig" %} through GitHub teams. Pre-submit tests are automatically run for members' PRs. A member is expected to remain an active contributor to the community. diff --git a/_data/glossary/minikube.yaml b/_data/glossary/minikube.yaml index eccbabadd9..3f9c01ef51 100644 --- a/_data/glossary/minikube.yaml +++ b/_data/glossary/minikube.yaml @@ -1,9 +1,10 @@ id: minikube name: Minikube +full-link: /docs/getting-started-guides/minikube/ tags: - fundamental - tool -short-description: | +short-description: > A tool for running Kubernetes locally. -long-description: | +long-description: > Minikube runs a single-node cluster inside a VM on your computer. diff --git a/_data/glossary/platform-developer.yaml b/_data/glossary/platform-developer.yaml index ef4352c98e..85decd55f3 100644 --- a/_data/glossary/platform-developer.yaml +++ b/_data/glossary/platform-developer.yaml @@ -4,7 +4,7 @@ aka: - Kubernetes Developer tags: - user-type -short-description: | +short-description: > A person who customizes the Kubernetes platform to fit the needs of their project. long-description: > A platform developer may, for example, use [Custom Resources](/docs/concepts/api-extension/custom-resources/) or [Extend the Kubernetes API with the aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) to add functionality to their instance of Kubernetes, specifically for their application. diff --git a/_data/glossary/pod.yaml b/_data/glossary/pod.yaml index 2a22384697..a5d3f567b9 100644 --- a/_data/glossary/pod.yaml +++ b/_data/glossary/pod.yaml @@ -1,5 +1,6 @@ id: pod name: Pod +full-link: /docs/concepts/workloads/pods/pod-overview/ related: - container - sidecar @@ -8,9 +9,9 @@ related: tags: - core-object - fundamental -short-description: | - The smallest and simplest Kubernetes object. A Pod represents a set of running [containers](#term-container) on your cluster. +short-description: > + The smallest and simplest Kubernetes object. A Pod represents a set of running {% glossary_tooltip text="containers" term_id="container" %} on your cluster. long-description: > A Pod is typically set up to run a single primary container. It can also run optional sidecar containers that add supplementary features like logging. - Pods are commonly managed by a [Deployment](#term-deployment). + Pods are commonly managed by a {% glossary_tooltip term_id="deployment" %}. diff --git a/_data/glossary/rbac.yaml b/_data/glossary/rbac.yaml index af158dc54e..e1fde1de8d 100644 --- a/_data/glossary/rbac.yaml +++ b/_data/glossary/rbac.yaml @@ -1,9 +1,10 @@ id: rbac name: RBAC (Role-Based Access Control) +full-link: /docs/admin/authorization/rbac/ tags: - security - fundamental -short-description: | - Manages authorization decisions, allowing admins to dynamically configure access policies through the [Kubernetes API](#term-kubernetes-api). -long-description: | +short-description: > + Manages authorization decisions, allowing admins to dynamically configure access policies through the {% glossary_tooltip text="Kubernetes API" term_id="kubernetes-api" %}. +long-description: > RBAC utilizes *roles*, which contain permission rules, and *role bindings*, which grant the permissions defined in a role to a set of users. diff --git a/_data/glossary/reviewer.yaml b/_data/glossary/reviewer.yaml index 50b189d117..076b120e02 100644 --- a/_data/glossary/reviewer.yaml +++ b/_data/glossary/reviewer.yaml @@ -2,7 +2,7 @@ id: reviewer name: Reviewer tags: - community -short-description: | +short-description: > A person who reviews code for quality and correctness on some part of the project. -long-description: | +long-description: > Reviewers are knowledgeable about both the codebase and software engineering principles. Reviewer status is scoped to a part of the codebase. diff --git a/_data/glossary/service.yaml b/_data/glossary/service.yaml index 82f3998f6b..03c3469c53 100644 --- a/_data/glossary/service.yaml +++ b/_data/glossary/service.yaml @@ -1,9 +1,10 @@ id: service name: Service +full-link: /docs/concepts/services-networking/service/ tags: - fundamental - core-object -short-description: | - An API object that describes how to access applications, such as a set of [Pods](#term-pod), and can describe ports and load-balancers. -long-description: | +short-description: > + An API object that describes how to access applications, such as a set of {% glossary_tooltip text="Pods" term_id="pod" %}, and can describe ports and load-balancers. +long-description: > The access point can be internal or external to the cluster. diff --git a/_data/glossary/sig.yaml b/_data/glossary/sig.yaml index bc365e677f..8e9ccef98b 100644 --- a/_data/glossary/sig.yaml +++ b/_data/glossary/sig.yaml @@ -1,10 +1,11 @@ id: sig name: SIG (special interest group) +full-link: https://github.com/kubernetes/community/blob/master/sig-list.md#master-sig-list tags: - community -short-description: | - [Members](#term-member) who collectively manage an ongoing piece or aspect of the larger Kubernetes open source project. -long-description: > +short-description: > + {% glossary_tooltip text="Community members" term_id="member" %} who collectively manage an ongoing piece or aspect of the larger Kubernetes open source project. +long-description: | Members within a SIG have a shared interest in advancing a specific area, such as architecture, API machinery, or documentation. SIGs must follow the [SIG Governance](https://github.com/kubernetes/community/blob/master/sig-governance.md) guidelines but can have their own contribution policy and channels of communication. diff --git a/_data/glossary/statefulset.yml b/_data/glossary/statefulset.yml index 4f33c9c5d6..9b2d6c44fb 100644 --- a/_data/glossary/statefulset.yml +++ b/_data/glossary/statefulset.yml @@ -1,5 +1,6 @@ id: statefulset name: StatefulSet +full-link: /docs/concepts/workloads/controllers/statefulset/ aka: - PetSet related: @@ -9,10 +10,9 @@ tags: - core-object - workload - storage -short-description: | - Manages the deployment and scaling of a set of [Pods](/docs/concepts/workloads/pods/pod), *and provides guarantees about the ordering and uniqueness* of these Pods. - +short-description: > + Manages the deployment and scaling of a set of {% glossary_tooltip text="Pods" term_id="pod" %}, *and provides guarantees about the ordering and uniqueness* of these Pods. long-description: | - Like a [Deployment](/docs/concepts/workloads/controllers/deployment), a StatefulSet manages Pods that are based on an identical container spec. Unlike a Deployment, a StatefulSet maintains a sticky identity for each of their Pods. These pods are created from the same spec, but are not interchangeable: each has a persistent identifier that it maintains across any rescheduling. + Like a {% glossary_tooltip term_id="deployment" %}, a StatefulSet manages Pods that are based on an identical container spec. Unlike a Deployment, a StatefulSet maintains a sticky identity for each of their Pods. These pods are created from the same spec, but are not interchangeable: each has a persistent identifier that it maintains across any rescheduling. A StatefulSet operates under the same pattern as any other Controller. You define your desired state in a StatefulSet *object*, and the StatefulSet *controller* makes any necessary updates to get there from the current state. diff --git a/_data/glossary/upstream.yaml b/_data/glossary/upstream.yaml index 70b3e4cef4..e2c2cac66d 100644 --- a/_data/glossary/upstream.yaml +++ b/_data/glossary/upstream.yaml @@ -4,7 +4,7 @@ related: - downstream tags: - community -short-description: | +short-description: > May refer to: core Kubernetes or the source repo from which a repo was forked. long-description: | * In the **Kubernetes Community**: Conversations often use *upstream* to mean the core Kubernetes codebase, which the general ecosystem, other code, or third-party tools relies upon. For example, [community members](#term-member) may suggest that a feature is moved upstream so that it is in the core codebase instead of in a plugin or third-party tool. diff --git a/_data/glossary/wg.yaml b/_data/glossary/wg.yaml index 5d7e5ee28e..8237068cf0 100644 --- a/_data/glossary/wg.yaml +++ b/_data/glossary/wg.yaml @@ -1,9 +1,10 @@ id: wg name: WG (working group) +full-link: https://github.com/kubernetes/community/blob/master/sig-list.md#master-working-group-list tags: - community -short-description: | - Facilitates the discussion and/or implementation of a short-lived, narrow, or decoupled project for a committee, [SIG](#term-sig), or cross-SIG effort. +short-description: > + Facilitates the discussion and/or implementation of a short-lived, narrow, or decoupled project for a committee, {% glossary_tooltip text="SIG" term_id="sig" %}, or cross-SIG effort. long-description: | Working groups are a way of organizing people to accomplish a discrete task, and are relatively easy to create and deprecate when inactive. diff --git a/_includes/head.html b/_includes/head.html index e20aad91d2..e6247c4cbb 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -8,6 +8,7 @@ + {% if page.deprecated %}{% endif %} {% if page.class == "gridPage" %}{% endif %} {% if page.css %}{% else %}{% endif %} @@ -23,5 +24,6 @@ + {% seo %} diff --git a/_includes/templates/glossary/snippet.md b/_includes/templates/glossary/snippet.md index cb9e359473..71d59109e1 100644 --- a/_includes/templates/glossary/snippet.md +++ b/_includes/templates/glossary/snippet.md @@ -1,10 +1,10 @@ -{% assign term_data = site.data.glossary.[include.term] %} +{% assign term_data = site.data.glossary.[include.term_id] %} {% if include.length == "all" or include.length == "short" %} {% if term_data.short-description %} -{{ term_data.short-description | markdownify }} +{{ term_data.short-description | liquify | markdownify }} {% else %} @@ -18,7 +18,7 @@ {% if term_data.long-description %} -{{ term_data.long-description | markdownify }} +{{ term_data.long-description | liquify | markdownify }} {% else %} diff --git a/_plugins/README.md b/_plugins/README.md new file mode 100644 index 0000000000..d4a192840e --- /dev/null +++ b/_plugins/README.md @@ -0,0 +1,75 @@ +# Custom Jekyll Plugins + +This directory contains `*.rb` files that extend the original Jekyll classes and provide custom formatting for the docs site: + +### `glossary_tags.rb` + +A full list of glossary terms is available on the [Standardized Glossary](https://kubernetes.io/docs/reference/glossary/?fundamental=true) page. For further information about term schemas, see the [README](../_includes/templates/glossary/README.md) and the provided [`_example.yml`](../_data/glossary/_example.yml). + +*NOTE: The "tags" referenced here are Liquid tags like `{% include %}`, **not** the glossary canonical tags that are used to categorize terms.* + +#### (1) `glossary_definition` tag + +This renders the definition of the glossary term inside a `
`, preserving Markdown formatting where possible. It uses the [`snippet.md` template](../_includes/templates/glossary/snippet.md). + +**Usage:** + +``` +{% glossary_definition term_id="helm-chart" length="all" %} +``` + +**Parameters:** + + +| Name | Default | Description | +| --- | --- | --- | +| `term_id` | N/A (Required) | The `id` of the glossary term whose definition will be used. (This `id` is the same as the filename of the term, i.e. `_data/glossary/.yml`.) | +| `length` | "short" | Specifies which term definition should be used ("short" for the `short-definition`, "long" for `long-description`, "all" when both should be included). | + +#### (2) `glossary_tooltip` tag + +This renders the glossary term with a tooltip--when the term is moused over by the user, its definition is displayed above. + +**Usage:** + +``` +{% glossary_tooltip text="Helm Charts" term_id="helm-chart" %} +``` + +This renders the following: + +![glossary-tooltip](../images/metadocs/jekyll-tags-glossary-tooltip.png) + +**Parameters:** + + +| Name | Default | Description | +| --- | --- | --- | +| `text` | the `name` of the glossary term | The text that the user will hover over to display the glossary definition. **You should include this if using the tooltip inside of a glossary term's YAML short-definition.** | +| `term_id` | N/A (Required) | The `id` of the associated glossary term. (This `id` is the same as the filename of the term, i.e. `_data/glossary/.yml`.) | + +#### (3) `glossary_injector` tag + +This takes the definition of the term specified by the `term_id` and uses it to populate the contents of another HTML element specified by `placeholder_id`. + +**Usage:** + +``` +{% glossary_injector term_id="kubectl" placeholder_id="def-container" length="short" %} +``` + +This renders the following: + +![glossary-injector](../images/metadocs/jekyll-tags-glossary-injector.gif) + +*NOTE: Neither the placeholder nor the term's styling/CSS is determined by this Jekyll tag. You will need to specify this yourself in your Markdown/HTML files, i.e. by assigning a custom class.* + +**Parameters:** + + +| Name | Default | Description | +| --- | --- | --- | +| `text` | the `name` of the glossary term | The text that the user will hover over to display the glossary definition. | +| `term_id` | N/A (Required) | The `id` of the glossary term whose definition will be used. (This `id` is the same as the filename of the term, i.e. `_data/glossary/.yml`.) | +| `placeholder_id` | N/A (Required) | The `id` of the HTML element whose contents will be populated with the definition of `term_id` | +| `length` | "short" | Specifies which term definition should be used ("short" for the `short-definition`, "long" for `long-description`, "all" when both should be included). | diff --git a/_plugins/glossary_tags.rb b/_plugins/glossary_tags.rb new file mode 100644 index 0000000000..c59ccf0e9f --- /dev/null +++ b/_plugins/glossary_tags.rb @@ -0,0 +1,122 @@ +# See /_plugins/README.md for full documentation of these custom Jekyll tags +module Jekyll + module GlossaryTags + # Base class for tags (not to be instantiated) + class Base < Liquid::Tag + VALID_PARAM_NAMES = [] + LENGTH_SHORT = "short" + LENGTH_LONG = "long" + SNIPPET_TEMPLATE = "templates/glossary/snippet.md" + + def initialize(tag_name, markup, options) + super + @args = {} + @markup.scan(/([\S]+=['"][^=]+["'])+/).each do |arg| + key, val = arg.first.split("=") + key = key.to_sym + next unless val + if self.class::VALID_PARAM_NAMES.include?(key) + @args[key] = val.gsub("\"", "") + end + end + end + + # "abstract" method + def render(context) + raise NotImplementedError + end + + protected + + def glossary_term_info(context) + global_glossary_hash = context.registers[:site].data["glossary"] + unless global_glossary_hash.keys.to_set.include?(@args[:term_id]) + raise StandardError, + "#{@args[:term_id]} is not a valid glossary term id. Please " \ + "see ./_data/glossary/* for the complete list." + end + global_glossary_hash[@args[:term_id]] + end + + def include_snippet(context) + @args[:length] ||= LENGTH_SHORT + clean_markup = @args.keys.map { |k| "#{k}=\"#{@args[k]}\"" }.join(" ") + + Jekyll::Tags::IncludeTag.parse( + "include", + "#{SNIPPET_TEMPLATE} #{clean_markup}", + nil, + @parse_context + ).render(context) + end + end + + # Tag for displaying a glossary term's definition inline + class Definition < Base + VALID_PARAM_NAMES = [ + :term_id, + :length + ].freeze + + def render(context) + include_snippet(context) + end + end + + # Tag to display a tooltip for a specific glossary term + class Tooltip < Base + VALID_PARAM_NAMES = [ + :text, + :term_id + ].freeze + GLOSSARY_HOME = "/docs/reference/glossary/?all=true" + NESTED_TOOLTIPS = /{% (.*?text="(.*?)".*?) %}/ + NESTED_MARKDOWN_LINKS = /(\[(.*?)\]\(.*?\))/ + + def render(context) + term_info = glossary_term_info(context) + external_link = + term_info["full-link"] || + "#{GLOSSARY_HOME}#term-#{term_info["id"]}" + tooltip = term_info["short-description"]. + gsub(NESTED_TOOLTIPS, '\2'). + gsub(NESTED_MARKDOWN_LINKS, '\2'). + strip + + "" \ + "#{@args[:text] || term_info["name"]}" \ + "" \ + "#{tooltip}" \ + "" \ + "" + end + end + + # Tag to inject a glossary term definition into another HTML element + class Injector < Base + VALID_PARAM_NAMES = [ + :text, + :term_id, + :placeholder_id, + :length + ].freeze + RENDERED_DESCRIPTION_BLOCK = /.*

(.+)<\/p>.*/ + + def render(context) + term_info = glossary_term_info(context) + description = RENDERED_DESCRIPTION_BLOCK.match(include_snippet(context))[1] + + "" \ + "#{@args[:text] || term_info["name"]}" \ + "" \ + "#{description}" \ + "" \ + "" + end + end + end +end + +Liquid::Template.register_tag('glossary_definition', Jekyll::GlossaryTags::Definition) +Liquid::Template.register_tag('glossary_tooltip', Jekyll::GlossaryTags::Tooltip) +Liquid::Template.register_tag('glossary_injector', Jekyll::GlossaryTags::Injector) diff --git a/_plugins/liquify_filter.rb b/_plugins/liquify_filter.rb new file mode 100644 index 0000000000..8c31915699 --- /dev/null +++ b/_plugins/liquify_filter.rb @@ -0,0 +1,10 @@ +# Filter to force liquid parsing +module Jekyll + module LiquifyFilter + def liquify(input) + Liquid::Template.parse(input).render(@context) + end + end +end + +Liquid::Template.register_filter(Jekyll::LiquifyFilter) diff --git a/css/custom-jekyll/tags.css b/css/custom-jekyll/tags.css new file mode 100644 index 0000000000..c9b409091c --- /dev/null +++ b/css/custom-jekyll/tags.css @@ -0,0 +1,56 @@ +.no-underline { + text-decoration: none !important; +} + +.hide { + display: none !important; +} + +/* Tooltip container */ +.glossary-tooltip { + position: relative; + display: inline-block; + border-bottom: 1px dotted black; /* If you want dots under the hoverable text */ + color: black; + text-decoration: none !important; +} + +/* Tooltip text */ +.glossary-tooltip .tooltip-text { + visibility: hidden; + width: 300px; + background-color: #555; + color: #fff; + text-align: center; + padding: 5px 8px; + border-radius: 6px; + + /* Position the tooltip text */ + position: absolute; + z-index: 1; + bottom: 125%; + left: 50%; + margin-left: -150px; + + /* Fade in tooltip */ + opacity: 0; + transition: opacity 0.3s; +} + +/* Tooltip arrow */ +.glossary-tooltip .tooltip-text::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: #555 transparent transparent transparent; +} + +/* Show the tooltip text when you mouse over the tooltip container */ +.glossary-tooltip:hover .tooltip-text { + visibility: visible; + opacity: 1; +} diff --git a/css/glossary.css b/css/glossary.css index 67d536ccf9..2146a418e3 100644 --- a/css/glossary.css +++ b/css/glossary.css @@ -2,14 +2,6 @@ display: inline; } -.no-underline { - text-decoration: none !important; -} - -.hide { - display: none !important; -} - .permalink { background-image: url(../images/link.png); background-repeat: no-repeat; diff --git a/docs/concepts/services-networking/ingress.md b/docs/concepts/services-networking/ingress.md index a0e38c5b8d..11ba226296 100644 --- a/docs/concepts/services-networking/ingress.md +++ b/docs/concepts/services-networking/ingress.md @@ -5,7 +5,7 @@ title: Ingress --- {% capture overview %} -{% include templates/glossary/snippet.md term="ingress" length="all" %} +{% glossary_definition term_id="ingress" length="all" %} {% endcapture %} {% capture body %} diff --git a/docs/concepts/workloads/controllers/statefulset.md b/docs/concepts/workloads/controllers/statefulset.md index 5daa83694e..7fb2431cc3 100644 --- a/docs/concepts/workloads/controllers/statefulset.md +++ b/docs/concepts/workloads/controllers/statefulset.md @@ -10,10 +10,10 @@ title: StatefulSets --- {% capture overview %} -**StatefulSet is the workload API object used to manage stateful applications. +**StatefulSet is the workload API object used to manage stateful applications. StatefulSets are beta in 1.8.** -{% include templates/glossary/snippet.md term="statefulset" length="all" %} +{% glossary_definition term_id="statefulset" length="all" %} {% endcapture %} {% capture body %} diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md index ceb1dc4dd3..4500fb5e1e 100644 --- a/docs/reference/glossary.md +++ b/docs/reference/glossary.md @@ -56,9 +56,10 @@ default_active_tag: fundamental Also known as: {{ term.aka | join: ", " }}
{% endif %} -{{ term.short-description | markdownify }} [+] + +{{ term.short-description | liquify | markdownify }} [+]

-{{ term.long-description | markdownify }} +{{ term.long-description | liquify | markdownify }}
diff --git a/docs/search.md b/docs/search.md index c74bf2bc2e..619b0152cf 100644 --- a/docs/search.md +++ b/docs/search.md @@ -2,8 +2,11 @@ layout: docwithnav title: Search Results --- - + - diff --git a/docs/tasks/configure-pod-container/assign-memory-resource.md b/docs/tasks/configure-pod-container/assign-memory-resource.md index c28be6e19f..68ef9c257d 100644 --- a/docs/tasks/configure-pod-container/assign-memory-resource.md +++ b/docs/tasks/configure-pod-container/assign-memory-resource.md @@ -124,12 +124,14 @@ Pod's 200 MiB limit. } ``` + Delete your Pod: ```shell kubectl delete pod memory-demo --namespace=mem-example ``` + ## Exceed a Container's memory limit A Container can exceed its memory request if the Node has memory available. But a Container @@ -370,4 +372,3 @@ kubectl delete namespace mem-example {% include templates/task.md %} - diff --git a/docs/tasks/inject-data-application/define-command-argument-container.md b/docs/tasks/inject-data-application/define-command-argument-container.md index 808b7b521f..65cc657cb0 100644 --- a/docs/tasks/inject-data-application/define-command-argument-container.md +++ b/docs/tasks/inject-data-application/define-command-argument-container.md @@ -5,7 +5,7 @@ title: Define a Command and Arguments for a Container {% capture overview %} This page shows how to define commands and arguments when you run a container -in a Kubernetes Pod. +in a {% glossary_tooltip term_id="pod" %}. {% endcapture %} diff --git a/images/metadocs/jekyll-tags-glossary-injector.gif b/images/metadocs/jekyll-tags-glossary-injector.gif new file mode 100644 index 0000000000000000000000000000000000000000..8392c567ef3ac92bd68e1ed75f104247b04b0ded GIT binary patch literal 41295 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 hap%^(n|E*DzkvrAKAd=Qm1X^<~!H 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 PMR_#UbXD;xFT(!^f@r$w literal 0 HcmV?d00001 diff --git a/js/custom-jekyll/tags.js b/js/custom-jekyll/tags.js new file mode 100644 index 0000000000..d99660ee60 --- /dev/null +++ b/js/custom-jekyll/tags.js @@ -0,0 +1,15 @@ +$( document ).ready(function() { + // Shows permalink when term name is hovered over + $(".glossary-injector").each(function() { + var placeholder = $("#" + $(this).data("placeholder-id")); + var originalContent = placeholder.html(); + + var glossaryDef = $($(this).find(".injector-def")[0]).html(); + + $(this).mouseenter(function() { + placeholder.html(glossaryDef); + }).mouseleave(function(){ + placeholder.html(originalContent); + }); + }); +});