Han-theme 1.0.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.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/_includes/comments.html +5 -0
  3. data/_includes/custom.html +3 -0
  4. data/_includes/datetime.html +20 -0
  5. data/_includes/favicons.html +19 -0
  6. data/_includes/footer.html +36 -0
  7. data/_includes/head.html +107 -0
  8. data/_includes/js-selector.html +106 -0
  9. data/_includes/jsdelivr-combine.html +26 -0
  10. data/_includes/lang.html +10 -0
  11. data/_includes/language-alias.html +70 -0
  12. data/_includes/media-url.html +37 -0
  13. data/_includes/mermaid.html +62 -0
  14. data/_includes/metadata-hook.html +1 -0
  15. data/_includes/mode-toggle.html +116 -0
  16. data/_includes/no-linenos.html +10 -0
  17. data/_includes/notification.html +24 -0
  18. data/_includes/origin-type.html +13 -0
  19. data/_includes/post-description.html +16 -0
  20. data/_includes/post-nav.html +34 -0
  21. data/_includes/post-paginator.html +91 -0
  22. data/_includes/post-sharing.html +52 -0
  23. data/_includes/read-time.html +37 -0
  24. data/_includes/refactor-content.html +255 -0
  25. data/_includes/related-posts.html +94 -0
  26. data/_includes/search-loader.html +47 -0
  27. data/_includes/search-results.html +10 -0
  28. data/_includes/sidebar.html +102 -0
  29. data/_includes/toc.html +13 -0
  30. data/_includes/topbar.html +77 -0
  31. data/_includes/trending-tags.html +46 -0
  32. data/_includes/update-list.html +40 -0
  33. data/_layouts/archives.html +35 -0
  34. data/_layouts/categories.html +138 -0
  35. data/_layouts/category.html +24 -0
  36. data/_layouts/compress.html +10 -0
  37. data/_layouts/default.html +76 -0
  38. data/_layouts/home.html +115 -0
  39. data/_layouts/page.html +20 -0
  40. data/_layouts/portfolio.html +82 -0
  41. data/_layouts/post.html +152 -0
  42. data/_layouts/tag.html +23 -0
  43. data/_layouts/tags.html +22 -0
  44. data/assets/404.html +14 -0
  45. data/assets/feed.xml +54 -0
  46. data/assets/robots.txt +10 -0
  47. metadata +282 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f3d220aac0f7d5f66c47126d0c7fda4c8fb7313adc83b50838a821f77d900ab6
