jekyll-theme-resuchirp 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +94 -0
  4. data/_data/authors.yml +17 -0
  5. data/_data/contact.yml +28 -0
  6. data/_data/locales/ar.yml +91 -0
  7. data/_data/locales/bg-BG.yml +81 -0
  8. data/_data/locales/cs-CZ.yml +89 -0
  9. data/_data/locales/de-DE.yml +80 -0
  10. data/_data/locales/el-GR.yml +91 -0
  11. data/_data/locales/en.yml +91 -0
  12. data/_data/locales/es-ES.yml +77 -0
  13. data/_data/locales/fi-FI.yml +90 -0
  14. data/_data/locales/fr-FR.yml +77 -0
  15. data/_data/locales/hu-HU.yml +79 -0
  16. data/_data/locales/id-ID.yml +77 -0
  17. data/_data/locales/it-IT.yml +90 -0
  18. data/_data/locales/ko-KR.yml +84 -0
  19. data/_data/locales/my-MM.yml +77 -0
  20. data/_data/locales/pt-BR.yml +77 -0
  21. data/_data/locales/ru-RU.yml +77 -0
  22. data/_data/locales/sl-SI.yml +91 -0
  23. data/_data/locales/sv-SE.yml +91 -0
  24. data/_data/locales/th.yml +91 -0
  25. data/_data/locales/tr-TR.yml +77 -0
  26. data/_data/locales/uk-UA.yml +77 -0
  27. data/_data/locales/vi-VN.yml +76 -0
  28. data/_data/locales/zh-CN.yml +83 -0
  29. data/_data/locales/zh-TW.yml +83 -0
  30. data/_data/origin/basic.yml +48 -0
  31. data/_data/origin/cors.yml +59 -0
  32. data/_data/share.yml +25 -0
  33. data/_includes/comments/disqus.html +49 -0
  34. data/_includes/comments/giscus.html +64 -0
  35. data/_includes/comments/utterances.html +51 -0
  36. data/_includes/comments.html +5 -0
  37. data/_includes/datetime.html +19 -0
  38. data/_includes/embed/twitch.html +4 -0
  39. data/_includes/embed/youtube.html +6 -0
  40. data/_includes/favicons.html +17 -0
  41. data/_includes/footer.html +34 -0
  42. data/_includes/google-analytics.html +14 -0
  43. data/_includes/head.html +95 -0
  44. data/_includes/js-selector.html +106 -0
  45. data/_includes/jsdelivr-combine.html +26 -0
  46. data/_includes/lang.html +8 -0
  47. data/_includes/language-alias.html +70 -0
  48. data/_includes/mermaid.html +58 -0
  49. data/_includes/metadata-hook.html +1 -0
  50. data/_includes/mode-toggle.html +143 -0
  51. data/_includes/no-linenos.html +10 -0
  52. data/_includes/origin-type.html +13 -0
  53. data/_includes/post-nav.html +37 -0
  54. data/_includes/post-paginator.html +89 -0
  55. data/_includes/post-sharing.html +37 -0
  56. data/_includes/read-time.html +37 -0
  57. data/_includes/refactor-content.html +286 -0
  58. data/_includes/related-posts.html +97 -0
  59. data/_includes/search-loader.html +45 -0
  60. data/_includes/search-results.html +10 -0
  61. data/_includes/sidebar.html +104 -0
  62. data/_includes/toc.html +13 -0
  63. data/_includes/topbar.html +70 -0
  64. data/_includes/trending-tags.html +46 -0
  65. data/_includes/update-list.html +39 -0
  66. data/_layouts/archives.html +36 -0
  67. data/_layouts/categories.html +138 -0
  68. data/_layouts/category.html +24 -0
  69. data/_layouts/compress.html +10 -0
  70. data/_layouts/default.html +76 -0
  71. data/_layouts/home.html +110 -0
  72. data/_layouts/page.html +68 -0
  73. data/_layouts/post.html +133 -0
  74. data/_layouts/tag.html +23 -0
  75. data/_layouts/tags.html +22 -0
  76. data/_sass/addon/commons.scss +1578 -0
  77. data/_sass/addon/module.scss +178 -0
  78. data/_sass/addon/syntax.scss +271 -0
  79. data/_sass/addon/variables.scss +27 -0
  80. data/_sass/colors/dark-syntax.scss +87 -0
  81. data/_sass/colors/dark-typography.scss +151 -0
  82. data/_sass/colors/light-syntax.scss +84 -0
  83. data/_sass/colors/light-typography.scss +109 -0
  84. data/_sass/jekyll-theme-chirpy.scss +19 -0
  85. data/_sass/layout/archives.scss +144 -0
  86. data/_sass/layout/categories.scss +83 -0
  87. data/_sass/layout/category-tag.scss +77 -0
  88. data/_sass/layout/home.scss +219 -0
  89. data/_sass/layout/post.scss +414 -0
  90. data/_sass/layout/tags.scss +19 -0
  91. data/_sass/variables-hook.scss +3 -0
  92. data/assets/404.html +16 -0
  93. data/assets/css/style.scss +6 -0
  94. data/assets/feed.xml +61 -0
  95. data/assets/img/favicons/android-chrome-192x192.png +0 -0
  96. data/assets/img/favicons/android-chrome-512x512.png +0 -0
  97. data/assets/img/favicons/apple-touch-icon.png +0 -0
  98. data/assets/img/favicons/browserconfig.xml +13 -0
  99. data/assets/img/favicons/favicon-16x16.png +0 -0
  100. data/assets/img/favicons/favicon-32x32.png +0 -0
  101. data/assets/img/favicons/favicon.ico +0 -0
  102. data/assets/img/favicons/mstile-150x150.png +0 -0
  103. data/assets/img/favicons/site.webmanifest +26 -0
  104. data/assets/js/data/search.json +20 -0
  105. data/assets/js/data/swcache.js +50 -0
  106. data/assets/js/pwa/app.js +47 -0
  107. data/assets/js/pwa/sw.js +90 -0
  108. data/assets/js/pwa/unregister.js +12 -0
  109. data/assets/robots.txt +10 -0
  110. metadata +255 -0
