jekyll-theme-chirpy 4.3.4 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -162
  3. data/_config.yml +44 -18
  4. data/_data/assets/cross_origin.yml +62 -0
  5. data/_data/assets/self_host.yml +51 -0
  6. data/_data/locales/en.yml +3 -15
  7. data/_data/locales/id-ID.yml +2 -14
  8. data/_data/locales/ko-KR.yml +78 -0
  9. data/_data/locales/my-MM.yml +78 -0
  10. data/_data/locales/ru-RU.yml +78 -0
  11. data/_data/locales/uk-UA.yml +78 -0
  12. data/_data/locales/zh-CN.yml +2 -14
  13. data/_data/share.yml +1 -1
  14. data/_includes/assets-origin.html +12 -0
  15. data/_includes/{disqus.html → comments/disqus.html} +4 -4
  16. data/_includes/comments/giscus.html +56 -0
  17. data/_includes/comments/utterances.html +51 -0
  18. data/_includes/comments.html +5 -0
  19. data/_includes/footer.html +1 -1
  20. data/_includes/head.html +35 -20
  21. data/_includes/js-selector.html +43 -11
  22. data/_includes/jsdelivr-combine.html +32 -0
  23. data/_includes/mermaid.html +31 -3
  24. data/_includes/mode-toggle.html +49 -65
  25. data/_includes/post-sharing.html +2 -2
  26. data/_includes/read-time.html +3 -3
  27. data/_includes/refactor-content.html +160 -36
  28. data/_includes/related-posts.html +1 -1
  29. data/_includes/search-loader.html +1 -1
  30. data/_includes/search-results.html +0 -8
  31. data/_includes/sidebar.html +16 -17
  32. data/_includes/timeago.html +11 -23
  33. data/_includes/toc.html +16 -0
  34. data/_includes/topbar.html +2 -3
  35. data/_includes/trending-tags.html +14 -0
  36. data/_includes/update-list.html +16 -0
  37. data/_layouts/archives.html +5 -7
  38. data/_layouts/category.html +3 -5
  39. data/_layouts/default.html +10 -4
  40. data/_layouts/home.html +14 -11
  41. data/_layouts/page.html +47 -22
  42. data/_layouts/post.html +128 -127
  43. data/_layouts/tag.html +3 -5
  44. data/_sass/addon/commons.scss +276 -290
  45. data/_sass/addon/module.scss +67 -31
  46. data/_sass/addon/syntax.scss +90 -66
  47. data/_sass/addon/variables.scss +7 -7
  48. data/_sass/colors/dark-syntax.scss +4 -4
  49. data/_sass/colors/dark-typography.scss +21 -9
  50. data/_sass/colors/light-syntax.scss +9 -4
  51. data/_sass/colors/light-typography.scss +18 -6
  52. data/_sass/jekyll-theme-chirpy.scss +1 -1
  53. data/_sass/layout/home.scss +6 -2
  54. data/_sass/layout/post.scss +52 -46
  55. data/_tabs/about.md +2 -2
  56. data/assets/404.html +0 -2
  57. data/assets/js/data/search.json +1 -0
  58. data/assets/js/data/swcache.js +11 -20
  59. data/assets/js/dist/categories.min.js +2 -2
  60. data/assets/js/dist/commons.min.js +2 -2
  61. data/assets/js/dist/home.min.js +2 -2
  62. data/assets/js/dist/misc.min.js +6 -0
  63. data/assets/js/dist/page.min.js +2 -2
  64. data/assets/js/dist/post.min.js +2 -2
  65. data/assets/js/dist/pvreport.min.js +2 -2
  66. metadata +16 -6
  67. data/_includes/css-selector.html +0 -15
  68. data/_includes/no-zero-date.html +0 -13
  69. data/_includes/panel.html +0 -59
@@ -2,13 +2,39 @@
2
2
  mermaid-js loader
3
3
  -->
4
4
 
