hexo-theme-shokax 0.4.6-dev6 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. package/CODE_OF_CONDUCT.md +128 -128
  2. package/CONTRIBUTING.md +58 -58
  3. package/LICENSE +660 -660
  4. package/LICENSE-shoka +21 -21
  5. package/README.md +76 -99
  6. package/README_en.MD +75 -91
  7. package/UsageRestrictions.md +25 -25
  8. package/_config.yml +381 -381
  9. package/_images.yml +9 -9
  10. package/eslint.config.mjs +55 -55
  11. package/languages/README.md +19 -19
  12. package/languages/default.yml +1 -1
  13. package/languages/en.yml +153 -153
  14. package/languages/ja.yml +153 -153
  15. package/languages/zh-CN.yml +153 -153
  16. package/languages/zh-HK.yml +153 -153
  17. package/languages/zh-TW.yml +153 -153
  18. package/layout/_alternate/atom.ejs +30 -30
  19. package/layout/_alternate/json.ejs +16 -16
  20. package/layout/_alternate/rss.ejs +34 -34
  21. package/layout/_mixin/breadcrumb.pug +33 -33
  22. package/layout/_mixin/card.pug +38 -38
  23. package/layout/_mixin/comment.pug +6 -6
  24. package/layout/_mixin/postmeta.pug +29 -29
  25. package/layout/_mixin/segment.pug +35 -35
  26. package/layout/_mixin/sidebar.pug +40 -40
  27. package/layout/_mixin/widgets.pug +28 -28
  28. package/layout/_partials/footer.pug +43 -43
  29. package/layout/_partials/head/head.pug +55 -55
  30. package/layout/_partials/head/head_com.pug +24 -24
  31. package/layout/_partials/head/pwa.pug +18 -18
  32. package/layout/_partials/header.pug +18 -18
  33. package/layout/_partials/layout.pug +140 -140
  34. package/layout/_partials/loading.pug +13 -13
  35. package/layout/_partials/pagination.pug +4 -4
  36. package/layout/_partials/post/copyright.pug +20 -20
  37. package/layout/_partials/post/footer.pug +17 -17
  38. package/layout/_partials/post/nav.pug +13 -13
  39. package/layout/_partials/post/post.pug +41 -41
  40. package/layout/_partials/post/reward.pug +18 -18
  41. package/layout/_partials/sidebar/menu.pug +37 -37
  42. package/layout/_partials/sidebar/overview.pug +42 -42
  43. package/layout/_partials/third-party/baidu-analytics.pug +11 -11
  44. package/layout/_partials/third-party/clarity.pug +8 -8
  45. package/layout/_partials/third-party/google-analytics.pug +9 -9
  46. package/layout/archive.pug +118 -118
  47. package/layout/category.pug +59 -59
  48. package/layout/index.pug +33 -33
  49. package/layout/page.pug +55 -55
  50. package/layout/post.pug +36 -36
  51. package/layout/tag.pug +43 -43
  52. package/package.json +72 -72
  53. package/scripts/filters/locals.js +52 -0
  54. package/scripts/filters/post.js +5 -0
  55. package/scripts/generaters/archive.js +133 -0
  56. package/scripts/generaters/config.js +51 -0
  57. package/scripts/generaters/images.js +23 -0
  58. package/scripts/generaters/index.js +107 -0
  59. package/scripts/generaters/pages.js +15 -0
  60. package/scripts/generaters/script.js +156 -0
  61. package/scripts/helpers/asset.js +73 -0
  62. package/scripts/helpers/engine.js +177 -0
  63. package/scripts/helpers/list_categories.js +80 -0
  64. package/scripts/helpers/summary_ai.js +107 -0
  65. package/scripts/helpers/symbols_count_time.js +69 -0
  66. package/scripts/plugin/check.js +32 -0
  67. package/scripts/plugin/index.js +81 -0
  68. package/scripts/plugin/lib/injects-point.js +20 -0
  69. package/scripts/plugin/lib/injects.js +89 -0
  70. package/scripts/tags/links.js +44 -0
  71. package/scripts/tags/media.js +19 -0
  72. package/scripts/utils.js +13 -0
  73. package/source/assets/algolia_logo.svg +9 -9
  74. package/source/assets/logo.svg +16 -16
  75. package/source/css/_colors.styl +207 -207
  76. package/source/css/_common/components/components.styl +6 -6
  77. package/source/css/_common/components/highlight/highlight.styl +357 -357
  78. package/source/css/_common/components/highlight/operation.styl +21 -21
  79. package/source/css/_common/components/pages/collapse.styl +119 -119
  80. package/source/css/_common/components/pages/home.styl +391 -391
  81. package/source/css/_common/components/pages/pages.styl +56 -56
  82. package/source/css/_common/components/pages/tag-cloud.styl +12 -12
  83. package/source/css/_common/components/post/breadcrumb.styl +39 -39
  84. package/source/css/_common/components/post/copyright.styl +41 -41
  85. package/source/css/_common/components/post/expand.styl +263 -263
  86. package/source/css/_common/components/post/footer.styl +11 -11
  87. package/source/css/_common/components/post/header.styl +79 -79
  88. package/source/css/_common/components/post/nav.styl +64 -64
  89. package/source/css/_common/components/post/post.styl +29 -29
  90. package/source/css/_common/components/post/reward.styl +50 -50
  91. package/source/css/_common/components/post/rtl.styl +12 -12
  92. package/source/css/_common/components/post/tags.styl +39 -39
  93. package/source/css/_common/components/tags/collapse.styl +72 -72
  94. package/source/css/_common/components/tags/container.styl +49 -49
  95. package/source/css/_common/components/tags/label.styl +12 -12
  96. package/source/css/_common/components/tags/links.styl +77 -77
  97. package/source/css/_common/components/tags/list.styl +131 -131
  98. package/source/css/_common/components/tags/note.styl +70 -70
  99. package/source/css/_common/components/tags/player.styl +361 -361
  100. package/source/css/_common/components/tags/quiz.styl +200 -200
  101. package/source/css/_common/components/tags/tabs.styl +89 -89
  102. package/source/css/_common/components/tags/tags.styl +9 -9
  103. package/source/css/_common/components/third-party/loading.styl +222 -222
  104. package/source/css/_common/components/third-party/mermaid/class.styl +90 -90
  105. package/source/css/_common/components/third-party/mermaid/flowchart.styl +72 -72
  106. package/source/css/_common/components/third-party/mermaid/gantt.styl +251 -251
  107. package/source/css/_common/components/third-party/mermaid/git.styl +7 -7
  108. package/source/css/_common/components/third-party/mermaid/mermaid.styl +37 -37
  109. package/source/css/_common/components/third-party/mermaid/pie.styl +9 -9
  110. package/source/css/_common/components/third-party/mermaid/sequence.styl +95 -95
  111. package/source/css/_common/components/third-party/mermaid/state.styl +130 -130
  112. package/source/css/_common/components/third-party/pace.styl +18 -18
  113. package/source/css/_common/components/third-party/search.styl +167 -167
  114. package/source/css/_common/components/third-party/theme.styl +151 -151
  115. package/source/css/_common/components/third-party/third-party.styl +22 -22
  116. package/source/css/_common/components/third-party/widgets.styl +57 -57
  117. package/source/css/_common/outline/footer/footer.styl +67 -67
  118. package/source/css/_common/outline/header/brand.styl +77 -77
  119. package/source/css/_common/outline/header/header.styl +20 -20
  120. package/source/css/_common/outline/header/image.styl +85 -85
  121. package/source/css/_common/outline/header/menu.styl +117 -117
  122. package/source/css/_common/outline/header/nav.styl +81 -81
  123. package/source/css/_common/outline/header/right.styl +15 -15
  124. package/source/css/_common/outline/header/tool.styl +207 -207
  125. package/source/css/_common/outline/header/waves.styl +57 -57
  126. package/source/css/_common/outline/mobile.styl +46 -46
  127. package/source/css/_common/outline/outline.styl +78 -78
  128. package/source/css/_common/outline/sidebar/author.styl +59 -59
  129. package/source/css/_common/outline/sidebar/dimmer.styl +23 -23
  130. package/source/css/_common/outline/sidebar/menu.styl +63 -63
  131. package/source/css/_common/outline/sidebar/quick.styl +43 -43
  132. package/source/css/_common/outline/sidebar/related.styl +56 -56
  133. package/source/css/_common/outline/sidebar/sidebar.styl +80 -80
  134. package/source/css/_common/outline/sidebar/social.styl +69 -69
  135. package/source/css/_common/outline/sidebar/state.styl +37 -37
  136. package/source/css/_common/outline/sidebar/tab.styl +71 -71
  137. package/source/css/_common/outline/sidebar/toc.styl +47 -47
  138. package/source/css/_common/scaffolding/animate.styl +322 -322
  139. package/source/css/_common/scaffolding/base.styl +190 -190
  140. package/source/css/_common/scaffolding/buttons.styl +48 -48
  141. package/source/css/_common/scaffolding/divider.styl +36 -36
  142. package/source/css/_common/scaffolding/iconfont.styl +443 -443
  143. package/source/css/_common/scaffolding/normalize.styl +273 -273
  144. package/source/css/_common/scaffolding/pagination.styl +81 -81
  145. package/source/css/_common/scaffolding/ribbon.styl +38 -38
  146. package/source/css/_common/scaffolding/scaffolding.styl +14 -14
  147. package/source/css/_common/scaffolding/scrollbar.styl +37 -37
  148. package/source/css/_common/scaffolding/tables.styl +50 -50
  149. package/source/css/_common/scaffolding/tip.styl +19 -19
  150. package/source/css/_common/scaffolding/toggles.styl +59 -59
  151. package/source/css/_iconfont.styl +455 -455
  152. package/source/css/_mixins.styl +148 -148
  153. package/source/css/_variables.styl +89 -89
  154. package/source/css/app.styl +41 -41
  155. package/source/css/mermaid.styl +5 -5
  156. package/source/css/optimize.styl +5 -5
  157. package/source/js/_app/components/comments.ts +88 -88
  158. package/source/js/_app/components/sidebar.ts +239 -239
  159. package/source/js/_app/components/tcomments.ts +54 -54
  160. package/source/js/_app/globals/globalVars.ts +99 -99
  161. package/source/js/_app/globals/handles.ts +124 -124
  162. package/source/js/_app/globals/themeColor.ts +63 -63
  163. package/source/js/_app/globals/thirdparty.ts +63 -63
  164. package/source/js/_app/globals/tools.ts +75 -75
  165. package/source/js/_app/library/anime.ts +110 -110
  166. package/source/js/_app/library/declare.d.ts +128 -128
  167. package/source/js/_app/library/dom.ts +28 -28
  168. package/source/js/_app/library/loadFile.ts +47 -47
  169. package/source/js/_app/library/proto.ts +137 -137
  170. package/source/js/_app/library/scriptPjax.ts +72 -72
  171. package/source/js/_app/library/storage.ts +12 -12
  172. package/source/js/_app/library/vue.ts +49 -49
  173. package/source/js/_app/page/common.ts +43 -43
  174. package/source/js/_app/page/fancybox.ts +72 -72
  175. package/source/js/_app/page/post.ts +266 -266
  176. package/source/js/_app/page/search.ts +115 -115
  177. package/source/js/_app/page/tab.ts +60 -60
  178. package/source/js/_app/pjax/domInit.ts +97 -97
  179. package/source/js/_app/pjax/refresh.ts +140 -140
  180. package/source/js/_app/pjax/siteInit.ts +106 -106
  181. package/source/js/_app/player.ts +798 -798
  182. package/toolbox/compiler.mjs +10 -6
  183. package/toolbox/hoistdep.mjs +5 -5
  184. package/toolbox/lib.mjs +63 -63
  185. package/index.html +0 -231
  186. package/meta.json +0 -6431