4
+ data.tar.gz: 3a4d00559811d5fde4eb66eca255b8fd067a62ff998784878dde9dbe5552de65
5
+ SHA512:
6
+ metadata.gz: c5e85aceb41a58e7494b7274fb54e2f7efa528b56e00b5b1044819a02ae4a7a44d7677d0738579d94cba4c6d38a13a03f4dea13cc061ace91d3b3a87becf3fcb
7
+ data.tar.gz: b6ff7539ea7c213cf0cefeab2db0d5f5fe8befdc078bd2d4ace01135125024d24d7aa5993f212174c00f75f745a3c962964f929fc88be6515d057c7e3dba85f7
@@ -0,0 +1,5 @@
1
+ <!-- The comments switcher -->
2
+ {% if page.comments and site.comments.provider %}
3
+ {% capture path %}comments/{{ site.comments.provider }}.html{% endcapture %}
4
+ {% include {{ path }} %}
5
+ {% endif %}
@@ -0,0 +1,3 @@
1
+ {% if page.mermaid %}
2
+ {% include mermaid.html %}
3
+ {% endif %}
@@ -0,0 +1,20 @@
1
+ <!--
2
+ Date format snippet
3
+ See: ${JS_ROOT}/utils/locale-dateime.js
4
+ -->
5
+
6
+ {% assign df_strftime = site.data.locales[include.lang].df.post.strftime | default: '%d/%m/%Y' %}
7
+ {% assign df_dayjs = site.data.locales[include.lang].df.post.dayjs | default: 'DD/MM/YYYY' %}
8
+
9
+ <time
10
+ {% if include.class %}
11
+ class="{{ include.class }}"
12
+ {% endif %}
13
+ data-ts="{{ include.date | date: '%s' }}"
14
+ data-df="{{ df_dayjs }}"
15
+ {% if include.tooltip %}
16
+ data-bs-toggle="tooltip" data-bs-placement="bottom"
17
+ {% endif %}
18
+ >
19
+ {{ include.date | date: df_strftime }}
20
+ </time>
@@ -0,0 +1,19 @@
1
+ <!--
2
+ The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps
3
+ Generated by: https://realfavicongenerator.net/
4
+ -->
5
+
6
+ {% capture favicon_path %}{{ '/assets/img/favicons' | relative_url }}{% endcapture %}
7
+
8
+ <link rel="apple-touch-icon" sizes="180x180" href="{{ favicon_path }}/apple-touch-icon.png">
9
+ <link rel="icon" type="image/png" sizes="32x32" href="{{ favicon_path }}/favicon-32x32.png">
10
+ <link rel="icon" type="image/png" sizes="16x16" href="{{ favicon_path }}/favicon-16x16.png">
11
+ {% if site.pwa.enabled %}
12
+ <link rel="manifest" href="{{ favicon_path }}/site.webmanifest">
13
+ {% endif %}
14
+ <link rel="shortcut icon" href="{{ favicon_path }}/favicon.ico">
15
+ <meta name="apple-mobile-web-app-title" content="{{ site.title }}">
16
+ <meta name="application-name" content="{{ site.title }}">
17
+ <meta name="msapplication-TileColor" content="#da532c">
18
+ <meta name="msapplication-config" content="{{ favicon_path }}/browserconfig.xml">
19
+ <meta name="theme-color" content="#ffffff">
@@ -0,0 +1,36 @@
1
+ <!-- The Footer -->
2
+
3
+ <footer
4
+ aria-label="Site Info"
5
+ class="
6
+ d-flex flex-column justify-content-center text-muted
7
+ flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
8
+ "
9
+ >
10
+ <p>
11
+ {{- '©' }}
12
+ <time>{{ 'now' | date: '%Y' }}</time>
13
+
14
+ {% if site.social.links %}
15
+ <a href="{{ site.social.links[0] }}">{{ site.social.name }}</a>.
16
+ {% else %}
17
+ <em class="fst-normal">{{ site.social.name }}</em>.
18
+ {% endif %}
19
+
20
+ {% if site.data.locales[include.lang].copyright.brief %}
21
+ <span
22
+ data-bs-toggle="tooltip"
23
+ data-bs-placement="top"
24
+ title="{{ site.data.locales[include.lang].copyright.verbose }}"
25
+ >
26
+ {{- site.data.locales[include.lang].copyright.brief -}}
27
+ </span>
28
+ {% endif %}
29
+ </p>
30
+
31
+ <p>
32
+ {%- capture _platform -%}
33
+ <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a>
34
+ {%- endcapture -%}
35
+ </p>
36
+ </footer>
@@ -0,0 +1,107 @@
1
+ <head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3
+ <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
4
+ <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
5
+ <meta name="apple-mobile-web-app-capable" content="yes">
6
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
7
+ <meta
8
+ name="viewport"
9
+ content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
10
+ >
11
+
12
+ {%- capture seo_tags -%}
13
+ {% seo title=false %}
14
+ {%- endcapture -%}
15
+
16
+ <!-- Setup Open Graph image -->
17
+
18
+ {% if page.image %}
19
+ {% assign src = page.image.path | default: page.image %}
20
+
21
+ {% unless src contains '://' %}
22
+ {%- capture img_url -%}
23
+ {% include media-url.html src=src subpath=page.media_subpath absolute=true %}
24
+ {%- endcapture -%}
25
+
26
+ {%- capture old_url -%}{{ src | absolute_url }}{%- endcapture -%}
27
+ {%- capture new_url -%}{{ img_url }}{%- endcapture -%}
28
+
29
+ {% assign seo_tags = seo_tags | replace: old_url, new_url %}
30
+ {% endunless %}
31
+
32
+ {% elsif site.social_preview_image %}
33
+ {%- capture img_url -%}
34
+ {% include media-url.html src=site.social_preview_image absolute=true %}
35
+ {%- endcapture -%}
36
+
37
+ {%- capture og_image -%}
38
+ <meta property="og:image" content="{{ img_url }}" />
39
+ {%- endcapture -%}
40
+
41
+ {%- capture twitter_image -%}
42
+ <meta name="twitter:card" content="summary_large_image" />
43
+ <meta property="twitter:image" content="{{ img_url }}" />
44
+ {%- endcapture -%}
45
+
46
+ {% assign old_meta_clip = '<meta name="twitter:card" content="summary" />' %}
47
+ {% assign new_meta_clip = og_image | append: twitter_image %}
48
+ {% assign seo_tags = seo_tags | replace: old_meta_clip, new_meta_clip %}
49
+ {% endif %}
50
+
51
+ {{ seo_tags }}
52
+
53
+ <title>
54
+ {%- unless page.layout == 'home' -%}
55
+ {{ page.title | append: ' | ' }}
56
+ {%- endunless -%}
57
+ {{ site.title }}
58
+ </title>
59
+
60
+ {% include_cached favicons.html %}
61
+
62
+ <!-- Resource Hints -->
63
+ {% unless site.assets.self_host.enabled %}
64
+ {% for hint in site.data.origin.cors.resource_hints %}
65
+ {% for link in hint.links %}
66
+ <link rel="{{ link.rel }}" href="{{ hint.url }}" {{ link.opts | join: ' ' }}>
67
+ {% endfor %}
68
+ {% endfor %}
69
+ {% endunless %}
70
+
71
+ <!-- Bootstrap -->
72
+ {% unless jekyll.environment == 'production' %}
73
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
74
+ {% endunless %}
75
+
76
+ <!-- Theme style -->
77
+ <link rel="stylesheet" href="{{ '/assets/css/:THEME.css' | replace: ':THEME', site.theme | relative_url }}">
78
+
79
+ <!-- Web Font -->
80
+ <link rel="stylesheet" href="{{ site.data.origin[type].webfonts | relative_url }}">
81
+
82
+ <!-- Font Awesome Icons -->
83
+ <link rel="stylesheet" href="{{ site.data.origin[type].fontawesome.css | relative_url }}">
84
+
85
+ <!-- 3rd-party Dependencies -->
86
+
87
+ {% if site.toc and page.toc %}
88
+ <link rel="stylesheet" href="{{ site.data.origin[type].toc.css | relative_url }}">
89
+ {% endif %}
90
+
91
+ {% if page.layout == 'post' or page.layout == 'page' or page.layout == 'home' %}
92
+ <link rel="stylesheet" href="{{ site.data.origin[type]['lazy-polyfill'].css | relative_url }}">
93
+ {% endif %}
94
+
95
+ {% if page.layout == 'page' or page.layout == 'post' %}
96
+ <!-- Image Popup -->
97
+ <link rel="stylesheet" href="{{ site.data.origin[type].glightbox.css | relative_url }}">
98
+ {% endif %}
99
+
100
+ <!-- JavaScript -->
101
+
102
+ {% unless site.theme_mode %}
103
+ {% include mode-toggle.html %}
104
+ {% endunless %}
105
+
106
+ {% include metadata-hook.html %}
107
+ </head>
@@ -0,0 +1,106 @@
1
+ <!-- JS selector for site. -->
2
+
3
+ <!-- commons -->
4
+
5
+ {% assign urls = site.data.origin[type].search.js %}
6
+
7
+ <!-- layout specified -->
8
+
9
+ {% if page.layout == 'post' or page.layout == 'page' or page.layout == 'home' %}
10
+ {% assign urls = urls | append: ',' | append: site.data.origin[type]['lazy-polyfill'].js %}
11
+
12
+ {% unless page.layout == 'home' %}
13
+ <!-- image lazy-loading & popup & clipboard -->
14
+ {% assign urls = urls
15
+ | append: ','
16
+ | append: site.data.origin[type].glightbox.js
17
+ | append: ','
18
+ | append: site.data.origin[type].clipboard.js
19
+ %}
20
+ {% endunless %}
21
+ {% endif %}
22
+
23
+ {% if page.layout == 'home'
24
+ or page.layout == 'post'
25
+ or page.layout == 'archives'
26
+ or page.layout == 'category'
27
+ or page.layout == 'tag'
28
+ %}
29
+ {% assign locale = include.lang | split: '-' | first %}
30
+
31
+ {% assign urls = urls
32
+ | append: ','
33
+ | append: site.data.origin[type].dayjs.js.common
34
+ | append: ','
35
+ | append: site.data.origin[type].dayjs.js.locale
36
+ | replace: ':LOCALE', locale
37
+ | append: ','
38
+ | append: site.data.origin[type].dayjs.js.relativeTime
39
+ | append: ','
40
+ | append: site.data.origin[type].dayjs.js.localizedFormat
41
+ %}
42
+ {% endif %}
43
+
44
+ {% if page.content contains '<h2' or page.content contains '<h3' and site.toc and page.toc %}
45
+ {% assign urls = urls | append: ',' | append: site.data.origin[type].toc.js %}
46
+ {% endif %}
47
+
48
+ {% if page.mermaid %}
49
+ {% assign urls = urls | append: ',' | append: site.data.origin[type].mermaid.js %}
50
+ {% endif %}
51
+
52
+ {% include jsdelivr-combine.html urls=urls %}
53
+
54
+ {% case page.layout %}
55
+ {% when 'home', 'categories', 'post', 'page' %}
56
+ {% assign js = page.layout %}
57
+ {% when 'archives', 'category', 'tag' %}
58
+ {% assign js = 'misc' %}
59
+ {% else %}
60
+ {% assign js = 'commons' %}
61
+ {% endcase %}
62
+
63
+ {% capture script %}/assets/js/dist/{{ js }}.min.js{% endcapture %}
64
+
65
+ <script src="{{ script | relative_url }}"></script>
66
+
67
+ {% if page.math %}
68
+ <!-- MathJax -->
69
+ <script src="{{ '/assets/js/data/mathjax.js' | relative_url }}"></script>
70
+ <script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6"></script>
71
+ <script id="MathJax-script" async src="{{ site.data.origin[type].mathjax.js | relative_url }}"></script>
72
+ {% endif %}
73
+
74
+ <!-- Pageviews -->
75
+ {% if page.layout == 'post' %}
76
+ {% assign provider = site.pageviews.provider %}
77
+
78
+ {% if provider and provider != empty %}
79
+ {% case provider %}
80
+ {% when 'goatcounter' %}
81
+ {% if site.analytics[provider].id != empty and site.analytics[provider].id %}
82
+ {% include pageviews/{{ provider }}.html %}
83
+ {% endif %}
84
+ {% endcase %}
85
+ {% endif %}
86
+ {% endif %}
87
+
88
+ {% if page.mermaid %}
89
+ {% include mermaid.html %}
90
+ {% endif %}
91
+
92
+ {% if jekyll.environment == 'production' %}
93
+ <!-- PWA -->
94
+ {% if site.pwa.enabled %}
95
+ <script defer src="{{ 'app.min.js' | relative_url }}"></script>
96
+ {% endif %}
97
+
98
+ <!-- Web Analytics -->
99
+ {% for analytics in site.analytics %}
100
+ {% capture str %}{{ analytics }}{% endcapture %}
101
+ {% assign type = str | split: '{' | first %}
102
+ {% if site.analytics[type].id and site.analytics[type].id != empty %}
103
+ {% include analytics/{{ type }}.html %}
104
+ {% endif %}
105
+ {% endfor %}
106
+ {% endif %}
@@ -0,0 +1,26 @@
1
+ {% assign urls = include.urls | split: ',' %}
2
+
3
+ {% assign combined_urls = nil %}
4
+
5
+ {% assign domain = 'https://cdn.jsdelivr.net/' %}
6
+
7
+ {% for url in urls %}
8
+ {% if url contains domain %}
9
+ {% assign url_snippet = url | slice: domain.size, url.size %}
10
+
11
+ {% if combined_urls %}
12
+ {% assign combined_urls = combined_urls | append: ',' | append: url_snippet %}
13
+ {% else %}
14
+ {% assign combined_urls = domain | append: 'combine/' | append: url_snippet %}
15
+ {% endif %}
16
+
17
+ {% elsif url contains '//' %}
18
+ <script src="{{ url }}"></script>
19
+ {% else %}
20
+ <script src="{{ url | relative_url }}"></script>
21
+ {% endif %}
22
+ {% endfor %}
23
+
24
+ {% if combined_urls %}
25
+ <script src="{{ combined_urls }}"></script>
26
+ {% endif %}
@@ -0,0 +1,10 @@
1
+ {% comment %}
2
+ Detect appearance language and return it through variable "lang"
3
+ {% endcomment %}
4
+ {% if site.data.locales[page.lang] %}
5
+ {% assign lang = page.lang %}
6
+ {% elsif site.data.locales[site.lang] %}
7
+ {% assign lang = site.lang %}
8
+ {% else %}
9
+ {% assign lang = 'en' %}
10
+ {% endif %}
@@ -0,0 +1,70 @@
1
+ {% comment %}
2
+
3
+ Convert the alias of the syntax language to the official name
4
+
5
+ See: <https://github.com/rouge-ruby/rouge/wiki/List-of-supported-languages-and-lexers>
6
+
7
+ {% endcomment %}
8
+
9
+ {% assign _lang = include.language | default: '' %}
10
+
11
+ {% case _lang %}
12
+ {% when 'actionscript', 'as', 'as3' %}
13
+ {{ 'ActionScript' }}
14
+ {% when 'applescript' %}
15
+ {{ 'AppleScript' }}
16
+ {% when 'brightscript', 'bs', 'brs' %}
17
+ {{ 'BrightScript' }}
18
+ {% when 'cfscript', 'cfc' %}
19
+ {{ 'CFScript' }}
20
+ {% when 'coffeescript', 'coffee', 'coffee-script' %}
21
+ {{ 'CoffeeScript' }}
22
+ {% when 'cs', 'csharp' %}
23
+ {{ 'C#' }}
24
+ {% when 'erl' %}
25
+ {{ 'Erlang' }}
26
+ {% when 'graphql' %}
27
+ {{ 'GraphQL' }}
28
+ {% when 'haskell', 'hs' %}
29
+ {{ 'Haskell' }}
30
+ {% when 'javascript', 'js' %}
31
+ {{ 'JavaScript' }}
32
+ {% when 'make', 'mf', 'gnumake', 'bsdmake' %}
33
+ {{ 'Makefile' }}
34
+ {% when 'md', 'mkd' %}
35
+ {{ 'Markdown' }}
36
+ {% when 'm' %}
37
+ {{ 'Matlab' }}
38
+ {% when 'objective_c', 'objc', 'obj-c', 'obj_c', 'objectivec' %}
39
+ {{ 'Objective-C' }}
40
+ {% when 'perl', 'pl' %}
41
+ {{ 'Perl' }}
42
+ {% when 'php','php3','php4','php5' %}
43
+ {{ 'PHP' }}
44
+ {% when 'py' %}
45
+ {{ 'Python' }}
46
+ {% when 'rb' %}
47
+ {{ 'Ruby' }}
48
+ {% when 'rs','no_run','ignore','should_panic' %}
49
+ {{ 'Rust' }}
50
+ {% when 'bash', 'zsh', 'ksh', 'sh' %}
51
+ {{ 'Shell' }}
52
+ {% when 'st', 'squeak' %}
53
+ {{ 'Smalltalk' }}
54
+ {% when 'tex'%}
55
+ {{ 'TeX' }}
56
+ {% when 'latex' %}
57
+ {{ 'LaTex' }}
58
+ {% when 'ts', 'typescript' %}
59
+ {{ 'TypeScript' }}
60
+ {% when 'vb', 'visualbasic' %}
61
+ {{ 'Visual Basic' }}
62
+ {% when 'vue', 'vuejs' %}
63
+ {{ 'Vue.js' }}
64
+ {% when 'yml' %}
65
+ {{ 'YAML' }}
66
+ {% when 'css', 'html', 'scss', 'ssh', 'toml', 'xml', 'yaml', 'json' %}
67
+ {{ _lang | upcase }}
68
+ {% else %}
69
+ {{ _lang | capitalize }}
70
+ {% endcase %}
@@ -0,0 +1,37 @@
1
+ {%- comment -%}
2
+ Generate media resource final URL based on `site.cdn`, `page.media_subpath`
3
+
4
+ Arguments:
5
+ src - required, basic media resources path
6
+ subpath - optional, relative path of media resources
7
+ absolute - optional, boolean, if true, generate absolute URL
8
+
9
+ Return:
10
+ media resources URL
11
+ {%- endcomment -%}
12
+
13
+ {% assign url = include.src %}
14
+
15
+ {%- if url -%}
16
+ {% unless url contains ':' %}
17
+ {%- comment -%} Add media resources subpath prefix {%- endcomment -%}
18
+ {% assign url = include.subpath | default: '' | append: '/' | append: url %}
19
+
20
+ {%- comment -%} Prepend CND URL {%- endcomment -%}
21
+ {% if site.cdn %}
22
+ {% assign url = site.cdn | append: '/' | append: url %}
23
+ {% endif %}
24
+
25
+ {% assign url = url | replace: '///', '/' | replace: '//', '/' | replace: ':/', '://' %}
26
+
27
+ {% unless url contains '://' %}
28
+ {% if include.absolute %}
29
+ {% assign url = site.url | append: site.baseurl | append: url %}
30
+ {% else %}
31
+ {% assign url = site.baseurl | append: url %}
32
+ {% endif %}
33
+ {% endunless %}
34
+ {% endunless %}
35
+ {%- endif -%}
36
+
37
+ {{- url -}}
@@ -0,0 +1,62 @@
1
+ <!-- mermaid-js loader -->
2
+ <script type="text/javascript">
3
+ function updateMermaid(event) {
4
+ if (event.source === window && event.data && event.data.direction === ModeToggle.ID) {
5
+ const mode = event.data.message;
6
+
7
+ if (typeof mermaid === 'undefined') {
8
+ return;
9
+ }
10
+
11
+ let expectedTheme = mode === ModeToggle.DARK_MODE ? 'dark' : 'default';
12
+ let config = { theme: expectedTheme };
13
+
14
+ {%- comment -%}
15
+ Re-render the SVG › <https://github.com/mermaid-js/mermaid/issues/311#issuecomment-332557344>
16
+ {%- endcomment -%}
17
+ const mermaidList = document.getElementsByClassName('mermaid');
18
+
19
+ [...mermaidList].forEach((elem) => {
20
+ const svgCode = elem.previousSibling.children.item(0).innerHTML;
21
+ elem.innerHTML = svgCode;
22
+ elem.removeAttribute('data-processed');
23
+ });
24
+
25
+ mermaid.initialize(config);
26
+ mermaid.init(undefined, '.mermaid');
27
+ }
28
+ }
29
+
30
+ (function () {
31
+ let initTheme = 'default';
32
+ const html = document.documentElement;
33
+
34
+ if (
35
+ (html.hasAttribute('data-mode') && html.getAttribute('data-mode') === 'dark') ||
36
+ (!html.hasAttribute('data-mode') && window.matchMedia('(prefers-color-scheme: dark)').matches)
37
+ ) {
38
+ initTheme = 'dark';
39
+ }
40
+
41
+ let mermaidConf = {
42
+ theme: initTheme {%- comment -%} <default | dark | forest | neutral> {%- endcomment -%}
43
+ };
44
+
45
+ {%- comment -%} Create mermaid tag {%- endcomment -%}
46
+ const basicList = document.getElementsByClassName('language-mermaid');
47
+ [...basicList].forEach((elem) => {
48
+ const svgCode = elem.textContent;
49
+ const backup = elem.parentElement;
50
+ backup.classList.add('d-none');
51
+ {%- comment -%} create mermaid node {%- endcomment -%}
52
+ let mermaid = document.createElement('pre');
53
+ mermaid.classList.add('mermaid');
54
+ const text = document.createTextNode(svgCode);
55
+ mermaid.appendChild(text);
56
+ backup.after(mermaid);
57
+ });
58
+
59
+ mermaid.initialize(mermaidConf);
60
+ window.addEventListener('message', updateMermaid);
61
+ })();
62
+ </script>
@@ -0,0 +1 @@
1
+ <!-- A placeholder to allow defining custom metadata -->
@@ -0,0 +1,116 @@
1
+ <!-- Switch the mode between dark and light. -->
2
+
3
+ <script type="text/javascript">
4
+ class ModeToggle {
5
+ static get MODE_KEY() {
6
+ return 'mode';
7
+ }
8
+ static get MODE_ATTR() {
9
+ return 'data-mode';
10
+ }
11
+ static get DARK_MODE() {
12
+ return 'dark';
13
+ }
14
+ static get LIGHT_MODE() {
15
+ return 'light';
16
+ }
17
+ static get ID() {
18
+ return 'mode-toggle';
19
+ }
20
+
21
+ constructor() {
22
+ let self = this;
23
+
24
+ {%- comment -%} always follow the system prefers {%- endcomment -%}
25
+ this.sysDarkPrefers.addEventListener('change', () => {
26
+ if (self.hasMode) {
27
+ self.clearMode();
28
+ }
29
+ self.notify();
30
+ });
31
+
32
+ if (!this.hasMode) {
33
+ return;
34
+ }
35
+
36
+ if (this.isDarkMode) {
37
+ this.setDark();
38
+ } else {
39
+ this.setLight();
40
+ }
41
+ }
42
+
43
+ get sysDarkPrefers() {
44
+ return window.matchMedia('(prefers-color-scheme: dark)');
45
+ }
46
+
47
+ get isPreferDark() {
48
+ return this.sysDarkPrefers.matches;
49
+ }
50
+
51
+ get isDarkMode() {
52
+ return this.mode === ModeToggle.DARK_MODE;
53
+ }
54
+
55
+ get hasMode() {
56
+ return this.mode != null;
57
+ }
58
+
59
+ get mode() {
60
+ return sessionStorage.getItem(ModeToggle.MODE_KEY);
61
+ }
62
+
63
+ {%- comment -%} get the current mode on screen {%- endcomment -%}
64
+ get modeStatus() {
65
+ if (this.hasMode) {
66
+ return this.mode;
67
+ } else {
68
+ return this.isPreferDark ? ModeToggle.DARK_MODE : ModeToggle.LIGHT_MODE;
69
+ }
70
+ }
71
+
72
+ setDark() {
73
+ document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.DARK_MODE);
74
+ sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
75
+ }
76
+
77
+ setLight() {
78
+ document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.LIGHT_MODE);
79
+ sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
80
+ }
81
+
82
+ clearMode() {
83
+ document.documentElement.removeAttribute(ModeToggle.MODE_ATTR);
84
+ sessionStorage.removeItem(ModeToggle.MODE_KEY);
85
+ }
86
+
87
+ {%- comment -%}
88
+ Notify another plugins that the theme mode has changed
89
+ {%- endcomment -%}
90
+ notify() {
91
+ window.postMessage(
92
+ {
93
+ direction: ModeToggle.ID,
94
+ message: this.modeStatus
95
+ },
96
+ '*'
97
+ );
98
+ }
99
+
100
+ flipMode() {
101
+ if (this.hasMode) {
102
+ this.clearMode();
103
+ } else {
104
+ if (this.isPreferDark) {
105
+ this.setLight();
106
+ } else {
107
+ this.setDark();
108
+ }
109
+ }
110
+
111
+ this.notify();
112
+ }
113
+ }
114
+
115
+ const modeToggle = new ModeToggle();
116
+ </script>
@@ -0,0 +1,10 @@
1
+ {% comment %}
2
+ Remove the line number of the code snippet.
3
+ {% endcomment %}
4
+
5
+ {% assign content = include.content %}
6
+
7
+ {% if content contains '<td class="rouge-gutter gl"><pre class="lineno">' %}
8
+ {% assign content = content | replace: '<td class="rouge-gutter gl"><pre class="lineno">', '<!-- <td class="rouge-gutter gl"><pre class="lineno">'%}
9
+ {% assign content = content | replace: '</td><td class="rouge-code">', '</td> --><td class="rouge-code">' %}
10
+ {% endif %}
@@ -0,0 +1,24 @@
1
+ <aside
2
+ id="notification"
3
+ class="toast"
4
+ role="alert"
5
+ aria-live="assertive"
6
+ aria-atomic="true"
7
+ data-bs-animation="true"
8
+ data-bs-autohide="false"
9
+ >
10
+ <div class="toast-header">
11
+ <button
12
+ type="button"
13
+ class="btn-close ms-auto"
14
+ data-bs-dismiss="toast"
15
+ aria-label="Close"
16
+ ></button>
17
+ </div>
18
+ <div class="toast-body text-center pt-0">
19
+ <p class="px-2 mb-3">{{ site.data.locales[include.lang].notification.update_found }}</p>
20
+ <button type="button" class="btn btn-primary" aria-label="Update">
21
+ {{ site.data.locales[include.lang].notification.update }}
22
+ </button>
23
+ </div>
24
+ </aside>