jekyll-theme-abd3lraouf 5.2.3

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