5
- <script src="https://cdn.jsdelivr.net/npm/mermaid@8/dist/mermaid.min.js"></script>
5
+ <script src="{{ site.data.assets[origin].mermaid.js }}"></script>
6
+
6
7
  <script>
7
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
+
8
34
  let initTheme = "default";
9
35
 
10
- if ($("html[mode=dark]").length > 0
11
- || ($("html[mode]").length == 0
36
+ if ($("html[data-mode=dark]").length > 0
37
+ || ($("html[data-mode]").length == 0
12
38
  && window.matchMedia("(prefers-color-scheme: dark)").matches ) ) {
13
39
  initTheme = "dark";
14
40
  }
@@ -25,5 +51,7 @@
25
51
  });
26
52
 
27
53
  mermaid.initialize(mermaidConf);
54
+
55
+ window.addEventListener("message", updateMermaid);
28
56
  });
29
57
  </script>
@@ -2,14 +2,13 @@
2
2
  Switch the mode between dark and light.
3
3
  -->
4
4
 
5
- <i class="mode-toggle fas fa-adjust"></i>
6
-
7
5
  <script type="text/javascript">
8
-
9
6
  class ModeToggle {
10
7
  static get MODE_KEY() { return "mode"; }
8
+ static get MODE_ATTR() { return "data-mode"; }
11
9
  static get DARK_MODE() { return "dark"; }
12
10
  static get LIGHT_MODE() { return "light"; }
11
+ static get ID() { return "mode-toggle"; }
13
12
 
14
13
  constructor() {
15
14
  if (this.hasMode) {
@@ -24,10 +23,10 @@
24
23
  }
25
24
  }
26
25
 
27
- var self = this;
26
+ let self = this;
28
27
 
29
28
  /* always follow the system prefers */
30
- this.sysDarkPrefers.addListener(function() {
29
+ this.sysDarkPrefers.addEventListener("change", () => {
31
30
  if (self.hasMode) {
32
31
  if (self.isDarkMode) {
33
32
  if (!self.isSysDarkPrefer) {
@@ -43,34 +42,19 @@
43
42
  self.clearMode();
44
43
  }
45
44
 
46
- self.updateMermaid();
45
+ self.notify();
46
+
47
47
  });
48
48
 
49
49
  } /* constructor() */
50
50
 
51
-
52
- setDark() {
53
- $('html').attr(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
54
- sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
55
- }
56
-
57
- setLight() {
58
- $('html').attr(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
59
- sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
60
- }
61
-
62
- clearMode() {
63
- $('html').removeAttr(ModeToggle.MODE_KEY);
64
- sessionStorage.removeItem(ModeToggle.MODE_KEY);
65
- }
66
-
67
51
  get sysDarkPrefers() { return window.matchMedia("(prefers-color-scheme: dark)"); }
68
52
 
69
53
  get isSysDarkPrefer() { return this.sysDarkPrefers.matches; }
70
54
 
71
- get isDarkMode() { return this.mode == ModeToggle.DARK_MODE; }
55
+ get isDarkMode() { return this.mode === ModeToggle.DARK_MODE; }
72
56
 
73
- get isLightMode() { return this.mode == ModeToggle.LIGHT_MODE; }
57
+ get isLightMode() { return this.mode === ModeToggle.LIGHT_MODE; }
74
58
 
75
59
  get hasMode() { return this.mode != null; }
76
60
 
@@ -79,67 +63,67 @@
79
63
  /* get the current mode on screen */
80
64
  get modeStatus() {
81
65
  if (this.isDarkMode
82
- || (!this.hasMode && this.isSysDarkPrefer) ) {
66
+ || (!this.hasMode && this.isSysDarkPrefer)) {
83
67
  return ModeToggle.DARK_MODE;
84
68
  } else {
85
69
  return ModeToggle.LIGHT_MODE;
86
70
  }
87
71
  }
88
72
 
89
- updateMermaid() {
90
- if (typeof mermaid !== "undefined") {
91
- let expectedTheme = (this.modeStatus === ModeToggle.DARK_MODE? "dark" : "default");
92
- let config = { theme: expectedTheme };
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
+ }
93
82
 
94
- /* re-render the SVG › <https://github.com/mermaid-js/mermaid/issues/311#issuecomment-332557344> */
95
- $(".mermaid").each(function() {
96
- let svgCode = $(this).prev().children().html();
97
- $(this).removeAttr("data-processed");
98
- $(this).html(svgCode);
99
- });
83
+ clearMode() {
84
+ $('html').removeAttr(ModeToggle.MODE_ATTR);
85
+ sessionStorage.removeItem(ModeToggle.MODE_KEY);
86
+ }
100
87
 
101
- mermaid.initialize(config);
102
- mermaid.init(undefined, ".mermaid");
103
- }
88
+ /* Notify another plugins that the theme mode has changed */
89
+ notify() {
90
+ window.postMessage({
91
+ direction: ModeToggle.ID,
92
+ message: this.modeStatus
93
+ }, "*");
104
94
  }
105
95
 
106
- flipMode() {
107
- if (this.hasMode) {
108
- if (this.isSysDarkPrefer) {
109
- if (this.isLightMode) {
110
- this.clearMode();
111
- } else {
112
- this.setLight();
113
- }
96
+ } /* ModeToggle */
97
+
98
+ const toggle = new ModeToggle();
114
99
 
100
+ function flipMode() {
101
+ if (toggle.hasMode) {
102
+ if (toggle.isSysDarkPrefer) {
103
+ if (toggle.isLightMode) {
104
+ toggle.clearMode();
115
105
  } else {
116
- if (this.isDarkMode) {
117
- this.clearMode();
118
- } else {
119
- this.setDark();
120
- }
106
+ toggle.setLight();
121
107
  }
122
108
 
123
109
  } else {
124
- if (this.isSysDarkPrefer) {
125
- this.setLight();
110
+ if (toggle.isDarkMode) {
111
+ toggle.clearMode();
126
112
  } else {
127
- this.setDark();
113
+ toggle.setDark();
128
114
  }
129
115
  }
130
116
 
131
- this.updateMermaid();
132
-
133
- } /* flipMode() */
134
-
135
- } /* ModeToggle */
136
-
137
- let toggle = new ModeToggle();
138
-
139
- $(".mode-toggle").click(function() {
117
+ } else {
118
+ if (toggle.isSysDarkPrefer) {
119
+ toggle.setLight();
120
+ } else {
121
+ toggle.setDark();
122
+ }
123
+ }
140
124
 
141
- toggle.flipMode();
125
+ toggle.notify();
142
126
 
143
- });
127
+ } /* flipMode() */
144
128
 
145
129
  </script>
@@ -9,7 +9,7 @@
9
9
  {% assign url = page.url | absolute_url %}
10
10
 
11
11
  {% for share in site.data.share.platforms %}
12
- {% assign link = share.link | replace: 'TITLE', title | replace: 'URL', url %}
12
+ {% assign link = share.link | replace: 'TITLE', title | replace: 'URL', url | escape %}
13
13
  <a href="{{ link }}" data-toggle="tooltip" data-placement="top"
14
14
  title="{{ share.type }}" target="_blank" rel="noopener" aria-label="{{ share.type }}">
15
15
  <i class="fa-fw {{ share.icon }}"></i>
@@ -19,7 +19,7 @@
19
19
  <i id="copy-link" class="fa-fw fas fa-link small"
20
20
  data-toggle="tooltip" data-placement="top"
21
21
  title="{{ site.data.locales[lang].post.button.share_link.title }}"
22
- title-succeed="{{ site.data.locales[lang].post.button.share_link.succeed }}">
22
+ data-title-succeed="{{ site.data.locales[lang].post.button.share_link.succeed }}">
23
23
  </i>
24
24
 
25
25
  </span>
@@ -22,9 +22,9 @@
22
22
  <!-- return element -->
23
23
  <span class="readtime" data-toggle="tooltip" data-placement="bottom"
24
24
  title="{{ words }} {{ site.data.locales[lang].post.words }}">
25
- {{- read_time -}}{{" "}}{{- site.data.locales[lang].post.read_time.unit -}}
25
+ <em>{{- read_time -}}{{" "}}{{- site.data.locales[lang].post.read_time.unit -}}</em>
26
26
  {%- if include.prompt -%}
27
- {% assign _prompt_words = read_prompt | number_of_words: 'auto' %}
28
- {% unless _prompt_words > 1 %}{{" "}}{% endunless %}{{ read_prompt }}
27
+ {%- assign _prompt_words = read_prompt | number_of_words: 'auto' -%}
28
+ {%- unless _prompt_words > 1 -%}{{ " " }}{%- endunless -%}{{ read_prompt }}
29
29
  {%- endif -%}
30
30
  </span>
@@ -38,63 +38,101 @@
38
38
  %}
39
39
  {% endif %}
40
40
 
41
-
42
41
  <!-- images -->
43
42
 
44
- {% if _content contains '<img src="' %}
45
-
46
- <!-- add CDN prefix if it exists -->
47
-
48
- {% if site.img_cdn != '' %}
49
- {% assign img_path_replacement = '<img src="' | append: site.img_cdn | append: '/' %}
50
- {% else %}
51
- {% assign img_path_replacement = '<img src="' | append: site.baseurl | append: '/' %}
52
- {% endif %}
53
-
54
- {% assign _content = _content | replace: '<img src="/', img_path_replacement %}
55
-
56
- <!-- lazy-load images <https://github.com/ApoorvSaxena/lozad.js#usage> -->
57
-
58
- {% assign _content = _content | replace: '<img src="', '<img data-proofer-ignore data-src="' %}
59
-
60
- <!-- add image placehoder to prevent layout reflow -->
43
+ {% assign IMG_TAG = '<img ' %}
61
44
 
45
+ {% if _content contains IMG_TAG %}
62
46
  {% assign _img_content = nil %}
47
+ {% assign _img_snippets = _content | split: IMG_TAG %}
63
48
 
64
- {% assign _images = _content | split: '<img ' %}
65
-
66
- {% for _img in _images %}
49
+ {% for _img_snippet in _img_snippets %}
67
50
  {% if forloop.first %}
68
- {% assign _img_content = _img %}
51
+ {% assign _img_content = _img_snippet %}
69
52
  {% continue %}
70
53
  {% endif %}
71
54
 
72
55
  {% assign _width = nil %}
73
56
  {% assign _height = nil %}
74
- {% assign _attrs = _img | split: '>' | first | split: ' ' %}
57
+ {% assign _src = nil %}
58
+
59
+ {% assign _left = _img_snippet | split: '>' | first %}
60
+ {% assign _right = _img_snippet | remove: _left %}
61
+
62
+ {% assign _left = _left | remove: ' /' %}
63
+ {% assign _left = _left | replace: ' w=', ' width=' | replace: ' h=', ' height=' %}
64
+ {% assign _attrs = _left | split: ' ' %}
75
65
 
76
66
  {% for _attr in _attrs %}
77
- {% capture _key %}{{ _attr | split: '=' | first }}{% endcapture %}
78
- {% capture _value %}{{ _attr | split: '=' | last | replace: '"', '' }}{% endcapture %}
67
+ {% assign _pair = _attr | split: '=' %}
68
+ {% if _pair.size < 2 %}
69
+ {% continue %}
70
+ {% endif %}
71
+
72
+ {% capture _key %}{{ _pair | first }}{% endcapture %}
73
+ {% capture _value %}{{ _pair | last | replace: '"', '' }}{% endcapture %}
79
74
 
80
75
  {% case _key %}
81
76
  {% when 'width' %}
82
77
  {% assign _width = _value %}
83
78
  {% when 'height' %}
84
79
  {% assign _height = _value %}
80
+ {% when 'src' %}
81
+ {% assign _src = _value %}
85
82
  {% endcase %}
86
83
 
87
- {% if _width and _height %}
88
- {% capture _svg %}data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 {{_width}} {{_height}}'%3E%3C/svg%3E{% endcapture %}
89
- {% assign _img_content = _img_content | append: '<img src="' | append: _svg | append: '" ' | append: _img %}
84
+ {% if _width and _height and _src %}
90
85
  {% break %}
91
86
  {% endif %}
92
-
93
87
  {% endfor %}
94
88
 
95
- {% unless _width and _height %}
96
- {% assign _img_content = _img_content | append: '<img ' | append: _img %}
97
- {% endunless %}
89
+ {% if _src %}
90
+ {% unless _src contains '://' %}
91
+
92
+ <!-- Add CDN URL -->
93
+ {% if site.img_cdn %}
94
+ {% assign _src_prefix = site.img_cdn %}
95
+ {% else %}
96
+ {% assign _src_prefix = site.baseurl %}
97
+ {% endif %}
98
+
99
+ <!-- Add image path -->
100
+ {% if page.img_path %}
101
+ {% assign _path = page.img_path %}
102
+ {% assign last_char = _path | slice: -1 %}
103
+
104
+ {% unless last_char == '/' %}
105
+ {% assign _path = _path | append: '/' %}
106
+ {% endunless %}
107
+
108
+ {% assign _src_prefix = _src_prefix | append: _path %}
109
+ {% endif %}
110
+
111
+ {% assign _final_src = _src_prefix | append: _src %}
112
+ {% assign _left = _left | replace: _src, _final_src %}
113
+
114
+ {% endunless %}
115
+
116
+ <!-- lazy-load images <https://github.com/ApoorvSaxena/lozad.js#usage> -->
117
+
118
+ {% assign _left = _left | replace: 'src=', 'data-src=' %}
119
+
120
+ {% endif %}
121
+
122
+ <!-- Add SVG placehoder to prevent layout reflow -->
123
+
124
+ {% if _width and _height %}
125
+ {%- capture _svg -%}
126
+ src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 {{ _width }} {{ _height }}'%3E%3C/svg%3E"
127
+ {%- endcapture -%}
128
+
129
+ {% assign _left = _svg | append: ' ' | append: _left %}
130
+ {% endif %}
131
+
132
+ <!-- Bypass the HTML-proofer test -->
133
+ {% assign _left = _left | append: ' data-proofer-ignore' %}
134
+
135
+ {% assign _img_content = _img_content | append: IMG_TAG | append: _left | append: _right %}
98
136
 
99
137
  {% endfor %}
100
138
 
@@ -118,22 +156,22 @@
118
156
  {% assign _left = _snippet | split: '><' | last%}
119
157
 
120
158
  {% if _left contains 'file="' %}
121
- {% assign _text = _left | split: 'file="' | last | split: '"' | first %}
159
+ {% assign _label_text = _left | split: 'file="' | last | split: '"' | first %}
122
160
  {% assign _label_icon = 'far fa-file-code' %}
123
161
  {% else %}
124
162
  {% assign _lang = _left | split: 'language-' | last | split: ' ' | first %}
125
- {% capture _text %}{% include language-alias.html language=_lang %}{% endcapture %}
163
+ {% capture _label_text %}{% include language-alias.html language=_lang %}{% endcapture %}
126
164
  {% assign _label_icon = 'fas fa-code small' %}
127
165
  {% endif %}
128
166
 
129
167
  {% capture _label %}
130
- <span text-data="{{ _text }}"><i class="fa-fw {{ _label_icon }}"></i></span>
168
+ <span data-label-text="{{ _label_text | strip }}"><i class="{{ _label_icon }}"></i></span>
131
169
  {% endcapture %}
132
170
 
133
171
  {% assign _new_content = _new_content | append: _snippet
134
172
  | append: '<div class="code-header">'
135
173
  | append: _label
136
- | append: '<button aria-label="copy" title-succeed="'
174
+ | append: '<button aria-label="copy" data-title-succeed="'
137
175
  | append: site.data.locales[lang].post.button.copy_code.succeed
138
176
  | append: '"><i class="far fa-clipboard"></i></button></div>'
139
177
  | append: '<div class="highlight"><code>'
@@ -147,6 +185,92 @@
147
185
 
148
186
  {% endif %}
149
187
 
188
+ <!-- Create heading anchors -->
189
+
190
+ {% assign heading_levels = '2,3,4,5' | split: ',' %}
191
+ {% assign _heading_content = _content %}
192
+
193
+ {% for level in heading_levels %}
194
+ {% capture mark_start %}<h{{ level }} id="{% endcapture %}
195
+ {% capture mark_end %}</h{{ level }}>{% endcapture %}
196
+
197
+ {% if _heading_content contains mark_start %}
198
+ {% assign _new_content = nil %}
199
+ {% assign heading_snippets = _heading_content | split: mark_start %}
200
+
201
+ {% for snippet in heading_snippets %}
202
+ {% if forloop.first %}
203
+ {% assign _new_content = snippet %}
204
+ {% continue %}
205
+ {% endif %}
206
+
207
+ {% assign id = snippet | split: '"' | first %}
208
+ {% capture anchor %}<a href="#{{ id }}" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>{% endcapture %}
209
+
210
+ {% assign left = snippet | split: mark_end | first %}
211
+ {% assign right = snippet | slice: left.size, snippet.size %}
212
+ {% assign left = left | replace: '">', '"><span class="mr-2">' | append: '</span>' %}
213
+
214
+ {% assign _new_content = _new_content | append: mark_start
215
+ | append: left | append: anchor | append: mark_end | append: right
216
+ %}
217
+
218
+ {% endfor %}
219
+
220
+ {% assign _heading_content = _new_content %}
221
+
222
+ {% endif %}
223
+ {% endfor %}
224
+
225
+ {% assign _content = _heading_content %}
226
+
227
+ <!-- Wrap prompt element of blockquote with the <div> tag -->
228
+
229
+ {% assign blockquote_start = '<blockquote class=' %}
230
+ {% assign blockquote_end = '</blockquote>' %}
231
+ {% assign cls_prefix = 'prompt-' %}
232
+
233
+ {% if _content contains blockquote_start %}
234
+
235
+ {% assign _prompt_content = nil %}
236
+ {% assign _prompt_snippets = _content | split: blockquote_start %}
237
+
238
+ {% for _snippet in _prompt_snippets %}
239
+
240
+ {% if forloop.first %}
241
+ {% assign _prompt_content = _snippet %}
242
+ {% continue %}
243
+ {% endif %}
244
+
245
+ {% assign left = _snippet | split: blockquote_end | first %}
246
+ {% assign right = _snippet | slice: left.size, _snippet.size %}
247
+
248
+ {% assign cls_str = left | split: '>' | first %}
249
+ {% assign cls_array = cls_str | remove: '"' | split: ' ' %}
250
+ {% assign is_prompt = false %}
251
+
252
+ {% for cls in cls_array %}
253
+ {% if cls contains cls_prefix %}
254
+ {% assign is_prompt = true %}
255
+ {% break %}
256
+ {% endif %}
257
+ {% endfor %}
258
+
259
+ {% unless is_prompt %}
260
+ {% assign _prompt_content = _prompt_content | append: blockquote_start | append: _snippet %}
261
+ {% continue %}
262
+ {% endunless %}
263
+
264
+ {% assign left = left | slice: cls_str.size, left.size %}
265
+ {% assign left = cls_str | append: '><div' | append: left | append: '</div>' %}
266
+
267
+ {% assign _prompt_content = _prompt_content | append: blockquote_start | append: left | append: right %}
268
+
269
+ {% endfor %}
270
+
271
+ {% assign _content = _prompt_content %}
272
+
273
+ {% endif %}
150
274
 
151
275
  <!-- return -->
152
276
 
@@ -94,7 +94,7 @@
94
94
  <div class="text-muted small">
95
95
  <p>
96
96
  {% include no-linenos.html content=post.content %}
97
- {{ content | markdownify | strip_html | truncate: 200 }}
97
+ {{ content | markdownify | strip_html | truncate: 200 | escape }}
98
98
  </p>
99
99
  </div>
100
100
  </div>
@@ -16,7 +16,7 @@
16
16
 
17
17
  {% capture not_found %}<p class="mt-5">{{ site.data.locales[lang].search.no_results }}</p>{% endcapture %}
18
18
 
19
- <script src="https://cdn.jsdelivr.net/npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js"></script>
19
+ <script src="{{ site.data.assets[origin].search.js }}"></script>
20
20
 
21
21
  <script>
22
22
  SimpleJekyllSearch({
@@ -4,15 +4,7 @@
4
4
  <div id="search-result-wrapper" class="d-flex justify-content-center unloaded">
5
5
  <div class="col-12 col-sm-11 post-content">
6
6
  <div id="search-hints">
7
- <h4 class="text-muted mb-4">{{ site.data.locales[lang].panel.trending_tags }}</h4>
8
-
9
7
  {% include trending-tags.html %}
10
-
11
- {% for tag in trending_tags %}
12
- {% capture url %}/tags/{{ tag | slugify | url_encode }}/{% endcapture %}
13
- <a class="post-tag" href="{{ url | relative_url }}">{{ tag | replace: '-', ' ' }}</a>
14
- {% endfor %}
15
-
16
8
  </div>
17
9
  <div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
18
10
  </div>
@@ -2,19 +2,19 @@
2
2
  The Side Bar
3
3
  -->
4
4
 
5
- <div id="sidebar" class="d-flex flex-column align-items-end" lang="{{lang}}">
5
+ <div id="sidebar" class="d-flex flex-column align-items-end">
6
6
  <div class="profile-wrapper text-center">
7
7
  <div id="avatar">
8
8
  <a href="{{ '/' | relative_url }}" alt="avatar" class="mx-auto">
9
- {% if site.avatar != '' and site.avatar %}
9
+ {% if site.avatar != empty and site.avatar %}
10
10
  {% capture avatar_url %}
11
- {%- if site.avatar contains '://' -%}
11
+ {% if site.avatar contains '://' %}
12
12
  {{ site.avatar }}
13
- {%- elsif site.img_cdn != '' and site.img_cdn -%}
13
+ {% elsif site.img_cdn != empty and site.img_cdn %}
14
14
  {{ site.avatar | prepend: site.img_cdn }}
15
- {%- else -%}
15
+ {% else %}
16
16
  {{ site.avatar | relative_url }}
17
- {%- endif -%}
17
+ {% endif %}
18
18
  {% endcapture %}
19
19
  <img src="{{ avatar_url }}" alt="avatar" onerror="this.style.display='none'">
20
20
  {% endif %}
@@ -53,6 +53,16 @@
53
53
 
54
54
  <div class="sidebar-bottom mt-auto d-flex flex-wrap justify-content-center align-items-center">
55
55
 
56
+ {% unless site.theme_mode %}
57
+ <button class="mode-toggle btn" aria-label="Switch Mode">
58
+ <i class="fas fa-adjust"></i>
59
+ </button>
60
+
61
+ {% if site.data.contact.size > 0 %}
62
+ <span class="icon-border"></span>
63
+ {% endif %}
64
+ {% endunless %}
65
+
56
66
  {% for entry in site.data.contact %}
57
67
  {% capture url %}
58
68
  {%- if entry.type == 'github' -%}
@@ -71,7 +81,6 @@
71
81
 
72
82
  {% if url %}
73
83
  <a href="{{ url }}" aria-label="{{ entry.type }}"
74
- {% unless site.theme_mode %}class="order-{{ forloop.index | plus: 2 }}"{% endunless %}
75
84
  {% unless entry.noblank %}target="_blank" rel="noopener"{% endunless %}>
76
85
  <i class="{{ entry.icon }}"></i>
77
86
  </a>
@@ -79,16 +88,6 @@
79
88
 
80
89
  {% endfor %}
81
90
 
82
- {% unless site.theme_mode %}
83
- {% if site.data.contact.size > 0 %}
84
- <span class="icon-border order-2"></span>
85
- {% endif %}
86
-
87
- <span id="mode-toggle-wrapper" class="order-1">
88
- {% include mode-toggle.html %}
89
- </span>
90
- {% endunless %}
91
-
92
91
  </div> <!-- .sidebar-bottom -->
93
92
 
94
93
  </div><!-- #sidebar -->
@@ -1,27 +1,15 @@
1
1
  <!--
2
2
  Date format snippet
3
- See: /assets/js/_utils/timeage.js
3
+ See: ${JS_ROOT}/utils/timeago.js
4
4
  -->
5
5
 
6
- {% assign tooltip_df = site.data.locales[lang].date_format.tooltip %}
7
- {% assign post_long_df = site.data.locales[lang].date_format.post.long %}
8
- {% assign post_short_df = site.data.locales[lang].date_format.post.short %}
9
-
10
- {% if include.preposition %}
11
- {{ include.preposition }}
12
- {% endif %}
13
- <span class="timeago {% if include.class %}{{ include.class }}{% endif %}"
14
- {% if include.tooltip %}
15
- data-toggle="tooltip"
16
- data-placement="bottom"
17
- title="{{ include.date | date: tooltip_df }}"
18
- {% endif %}>
19
- {%- assign this_year = site.time | date: "%Y" -%}
20
- {%- assign post_year = include.date | date: "%Y" -%}
21
- {%- if post_year == this_year -%}
22
- {{ include.date | date: post_short_df }}
23
- {%- else -%}
24
- {{ include.date | date: post_long_df }}
25
- {%- endif -%}
26
- <i class="unloaded">{{ include.date | date_to_xmlschema }}</i>
27
- </span>
6
+ <em class="timeago{% if include.class %} {{ include.class }}{% endif %}"
7
+ data-ts="{{ include.date | date: '%s' }}"
8
+ {% if include.tooltip %}
9
+ data-toggle="tooltip" data-placement="bottom" data-tooltip-df="llll"
10
+ {% endif %}
11
+ {% if include.capitalize %}
12
+ data-capitalize="true"
13
+ {% endif %}>
14
+ {{ include.date | date: '%Y-%m-%d' }}
15
+ </em>
@@ -0,0 +1,16 @@
1
+ {% assign enable_toc = false %}
2
+ {% if site.toc and page.toc %}
3
+ {% if page.content contains '<h2' or page.content contains '<h3' %}
4
+ {% assign enable_toc = true %}
5
+ {% endif %}
6
+ {% endif %}
7
+
8
+ {% if enable_toc %}
9
+ <!-- BS-toc.js will be loaded at medium priority -->
10
+ <script src="{{ site.data.assets[origin].bootstrap-toc.js }}"></script>
11
+
12
+ <div id="toc-wrapper" class="pl-0 pr-4 mb-5">
13
+ <div class="panel-heading pl-3 pt-2 mb-2">{{- site.data.locales[lang].panel.toc -}}</div>
14
+ <nav id="toc" data-toggle="toc"></nav>
15
+ </div>
16
+ {% endif %}