@@ -0,0 +1,106 @@
1
+ <!-- JS selector for site. -->
2
+
3
+ <!-- commons -->
4
+
5
+ {% assign urls = site.data.origin[type].jquery.js
6
+ | append: ','
7
+ | append: site.data.origin[type].bootstrap.js
8
+ | append: ','
9
+ | append: site.data.origin[type].search.js
10
+ %}
11
+
12
+ <!-- layout specified -->
13
+
14
+ {% if page.layout == 'post' or page.layout == 'page' or page.layout == 'home' %}
15
+ {% assign urls = urls | append: ',' | append: site.data.origin[type].lazysizes.js %}
16
+
17
+ {% unless page.layout == 'home' %}
18
+ <!-- image lazy-loading & popup & clipboard -->
19
+ {% assign urls = urls
20
+ | append: ','
21
+ | append: site.data.origin[type]['magnific-popup'].js
22
+ | append: ','
23
+ | append: site.data.origin[type].clipboard.js
24
+ %}
25
+ {% endunless %}
26
+ {% endif %}
27
+
28
+ {% if page.layout == 'home'
29
+ or page.layout == 'post'
30
+ or page.layout == 'archives'
31
+ or page.layout == 'category'
32
+ or page.layout == 'tag'
33
+ %}
34
+ {% assign locale = site.lang | split: '-' | first %}
35
+
36
+ {% assign urls = urls
37
+ | append: ','
38
+ | append: site.data.origin[type].dayjs.js.common
39
+ | append: ','
40
+ | append: site.data.origin[type].dayjs.js.locale
41
+ | replace: ':LOCALE', locale
42
+ | append: ','
43
+ | append: site.data.origin[type].dayjs.js.relativeTime
44
+ | append: ','
45
+ | append: site.data.origin[type].dayjs.js.localizedFormat
46
+ %}
47
+ {% endif %}
48
+
49
+ {% if page.content contains '<h2' or page.content contains '<h3' and site.toc and page.toc %}
50
+ {% assign urls = urls | append: ',' | append: site.data.origin[type].toc.js %}
51
+ {% endif %}
52
+
53
+ {% if page.mermaid %}
54
+ {% assign urls = urls | append: ',' | append: site.data.origin[type].mermaid.js %}
55
+ {% endif %}
56
+
57
+ {% include jsdelivr-combine.html urls=urls %}
58
+
59
+ {% case page.layout %}
60
+ {% when 'home', 'categories', 'post', 'page' %}
61
+ {% assign js = page.layout %}
62
+ {% when 'archives', 'category', 'tag' %}
63
+ {% assign js = 'misc' %}
64
+ {% else %}
65
+ {% assign js = 'commons' %}
66
+ {% endcase %}
67
+
68
+ {% capture script %}/assets/js/dist/{{ js }}.min.js{% endcapture %}
69
+ <script defer src="{{ script | relative_url }}"></script>
70
+
71
+ {% if page.math %}
72
+ <!-- MathJax -->
73
+ <script>
74
+ /* see: <https://docs.mathjax.org/en/latest/options/input/tex.html#tex-options> */
75
+ MathJax = {
76
+ tex: {
77
+ /* start/end delimiter pairs for in-line math */
78
+ inlineMath: [
79
+ ['$', '$'],
80
+ ['\\(', '\\)']
81
+ ],
82
+ /* start/end delimiter pairs for display math */
83
+ displayMath: [
84
+ ['$$', '$$'],
85
+ ['\\[', '\\]']
86
+ ]
87
+ }
88
+ };
89
+ </script>
90
+ <script src="{{ site.data.origin[type].polyfill.js | relative_url }}"></script>
91
+ <script id="MathJax-script" async src="{{ site.data.origin[type].mathjax.js | relative_url }}"></script>
92
+ {% endif %}
93
+
94
+ {% if jekyll.environment == 'production' %}
95
+ <!-- PWA -->
96
+ {% if site.pwa.enabled %}
97
+ <script defer src="{{ '/app.js' | relative_url }}"></script>
98
+ {% else %}
99
+ <script defer src="{{ '/unregister.js' | relative_url }}"></script>
100
+ {% endif %}
101
+
102
+ <!-- GA -->
103
+ {% if site.google_analytics.id != empty and site.google_analytics.id %}
104
+ {% include google-analytics.html %}
105
+ {% endif %}
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,8 @@
1
+ {% comment %}
2
+ Detect appearance language and return it through variable "lang"
3
+ {% endcomment %}
4
+ {% if site.data.locales[site.lang] %}
5
+ {% assign lang = site.lang %}
6
+ {% else %}
7
+ {% assign lang = 'en' %}
8
+ {% 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,58 @@
1
+ <!-- mermaid-js loader -->
2
+ <script type="text/javascript">
3
+ (function () {
4
+ function updateMermaid(event) {
5
+ if (event.source === window && event.data && event.data.direction === ModeToggle.ID) {
6
+ const mode = event.data.message;
7
+
8
+ if (typeof mermaid === 'undefined') {
9
+ return;
10
+ }
11
+
12
+ let expectedTheme = mode === ModeToggle.DARK_MODE ? 'dark' : 'default';
13
+ let config = { theme: expectedTheme };
14
+
15
+ /* Re-render the SVG › <https://github.com/mermaid-js/mermaid/issues/311#issuecomment-332557344> */
16
+ $('.mermaid').each(function () {
17
+ let svgCode = $(this).prev().children().html();
18
+ $(this).removeAttr('data-processed');
19
+ $(this).html(svgCode);
20
+ });
21
+
22
+ mermaid.initialize(config);
23
+ mermaid.init(undefined, '.mermaid');
24
+ }
25
+ }
26
+
27
+ let initTheme = 'default';
28
+ const html = document.documentElement;
29
+
30
+ if (
31
+ (html.hasAttribute('data-mode') && html.getAttribute('data-mode') === 'dark') ||
32
+ (!html.hasAttribute('data-mode') && window.matchMedia('(prefers-color-scheme: dark)').matches)
33
+ ) {
34
+ initTheme = 'dark';
35
+ }
36
+
37
+ let mermaidConf = {
38
+ theme: initTheme /* <default|dark|forest|neutral> */
39
+ };
40
+
41
+ /* Create mermaid tag */
42
+ document.querySelectorAll('pre>code.language-mermaid').forEach((elem) => {
43
+ const svgCode = elem.textContent;
44
+ const backup = elem.parentElement;
45
+ backup.classList.add('unloaded');
46
+ /* create mermaid node */
47
+ let mermaid = document.createElement('pre');
48
+ mermaid.classList.add('mermaid');
49
+ const text = document.createTextNode(svgCode);
50
+ mermaid.appendChild(text);
51
+ backup.after(mermaid);
52
+ });
53
+
54
+ mermaid.initialize(mermaidConf);
55
+
56
+ window.addEventListener('message', updateMermaid);
57
+ })();
58
+ </script>
@@ -0,0 +1 @@
1
+ <!-- A placeholder to allow defining custom metadata -->
@@ -0,0 +1,143 @@
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
+ if (this.hasMode) {
23
+ if (this.isDarkMode) {
24
+ if (!this.isSysDarkPrefer) {
25
+ this.setDark();
26
+ }
27
+ } else {
28
+ if (this.isSysDarkPrefer) {
29
+ this.setLight();
30
+ }
31
+ }
32
+ }
33
+
34
+ let self = this;
35
+
36
+ /* always follow the system prefers */
37
+ this.sysDarkPrefers.addEventListener('change', () => {
38
+ if (self.hasMode) {
39
+ if (self.isDarkMode) {
40
+ if (!self.isSysDarkPrefer) {
41
+ self.setDark();
42
+ }
43
+ } else {
44
+ if (self.isSysDarkPrefer) {
45
+ self.setLight();
46
+ }
47
+ }
48
+
49
+ self.clearMode();
50
+ }
51
+
52
+ self.notify();
53
+ });
54
+ } /* constructor() */
55
+
56
+ get sysDarkPrefers() {
57
+ return window.matchMedia('(prefers-color-scheme: dark)');
58
+ }
59
+
60
+ get isSysDarkPrefer() {
61
+ return this.sysDarkPrefers.matches;
62
+ }
63
+
64
+ get isDarkMode() {
65
+ return this.mode === ModeToggle.DARK_MODE;
66
+ }
67
+
68
+ get isLightMode() {
69
+ return this.mode === ModeToggle.LIGHT_MODE;
70
+ }
71
+
72
+ get hasMode() {
73
+ return this.mode != null;
74
+ }
75
+
76
+ get mode() {
77
+ return sessionStorage.getItem(ModeToggle.MODE_KEY);
78
+ }
79
+
80
+ /* get the current mode on screen */
81
+ get modeStatus() {
82
+ if (this.isDarkMode || (!this.hasMode && this.isSysDarkPrefer)) {
83
+ return ModeToggle.DARK_MODE;
84
+ } else {
85
+ return ModeToggle.LIGHT_MODE;
86
+ }
87
+ }
88
+
89
+ setDark() {
90
+ document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.DARK_MODE);
91
+ sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
92
+ }
93
+
94
+ setLight() {
95
+ document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.LIGHT_MODE);
96
+ sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
97
+ }
98
+
99
+ clearMode() {
100
+ document.documentElement.removeAttribute(ModeToggle.MODE_ATTR);
101
+ sessionStorage.removeItem(ModeToggle.MODE_KEY);
102
+ }
103
+
104
+ /* Notify another plugins that the theme mode has changed */
105
+ notify() {
106
+ window.postMessage(
107
+ {
108
+ direction: ModeToggle.ID,
109
+ message: this.modeStatus
110
+ },
111
+ '*'
112
+ );
113
+ }
114
+
115
+ flipMode() {
116
+ if (this.hasMode) {
117
+ if (this.isSysDarkPrefer) {
118
+ if (this.isLightMode) {
119
+ this.clearMode();
120
+ } else {
121
+ this.setLight();
122
+ }
123
+ } else {
124
+ if (this.isDarkMode) {
125
+ this.clearMode();
126
+ } else {
127
+ this.setDark();
128
+ }
129
+ }
130
+ } else {
131
+ if (this.isSysDarkPrefer) {
132
+ this.setLight();
133
+ } else {
134
+ this.setDark();
135
+ }
136
+ }
137
+
138
+ this.notify();
139
+ } /* flipMode() */
140
+ } /* ModeToggle */
141
+
142
+ const modeToggle = new ModeToggle();
143
+ </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,13 @@
1
+ {% comment %} Site static assets origin type {% endcomment %}
2
+
3
+ {% assign type = 'cors' %}
4
+
5
+ {% if site.assets.self_host.enabled %}
6
+ {% if site.assets.self_host.env %}
7
+ {% if site.assets.self_host.env == jekyll.environment %}
8
+ {% assign type = 'basic' %}
9
+ {% endif %}
10
+ {% else %}
11
+ {% assign type = 'basic' %}
12
+ {% endif %}
13
+ {% endif %}
@@ -0,0 +1,37 @@
1
+ <!-- Navigation buttons at the bottom of the post. -->
2
+
3
+ <div class="post-navigation d-flex justify-content-between">
4
+ {% if page.previous.url %}
5
+ <a
6
+ href="{{ site.baseurl }}{{ page.previous.url }}"
7
+ class="btn btn-outline-primary"
8
+ prompt="{{ site.data.locales[include.lang].post.button.previous }}"
9
+ >
10
+ <p>{{ page.previous.title }}</p>
11
+ </a>
12
+ {% else %}
13
+ <div
14
+ class="btn btn-outline-primary disabled"
15
+ prompt="{{ site.data.locales[include.lang].post.button.previous }}"
16
+ >
17
+ <p>-</p>
18
+ </div>
19
+ {% endif %}
20
+
21
+ {% if page.next.url %}
22
+ <a
23
+ href="{{ site.baseurl }}{{page.next.url}}"
24
+ class="btn btn-outline-primary"
25
+ prompt="{{ site.data.locales[include.lang].post.button.next }}"
26
+ >
27
+ <p>{{ page.next.title }}</p>
28
+ </a>
29
+ {% else %}
30
+ <div
31
+ class="btn btn-outline-primary disabled"
32
+ prompt="{{ site.data.locales[include.lang].post.button.next }}"
33
+ >
34
+ <p>-</p>
35
+ </div>
36
+ {% endif %}
37
+ </div>
@@ -0,0 +1,89 @@
1
+ <!-- The paginator for post list on HomgPage. -->
2
+
3
+ <ul class="pagination align-items-center mt-4 mb-1 ps-lg-2">
4
+ <!-- left arrow -->
5
+ {% if paginator.previous_page %}
6
+ {% assign prev_url = paginator.previous_page_path | relative_url %}
7
+ {% else %}
8
+ {% assign prev_url = '#' %}
9
+ {% endif %}
10
+
11
+ <li class="page-item {% unless paginator.previous_page %}disabled{% endunless %}">
12
+ <a class="page-link btn-box-shadow" href="{{ prev_url }}" aria-label="previous-page">
13
+ <i class="fas fa-angle-left"></i>
14
+ </a>
15
+ </li>
16
+
17
+ <!-- page numbers -->
18
+ {% assign left_ellipsis = false %}
19
+ {% assign right_ellipsis = false %}
20
+
21
+ {% for i in (1..paginator.total_pages) %}
22
+ {% assign pre = paginator.page | minus: 1 %}
23
+ {% assign next = paginator.page | plus: 1 %}
24
+ {% assign pre_less = pre | minus: 1 %}
25
+ {% assign next_more = next | plus: 1 %}
26
+ {% assign show = false %}
27
+
28
+ {% if paginator.page == 1 %}
29
+ {% if i <= 3 or i == paginator.total_pages %}
30
+ {% assign show = true %}
31
+ {% endif %}
32
+ {% elsif paginator.page == paginator.total_pages %}
33
+ {% if i == 1 or i >= pre_less %}
34
+ {% assign show = true %}
35
+ {% endif %}
36
+ {% else %}
37
+ {% if i == 1 or i == paginator.total_pages %}
38
+ {% assign show = true %}
39
+ {% elsif i >= pre and i <= next %}
40
+ {% assign show = true %}
41
+ {% endif %}
42
+ {% endif %}
43
+
44
+ {% if show %}
45
+ <!-- show number -->
46
+ <li class="page-item {% if i == paginator.page %} active{% endif %}">
47
+ <a
48
+ class="page-link btn-box-shadow"
49
+ href="{% if i > 1 %}{{ site.paginate_path | replace: ':num', i | relative_url }}{% else %}{{ '/' | relative_url }}{% endif %}"
50
+ >
51
+ {{- i -}}
52
+ </a>
53
+ </li>
54
+ {% else %}
55
+ <!-- hide number -->
56
+ {% if i < pre and left_ellipsis == false %}
57
+ <li class="page-item disabled">
58
+ <span class="page-link btn-box-shadow">...</span>
59
+ </li>
60
+ {% assign left_ellipsis = true %}
61
+ {% elsif i > next and right_ellipsis == false %}
62
+ <li class="page-item disabled">
63
+ <span class="page-link btn-box-shadow">...</span>
64
+ </li>
65
+ {% assign right_ellipsis = true %}
66
+ {% endif %}
67
+ {% endif %}
68
+ {% endfor %}
69
+
70
+ <!-- mobile pagination -->
71
+ <li class="page-index align-middle">
72
+ <span>{{ paginator.page }}</span>
73
+ <span class="text-muted">/ {{ paginator.total_pages }}</span>
74
+ </li>
75
+
76
+ <!-- right arrow -->
77
+ {% if paginator.next_page_path %}
78
+ {% assign next_url = paginator.next_page_path | relative_url %}
79
+ {% else %}
80
+ {% assign next_url = '#' %}
81
+ {% endif %}
82
+
83
+ <li class="page-item {% unless paginator.next_page_path %}disabled{% endunless %}">
84
+ <a class="page-link btn-box-shadow" href="{{ next_url }}" aria-label="next-page">
85
+ <i class="fas fa-angle-right"></i>
86
+ </a>
87
+ </li>
88
+ </ul>
89
+ <!-- .pagination -->
@@ -0,0 +1,37 @@
1
+ <!-- Post sharing snippet -->
2
+
3
+ <div class="share-wrapper">
4
+ <span class="share-label text-muted me-1">{{ site.data.locales[include.lang].post.share }}</span>
5
+ <span class="share-icons">
6
+ {% capture title %}{{ page.title }} - {{ site.title }}{% endcapture %}
7
+ {% assign title = title | uri_escape %}
8
+ {% assign url = page.url | absolute_url | url_encode %}
9
+
10
+ {% for share in site.data.share.platforms %}
11
+ {% assign link = share.link | replace: 'TITLE', title | replace: 'URL', url %}
12
+ <a
13
+ href="{{ link }}"
14
+ data-bs-toggle="tooltip"
15
+ data-bs-placement="top"
16
+ title="{{ share.type }}"
17
+ target="_blank"
18
+ rel="noopener"
19
+ aria-label="{{ share.type }}"
20
+ >
21
+ <i class="fa-fw {{ share.icon }}"></i>
22
+ </a>
23
+ {% endfor %}
24
+
25
+ <button
26
+ id="copy-link"
27
+ aria-label="Copy link"
28
+ class="btn small"
29
+ data-bs-toggle="tooltip"
30
+ data-bs-placement="top"
31
+ title="{{ site.data.locales[include.lang].post.button.share_link.title }}"
32
+ data-title-succeed="{{ site.data.locales[include.lang].post.button.share_link.succeed }}"
33
+ >
34
+ <i class="fa-fw fas fa-link pe-none"></i>
35
+ </button>
36
+ </span>
37
+ </div>
@@ -0,0 +1,37 @@
1
+ <!-- Calculate the post's reading time, and display the word count in tooltip -->
2
+
3
+ {% assign words = include.content | strip_html | number_of_words: 'auto' %}
4
+
5
+ <!-- words per minute -->
6
+
7
+ {% assign wpm = 180 %}
8
+ {% assign min_time = 1 %}
9
+
10
+ {% assign read_time = words | divided_by: wpm %}
11
+
12
+ {% unless read_time > 0 %}
13
+ {% assign read_time = min_time %}
14
+ {% endunless %}
15
+
16
+ {% capture read_prompt %}
17
+ {{- site.data.locales[include.lang].post.read_time.prompt -}}
18
+ {% endcapture %}
19
+
20
+ <!-- return element -->
21
+ <span
22
+ class="readtime"
23
+ data-bs-toggle="tooltip"
24
+ data-bs-placement="bottom"
25
+ title="{{ words }} {{ site.data.locales[include.lang].post.words }}"
26
+ >
27
+ <em>
28
+ {{- read_time -}}
29
+ {{ ' ' }}
30
+ {{- site.data.locales[include.lang].post.read_time.unit -}}
31
+ </em>
32
+ {%- if include.prompt -%}
33
+ {%- assign _prompt_words = read_prompt | number_of_words: 'auto' -%}
34
+ {%- unless _prompt_words > 1 -%}{{ ' ' }}{%- endunless -%}
35
+ {{ read_prompt }}
36
+ {%- endif -%}
37
+ </span>