@@ -1,266 +1,266 @@
1
- import { $dom } from '../library/dom'
2
- import { postFancybox } from './fancybox'
3
- import { clipBoard, showtip } from '../globals/tools'
4
- import { BODY } from '../globals/globalVars'
5
- import { pageScroll, transition } from '../library/anime'
6
- import { mediaPlayer } from '../player'
7
- import { getDisplay, setDisplay, wrapObject } from '../library/proto'
8
-
9
- export const postBeauty = () => {
10
- if (!document.querySelector('.md')) { return }
11
-
12
- if (__shokax_fancybox__) {
13
- postFancybox('.post.block')
14
- }
15
-
16
- (document.querySelector('.post.block') as HTMLTextAreaElement).oncopy = (event) => {
17
- showtip(LOCAL.copyright)
18
-
19
- if (LOCAL.nocopy) {
20
- event.preventDefault()
21
- return
22
- }
23
-
24
- const copyright = document.getElementById('copyright')
25
- if (window.getSelection().toString().length > 30 && copyright) {
26
- event.preventDefault()
27
- const author = '# ' + (copyright.querySelector('.author') as HTMLElement).innerText
28
- const link = '# ' + (copyright.querySelector('.link') as HTMLElement).innerText
29
- const license = '# ' + (copyright.querySelector('.license') as HTMLElement).innerText
30
- const htmlData = author + '<br>' + link + '<br>' + license + '<br><br>' + window.getSelection().toString().replace(/\r\n/g, '<br>')
31
-
32
- const textData = author + '\n' + link + '\n' + license + '\n\n' + window.getSelection().toString().replace(/\r\n/g, '\n')
33
- if (event.clipboardData) {
34
- event.clipboardData.setData('text/html', htmlData)
35
- event.clipboardData.setData('text/plain', textData)
36
- } else {
37
- // @ts-ignore
38
- if (window.clipboardData) {
39
- // @ts-ignore
40
- return window.clipboardData.setData('text', textData)
41
- }
42
- }
43
- }
44
- }
45
-
46
- $dom.each('li ruby', (element) => {
47
- let parent = element.parentNode
48
- // @ts-ignore
49
- if (element.parentNode.tagName !== 'LI') {
50
- parent = element.parentNode.parentNode
51
- }
52
- parent.addClass('ruby')
53
- })
54
-
55
- $dom.each('ol[start]', (element) => {
56
- // @ts-ignore
57
- element.style.counterReset = 'counter ' + parseInt(element.getAttribute('start') - 1)
58
- })
59
-
60
- $dom.each('.md table', (element) => {
61
- wrapObject(element, {
62
- className: 'table-container'
63
- })
64
- })
65
-
66
- $dom.each('.highlight > .table-container', (element) => {
67
- element.className = 'code-container'
68
- })
69
-
70
- $dom.each('figure.highlight', (element) => {
71
- const code_container = element.querySelector('.code-container') as HTMLElement
72
- const caption = element.querySelector('figcaption')
73
-
74
- element.insertAdjacentHTML('beforeend', '<div class="operation"><span class="breakline-btn"><i class="ic i-align-left"></i></span><span class="copy-btn"><i class="ic i-clipboard"></i></span><span class="fullscreen-btn"><i class="ic i-expand"></i></span></div>')
75
-
76
- const copyBtn = element.querySelector('.copy-btn')
77
- if (LOCAL.nocopy) {
78
- copyBtn.remove()
79
- } else {
80
- copyBtn.addEventListener('click', (event) => {
81
- const target = <HTMLElement>event.currentTarget
82
- let comma = ''; let code = ''
83
- code_container.find('pre').forEach((line) => {
84
- code += comma + line.innerText
85
- comma = '\n'
86
- })
87
-
88
- clipBoard(code, (result) => {
89
- target.querySelector('.ic').className = result ? 'ic i-check' : 'ic i-times'
90
- target.blur()
91
- showtip(LOCAL.copyright)
92
- })
93
- }, { passive: true })
94
- copyBtn.addEventListener('mouseleave', (event) => {
95
- setTimeout(() => {
96
- (event.target as HTMLElement).querySelector('.ic').className = 'ic i-clipboard'
97
- }, 1000)
98
- })
99
- }
100
-
101
- const breakBtn = element.querySelector('.breakline-btn')
102
- breakBtn.addEventListener('click', (event) => {
103
- const target = event.currentTarget as HTMLElement
104
- if (element.hasClass('breakline')) {
105
- element.removeClass('breakline')
106
- target.querySelector('.ic').className = 'ic i-align-left'
107
- } else {
108
- element.addClass('breakline')
109
- target.querySelector('.ic').className = 'ic i-align-justify'
110
- }
111
- })
112
-
113
- const fullscreenBtn = element.querySelector('.fullscreen-btn')
114
- const removeFullscreen = () => {
115
- element.removeClass('fullscreen')
116
- element.scrollTop = 0
117
- BODY.removeClass('fullscreen')
118
- fullscreenBtn.querySelector('.ic').className = 'ic i-expand'
119
- }
120
- const fullscreenHandle = () => {
121
- if (element.hasClass('fullscreen')) {
122
- removeFullscreen()
123
- if (code_container && code_container.find('tr').length > 15) {
124
- const showBtn = code_container.querySelector('.show-btn')
125
- code_container.style.maxHeight = '300px'
126
- showBtn.removeClass('open')
127
- }
128
- pageScroll(element)
129
- } else {
130
- element.addClass('fullscreen')
131
- BODY.addClass('fullscreen')
132
- fullscreenBtn.querySelector('.ic').className = 'ic i-compress'
133
- if (code_container && code_container.find('tr').length > 15) {
134
- const showBtn = code_container.querySelector('.show-btn')
135
- code_container.style.maxHeight = ''
136
- showBtn.addClass('open')
137
- }
138
- }
139
- }
140
- fullscreenBtn.addEventListener('click', fullscreenHandle)
141
- caption && caption.addEventListener('click', fullscreenHandle)
142
-
143
- if (code_container && code_container.find('tr').length > 15) {
144
- code_container.style.maxHeight = '300px'
145
- code_container.insertAdjacentHTML('beforeend', '<div class="show-btn"><i class="ic i-angle-down"></i></div>')
146
- const showBtn = code_container.querySelector('.show-btn')
147
-
148
- const hideCode = () => {
149
- code_container.style.maxHeight = '300px'
150
- showBtn.removeClass('open')
151
- }
152
- const showCode = () => {
153
- code_container.style.maxHeight = ''
154
- showBtn.addClass('open')
155
- }
156
-
157
- showBtn.addEventListener('click', () => {
158
- if (showBtn.hasClass('open')) {
159
- removeFullscreen()
160
- hideCode()
161
- pageScroll(code_container)
162
- } else {
163
- showCode()
164
- }
165
- })
166
- }
167
- })
168
-
169
- $dom.each('pre.mermaid > svg', (element) => {
170
- const temp = <SVGAElement><unknown>element
171
- temp.style.maxWidth = ''
172
- })
173
-
174
- $dom.each('.reward button', (element) => {
175
- element.addEventListener('click', (event) => {
176
- event.preventDefault()
177
- const qr = document.getElementById('qr')
178
- if (getDisplay(qr) === 'inline-flex') {
179
- transition(qr, 0)
180
- } else {
181
- transition(qr, 1, () => {
182
- setDisplay(qr, 'inline-flex')
183
- }) // slideUpBigIn
184
- }
185
- })
186
- })
187
-
188
- // quiz
189
- if (__shokax_quiz__) {
190
- $dom.each('.quiz > ul.options li', (element) => {
191
- element.addEventListener('click', () => {
192
- if (element.hasClass('correct')) {
193
- element.toggleClass('right')
194
- element.parentNode.parentNode.addClass('show')
195
- } else {
196
- element.toggleClass('wrong')
197
- }
198
- })
199
- })
200
-
201
- $dom.each('.quiz > p', (element) => {
202
- element.addEventListener('click', () => {
203
- element.parentNode.toggleClass('show')
204
- })
205
- })
206
-
207
- $dom.each('.quiz > p:first-child', (element) => {
208
- const quiz = element.parentNode
209
- let type = 'choice'
210
- if (quiz.hasClass('true') || quiz.hasClass('false')) {
211
- type = 'true_false'
212
- }
213
- if (quiz.hasClass('multi')) {
214
- type = 'multiple'
215
- }
216
- if (quiz.hasClass('fill')) {
217
- type = 'gap_fill'
218
- }
219
- if (quiz.hasClass('essay')) {
220
- type = 'essay'
221
- }
222
- element.setAttribute('data-type', LOCAL.quiz[type])
223
- })
224
-
225
- $dom.each('.quiz .mistake', (element) => {
226
- element.setAttribute('data-type', LOCAL.quiz.mistake)
227
- })
228
- }
229
-
230
- $dom.each('div.tags a', (element) => {
231
- element.className = ['primary', 'success', 'info', 'warning', 'danger'][Math.floor(Math.random() * 5)]
232
- })
233
-
234
- if (__shokax_player__) {
235
- $dom.each('.md div.player', (element) => {
236
- mediaPlayer(element, {
237
- type: element.getAttribute('data-type'),
238
- mode: 'order',
239
- btns: []
240
- }).player.load(JSON.parse(element.getAttribute('data-src'))).fetch()
241
- })
242
- }
243
-
244
- const angleDown = document.querySelectorAll('.show-btn .i-angle-down')
245
- if (angleDown.length) {
246
- const io = new IntersectionObserver((entries) => {
247
- entries.forEach(entry => {
248
- if (entry.isIntersecting) {
249
- angleDown.forEach(i => {
250
- i.classList.remove('stop-animation')
251
- })
252
- } else {
253
- angleDown.forEach(i => {
254
- i.classList.add('stop-animation')
255
- })
256
- }
257
- })
258
- }, {
259
- root: null,
260
- threshold: 0.5
261
- })
262
- angleDown.forEach(i => {
263
- io.observe(i)
264
- })
265
- }
266
- }
1
+ import { $dom } from '../library/dom'
2
+ import { postFancybox } from './fancybox'
3
+ import { clipBoard, showtip } from '../globals/tools'
4
+ import { BODY } from '../globals/globalVars'
5
+ import { pageScroll, transition } from '../library/anime'
6
+ import { mediaPlayer } from '../player'
7
+ import { getDisplay, setDisplay, wrapObject } from '../library/proto'
8
+
9
+ export const postBeauty = () => {
10
+ if (!document.querySelector('.md')) { return }
11
+
12
+ if (__shokax_fancybox__) {
13
+ postFancybox('.post.block')
14
+ }
15
+
16
+ (document.querySelector('.post.block') as HTMLTextAreaElement).oncopy = (event) => {
17
+ showtip(LOCAL.copyright)
18
+
19
+ if (LOCAL.nocopy) {
20
+ event.preventDefault()
21
+ return
22
+ }
23
+
24
+ const copyright = document.getElementById('copyright')
25
+ if (window.getSelection().toString().length > 30 && copyright) {
26
+ event.preventDefault()
27
+ const author = '# ' + (copyright.querySelector('.author') as HTMLElement).innerText
28
+ const link = '# ' + (copyright.querySelector('.link') as HTMLElement).innerText
29
+ const license = '# ' + (copyright.querySelector('.license') as HTMLElement).innerText
30
+ const htmlData = author + '<br>' + link + '<br>' + license + '<br><br>' + window.getSelection().toString().replace(/\r\n/g, '<br>')
31
+
32
+ const textData = author + '\n' + link + '\n' + license + '\n\n' + window.getSelection().toString().replace(/\r\n/g, '\n')
33
+ if (event.clipboardData) {
34
+ event.clipboardData.setData('text/html', htmlData)
35
+ event.clipboardData.setData('text/plain', textData)
36
+ } else {
37
+ // @ts-ignore
38
+ if (window.clipboardData) {
39
+ // @ts-ignore
40
+ return window.clipboardData.setData('text', textData)
41
+ }
42
+ }
43
+ }
44
+ }
45
+
46
+ $dom.each('li ruby', (element) => {
47
+ let parent = element.parentNode
48
+ // @ts-ignore
49
+ if (element.parentNode.tagName !== 'LI') {
50
+ parent = element.parentNode.parentNode
51
+ }
52
+ parent.addClass('ruby')
53
+ })
54
+
55
+ $dom.each('ol[start]', (element) => {
56
+ // @ts-ignore
57
+ element.style.counterReset = 'counter ' + parseInt(element.getAttribute('start') - 1)
58
+ })
59
+
60
+ $dom.each('.md table', (element) => {
61
+ wrapObject(element, {
62
+ className: 'table-container'
63
+ })
64
+ })
65
+
66
+ $dom.each('.highlight > .table-container', (element) => {
67
+ element.className = 'code-container'
68
+ })
69
+
70
+ $dom.each('figure.highlight', (element) => {
71
+ const code_container = element.querySelector('.code-container') as HTMLElement
72
+ const caption = element.querySelector('figcaption')
73
+
74
+ element.insertAdjacentHTML('beforeend', '<div class="operation"><span class="breakline-btn"><i class="ic i-align-left"></i></span><span class="copy-btn"><i class="ic i-clipboard"></i></span><span class="fullscreen-btn"><i class="ic i-expand"></i></span></div>')
75
+
76
+ const copyBtn = element.querySelector('.copy-btn')
77
+ if (LOCAL.nocopy) {
78
+ copyBtn.remove()
79
+ } else {
80
+ copyBtn.addEventListener('click', (event) => {
81
+ const target = <HTMLElement>event.currentTarget
82
+ let comma = ''; let code = ''
83
+ code_container.find('pre').forEach((line) => {
84
+ code += comma + line.innerText
85
+ comma = '\n'
86
+ })
87
+
88
+ clipBoard(code, (result) => {
89
+ target.querySelector('.ic').className = result ? 'ic i-check' : 'ic i-times'
90
+ target.blur()
91
+ showtip(LOCAL.copyright)
92
+ })
93
+ }, { passive: true })
94
+ copyBtn.addEventListener('mouseleave', (event) => {
95
+ setTimeout(() => {
96
+ (event.target as HTMLElement).querySelector('.ic').className = 'ic i-clipboard'
97
+ }, 1000)
98
+ })
99
+ }
100
+
101
+ const breakBtn = element.querySelector('.breakline-btn')
102
+ breakBtn.addEventListener('click', (event) => {
103
+ const target = event.currentTarget as HTMLElement
104
+ if (element.hasClass('breakline')) {
105
+ element.removeClass('breakline')
106
+ target.querySelector('.ic').className = 'ic i-align-left'
107
+ } else {
108
+ element.addClass('breakline')
109
+ target.querySelector('.ic').className = 'ic i-align-justify'
110
+ }
111
+ })
112
+
113
+ const fullscreenBtn = element.querySelector('.fullscreen-btn')
114
+ const removeFullscreen = () => {
115
+ element.removeClass('fullscreen')
116
+ element.scrollTop = 0
117
+ BODY.removeClass('fullscreen')
118
+ fullscreenBtn.querySelector('.ic').className = 'ic i-expand'
119
+ }
120
+ const fullscreenHandle = () => {
121
+ if (element.hasClass('fullscreen')) {
122
+ removeFullscreen()
123
+ if (code_container && code_container.find('tr').length > 15) {
124
+ const showBtn = code_container.querySelector('.show-btn')
125
+ code_container.style.maxHeight = '300px'
126
+ showBtn.removeClass('open')
127
+ }
128
+ pageScroll(element)
129
+ } else {
130
+ element.addClass('fullscreen')
131
+ BODY.addClass('fullscreen')
132
+ fullscreenBtn.querySelector('.ic').className = 'ic i-compress'
133
+ if (code_container && code_container.find('tr').length > 15) {
134
+ const showBtn = code_container.querySelector('.show-btn')
135
+ code_container.style.maxHeight = ''
136
+ showBtn.addClass('open')
137
+ }
138
+ }
139
+ }
140
+ fullscreenBtn.addEventListener('click', fullscreenHandle)
141
+ caption && caption.addEventListener('click', fullscreenHandle)
142
+
143
+ if (code_container && code_container.find('tr').length > 15) {
144
+ code_container.style.maxHeight = '300px'
145
+ code_container.insertAdjacentHTML('beforeend', '<div class="show-btn"><i class="ic i-angle-down"></i></div>')
146
+ const showBtn = code_container.querySelector('.show-btn')
147
+
148
+ const hideCode = () => {
149
+ code_container.style.maxHeight = '300px'
150
+ showBtn.removeClass('open')
151
+ }
152
+ const showCode = () => {
153
+ code_container.style.maxHeight = ''
154
+ showBtn.addClass('open')
155
+ }
156
+
157
+ showBtn.addEventListener('click', () => {
158
+ if (showBtn.hasClass('open')) {
159
+ removeFullscreen()
160
+ hideCode()
161
+ pageScroll(code_container)
162
+ } else {
163
+ showCode()
164
+ }
165
+ })
166
+ }
167
+ })
168
+
169
+ $dom.each('pre.mermaid > svg', (element) => {
170
+ const temp = <SVGAElement><unknown>element
171
+ temp.style.maxWidth = ''
172
+ })
173
+
174
+ $dom.each('.reward button', (element) => {
175
+ element.addEventListener('click', (event) => {
176
+ event.preventDefault()
177
+ const qr = document.getElementById('qr')
178
+ if (getDisplay(qr) === 'inline-flex') {
179
+ transition(qr, 0)
180
+ } else {
181
+ transition(qr, 1, () => {
182
+ setDisplay(qr, 'inline-flex')
183
+ }) // slideUpBigIn
184
+ }
185
+ })
186
+ })
187
+
188
+ // quiz
189
+ if (__shokax_quiz__) {
190
+ $dom.each('.quiz > ul.options li', (element) => {
191
+ element.addEventListener('click', () => {
192
+ if (element.hasClass('correct')) {
193
+ element.toggleClass('right')
194
+ element.parentNode.parentNode.addClass('show')
195
+ } else {
196
+ element.toggleClass('wrong')
197
+ }
198
+ })
199
+ })
200
+
201
+ $dom.each('.quiz > p', (element) => {
202
+ element.addEventListener('click', () => {
203
+ element.parentNode.toggleClass('show')
204
+ })
205
+ })
206
+
207
+ $dom.each('.quiz > p:first-child', (element) => {
208
+ const quiz = element.parentNode
209
+ let type = 'choice'
210
+ if (quiz.hasClass('true') || quiz.hasClass('false')) {
211
+ type = 'true_false'
212
+ }
213
+ if (quiz.hasClass('multi')) {
214
+ type = 'multiple'
215
+ }
216
+ if (quiz.hasClass('fill')) {
217
+ type = 'gap_fill'
218
+ }
219
+ if (quiz.hasClass('essay')) {
220
+ type = 'essay'
221
+ }
222
+ element.setAttribute('data-type', LOCAL.quiz[type])
223
+ })
224
+
225
+ $dom.each('.quiz .mistake', (element) => {
226
+ element.setAttribute('data-type', LOCAL.quiz.mistake)
227
+ })
228
+ }
229
+
230
+ $dom.each('div.tags a', (element) => {
231
+ element.className = ['primary', 'success', 'info', 'warning', 'danger'][Math.floor(Math.random() * 5)]
232
+ })
233
+
234
+ if (__shokax_player__) {
235
+ $dom.each('.md div.player', (element) => {
236
+ mediaPlayer(element, {
237
+ type: element.getAttribute('data-type'),
238
+ mode: 'order',
239
+ btns: []
240
+ }).player.load(JSON.parse(element.getAttribute('data-src'))).fetch()
241
+ })
242
+ }
243
+
244
+ const angleDown = document.querySelectorAll('.show-btn .i-angle-down')
245
+ if (angleDown.length) {
246
+ const io = new IntersectionObserver((entries) => {
247
+ entries.forEach(entry => {
248
+ if (entry.isIntersecting) {
249
+ angleDown.forEach(i => {
250
+ i.classList.remove('stop-animation')
251
+ })
252
+ } else {
253
+ angleDown.forEach(i => {
254
+ i.classList.add('stop-animation')
255
+ })
256
+ }
257
+ })
258
+ }, {
259
+ root: null,
260
+ threshold: 0.5
261
+ })
262
+ angleDown.forEach(i => {
263
+ io.observe(i)
264
+ })
265
+ }
266
+ }