hexo-theme-shokax 0.5.0-beta2-dev-ec59668 → 0.5.0-beta2-dev-dffd6cb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/_config.yml +0 -29
- package/layout/_partials/layout.pug +0 -5
- package/layout/page.pug +0 -2
- package/layout/post.pug +0 -2
- package/package.json +4 -5
- package/scripts/generaters/script.js +15 -13
- package/source/js/_app/components/sidebar.ts +4 -2
- package/source/js/_app/globals/globalVars.ts +1 -1
- package/source/js/_app/page/imageviewer.ts +20 -0
- package/source/js/_app/page/post.ts +2 -4
- package/source/js/_app/page/fancybox.ts +0 -66
package/README.md
CHANGED
@@ -20,7 +20,6 @@
|
|
20
20
|
## 📚子项目
|
21
21
|
- [ShokaX docs](https://github.com/theme-shoka-x/shokaX-docs) ShokaX 主题文档 (正在编写中,欢迎加入!)
|
22
22
|
- [HRMNMI](https://github.com/theme-shoka-x/hexo-renderer-multi-next-markdown-it) ShokaX 正在使用的 markdown 渲染器 (等待重构)
|
23
|
-
- [ShokaX Pjax](https://github.com/theme-shoka-x/theme-shokax-pjax) ShokaX 提供的高效 Pjax 实现
|
24
23
|
- [ShokaX Anime](https://github.com/theme-shoka-x/theme-shokax-anime) ShokaX 提供的精简版 Anime.js 实现
|
25
24
|
|
26
25
|
# [许可证](https://github.com/theme-shoka-x/hexo-theme-shokaX/blob/main/LICENSE)
|
package/_config.yml
CHANGED
@@ -52,7 +52,6 @@ modules:
|
|
52
52
|
visibilityListener: true # 启用可见度监听器
|
53
53
|
tabs: true # 启用选项卡扩展支持,如需开启 summary 功能请一并开启
|
54
54
|
quiz: true # 启用文章内问题扩展支持
|
55
|
-
fancybox: true # 启用 fancybox 支持(不建议禁用)
|
56
55
|
|
57
56
|
# 优化性能区
|
58
57
|
performance:
|
@@ -354,41 +353,13 @@ vendors:
|
|
354
353
|
cdns:
|
355
354
|
cdnjs: https://s4.zstatic.net/ajax/libs
|
356
355
|
js:
|
357
|
-
jquery:
|
358
|
-
source: cdnjs
|
359
|
-
url: jquery/3.5.1/jquery.min.js
|
360
|
-
sri: "sha384-ZvpUoO/+PpLXR1lu4jmpXWu80pZlYUAfxl5NsBMWOEPSjUn/6Z/hRTt8+pR6L4N2"
|
361
|
-
fancybox:
|
362
|
-
source: cdnjs
|
363
|
-
url: fancybox/3.5.7/jquery.fancybox.min.js
|
364
|
-
sri: "sha384-Zm+UU4tdcfAm29vg+MTbfu//q5B/lInMbMCr4T8c9rQFyOv6PlfQYpB5wItcXWe7"
|
365
|
-
justifiedGallery:
|
366
|
-
source: cdnjs
|
367
|
-
url: justifiedGallery/3.8.1/js/jquery.justifiedGallery.min.js
|
368
|
-
sri: "sha384-TOxsBplaL96/QDWPIUg+ye3v89qSE3s22XNtJMmCeZEep3cVDmXy1zEfZvVv+y2m"
|
369
356
|
async_js:
|
370
357
|
copy_tex:
|
371
358
|
source: cdnjs
|
372
359
|
url: KaTeX/0.16.9/contrib/copy-tex.min.js
|
373
360
|
sri: "sha384-ww/583aHhxWkz5DEVn6OKtNiIaLi2iBRNZXfJRiY1Ai7tnJ9UXpEsyvOITVpTl4A"
|
374
|
-
fancybox:
|
375
|
-
source: cdnjs
|
376
|
-
url: fancybox/3.5.7/jquery.fancybox.min.js
|
377
|
-
sri: "sha384-Zm+UU4tdcfAm29vg+MTbfu//q5B/lInMbMCr4T8c9rQFyOv6PlfQYpB5wItcXWe7"
|
378
|
-
justifiedGallery:
|
379
|
-
source: cdnjs
|
380
|
-
url: justifiedGallery/3.8.1/js/jquery.justifiedGallery.min.js
|
381
|
-
sri: "sha384-TOxsBplaL96/QDWPIUg+ye3v89qSE3s22XNtJMmCeZEep3cVDmXy1zEfZvVv+y2m"
|
382
361
|
css:
|
383
362
|
katex:
|
384
363
|
source: cdnjs
|
385
364
|
url: KaTeX/0.16.9/katex.min.css
|
386
365
|
sri: "sha384-n8MVd4RsNIU0tAv4ct0nTaAbDJwPJzDEaqSD1odI+WdtXRGWt2kTvGFasHpSy3SV"
|
387
|
-
fancybox:
|
388
|
-
source: cdnjs
|
389
|
-
url: fancybox/3.5.7/jquery.fancybox.min.css
|
390
|
-
sri: "sha384-Q8BgkilbsFGYNNiDqJm69hvDS7NCJWOodvfK/cwTyQD4VQA0qKzuPpvqNER1UC0F"
|
391
|
-
justifiedGallery:
|
392
|
-
source: cdnjs
|
393
|
-
url: justifiedGallery/3.8.1/css/justifiedGallery.min.css
|
394
|
-
sri: "sha384-V/1Ew9pYm8xpy/L9i078ZXT6HSEOrGC6KNFYLbXOdtqb3+c6brpGqVzZtEPSQOiz"
|
@@ -113,7 +113,6 @@ html(lang=page.language?page.language:config.language, style=theme.grayMode ? 'f
|
|
113
113
|
katex: #{!!page.math},
|
114
114
|
mermaid: #{!!page.mermaid},
|
115
115
|
audio: !{audioValue},
|
116
|
-
fancybox: #{page.fancybox !== false},
|
117
116
|
nocopy: #{!!page.nocopy},
|
118
117
|
outime: #{page.outime !== false},
|
119
118
|
template: `!{__('outime.template')}`,
|
@@ -131,10 +130,6 @@ html(lang=page.language?page.language:config.language, style=theme.grayMode ? 'f
|
|
131
130
|
!= partial('_partials/third-party/clarity.pug', {}, {cache: true})
|
132
131
|
!= partial('_partials/third-party/google-analytics.pug', {}, {cache: true})
|
133
132
|
|
134
|
-
!= vendor_js('jquery')
|
135
|
-
!= vendor_js('justifiedGallery')
|
136
|
-
!= vendor_js('fancybox')
|
137
|
-
|
138
133
|
if theme.polyfill.enable
|
139
134
|
script(src=`https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?version=4.8.0&features=${theme.polyfill.features}` defer)
|
140
135
|
|
package/layout/page.pug
CHANGED
@@ -5,8 +5,6 @@ include _mixin/comment.pug
|
|
5
5
|
block head
|
6
6
|
!= _css('post.css')
|
7
7
|
// 临时处理
|
8
|
-
link(rel="stylesheet" media="none" onload="this.media='all'" href="https://s4.zstatic.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css")
|
9
|
-
link(rel="stylesheet" media="none" onload="this.media='all'" href="https://s4.zstatic.net/ajax/libs/justifiedGallery/3.8.1/css/justifiedGallery.min.css")
|
10
8
|
link(rel="stylesheet" media="none" onload="this.media='all'" href="https://s4.zstatic.net/ajax/libs/KaTeX/0.16.9/katex.min.css")
|
11
9
|
|
12
10
|
block title
|
package/layout/post.pug
CHANGED
@@ -7,8 +7,6 @@ block head
|
|
7
7
|
!= _css('post.css')
|
8
8
|
!= _css('mermaid.css')
|
9
9
|
// 临时处理
|
10
|
-
link(rel="stylesheet" media="none" onload="this.media='all'" href="https://s4.zstatic.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css")
|
11
|
-
link(rel="stylesheet" media="none" onload="this.media='all'" href="https://s4.zstatic.net/ajax/libs/justifiedGallery/3.8.1/css/justifiedGallery.min.css")
|
12
10
|
link(rel="stylesheet" media="none" onload="this.media='all'" href="https://s4.zstatic.net/ajax/libs/KaTeX/0.16.9/katex.min.css")
|
13
11
|
|
14
12
|
block title
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "hexo-theme-shokax",
|
3
|
-
"version": "0.5.0-beta2-dev-
|
3
|
+
"version": "0.5.0-beta2-dev-dffd6cb",
|
4
4
|
"description": "a hexo theme based on shoka",
|
5
5
|
"main": "index.js",
|
6
6
|
"repository": "https://github.com/theme-shoka-x/hexo-theme-shokaX",
|
@@ -12,12 +12,9 @@
|
|
12
12
|
"build": "node ./toolbox/compiler.mjs"
|
13
13
|
},
|
14
14
|
"devDependencies": {
|
15
|
-
"@types/fancybox": "^3.5.7",
|
16
|
-
"@types/jquery": "^3.5.32",
|
17
15
|
"@types/js-yaml": "^4.0.9",
|
18
16
|
"@types/katex": "^0.16.7",
|
19
17
|
"@types/node": "^22.14.0",
|
20
|
-
"@types/quicklink": "^2.3.4",
|
21
18
|
"@typescript-eslint/eslint-plugin": "^8.29.1",
|
22
19
|
"@typescript-eslint/parser": "^8.29.1",
|
23
20
|
"eslint": "^9.24.0",
|
@@ -34,6 +31,7 @@
|
|
34
31
|
"dompurify": "^3.2.5",
|
35
32
|
"es-toolkit": "^1.34.1",
|
36
33
|
"esbuild": "^0.25.2",
|
34
|
+
"hana-img-viewer": "^1.2.1",
|
37
35
|
"hexo": "^7.3.0",
|
38
36
|
"hexo-algoliasearch": "^2.0.1",
|
39
37
|
"hexo-feed": "^1.1.2",
|
@@ -48,7 +46,8 @@
|
|
48
46
|
"nyx-player": "^0.0.2",
|
49
47
|
"quicklink": "^2.3.0",
|
50
48
|
"theme-shokax-anime": "^0.0.8",
|
51
|
-
"twikoo": "^1.6.42"
|
49
|
+
"twikoo": "^1.6.42",
|
50
|
+
"vue": "^3.5.13"
|
52
51
|
},
|
53
52
|
"engines": {
|
54
53
|
"node": ">=20.0.0"
|
@@ -47,7 +47,6 @@ hexo.extend.generator.register("script", async function(locals) {
|
|
47
47
|
local: true,
|
48
48
|
sri: ""
|
49
49
|
},
|
50
|
-
fancybox: (0, import_utils.getVendorLink)(hexo, theme.vendors.css.fancybox),
|
51
50
|
justifiedGallery: (0, import_utils.getVendorLink)(hexo, theme.vendors.css.justifiedGallery)
|
52
51
|
},
|
53
52
|
loader: theme.loader,
|
@@ -127,7 +126,6 @@ hexo.extend.generator.register("script", async function(locals) {
|
|
127
126
|
__shokax_outime__: theme.outime.enable ? "true" : "false",
|
128
127
|
__shokax_tabs__: theme.modules.tabs ? "true" : "false",
|
129
128
|
__shokax_quiz__: theme.modules.quiz ? "true" : "false",
|
130
|
-
__shokax_fancybox__: theme.modules.fancybox ? "true" : "false",
|
131
129
|
__shokax_waline__: theme.waline.enable ? "true" : "false",
|
132
130
|
__shokax_twikoo__: theme.twikoo.enable ? "true" : "false",
|
133
131
|
__shokax_antiFakeWebsite__: theme.experiments.antiFakeWebsite ? "true" : "false",
|
@@ -137,39 +135,43 @@ hexo.extend.generator.register("script", async function(locals) {
|
|
137
135
|
});
|
138
136
|
const res = [];
|
139
137
|
resultApp.outputFiles.forEach((file) => {
|
138
|
+
let fileName = "";
|
139
|
+
if (file.path.split("\\").length > 1) {
|
140
|
+
fileName = file.path.split("\\").pop();
|
141
|
+
} else {
|
142
|
+
fileName = file.path.split("/").pop();
|
143
|
+
}
|
140
144
|
if (file.path.endsWith(".js")) {
|
141
145
|
res.push({
|
142
|
-
path: theme.js + "/" +
|
143
|
-
data: file.
|
146
|
+
path: theme.js + "/" + fileName,
|
147
|
+
data: file.text
|
144
148
|
});
|
145
149
|
} else if (file.path.endsWith(".css")) {
|
146
150
|
res.push({
|
147
|
-
path: theme.css + "/" +
|
148
|
-
data: file.
|
151
|
+
path: theme.css + "/" + fileName,
|
152
|
+
data: file.text
|
149
153
|
});
|
150
154
|
} else {
|
151
155
|
res.push({
|
152
|
-
path: theme.statics + "/" +
|
153
|
-
data: file.
|
156
|
+
path: theme.statics + "/" + fileName,
|
157
|
+
data: file.text
|
154
158
|
});
|
155
159
|
}
|
156
160
|
});
|
157
161
|
hexo.extend.helper.register("preloadjs", function() {
|
158
|
-
const { statics, js } = hexo.theme.config;
|
159
162
|
let resultHtml = "";
|
160
163
|
res.forEach((file) => {
|
161
164
|
if (file.path.endsWith(".js")) {
|
162
|
-
resultHtml += (0, import_hexo_util.htmlTag)("link", { rel: "modulepreload", href: import_hexo_util.url_for.call(this,
|
165
|
+
resultHtml += (0, import_hexo_util.htmlTag)("link", { rel: "modulepreload", href: import_hexo_util.url_for.call(this, file.path) }, "");
|
163
166
|
}
|
164
167
|
});
|
165
168
|
return resultHtml;
|
166
169
|
});
|
167
170
|
hexo.extend.helper.register("load_async_css", function() {
|
168
|
-
const { statics, css } = hexo.theme.config;
|
169
171
|
let resultHtml = "";
|
170
172
|
res.forEach((file) => {
|
171
173
|
if (file.path.endsWith(".css")) {
|
172
|
-
resultHtml += (0, import_hexo_util.htmlTag)("link", { rel: "stylesheet", href: import_hexo_util.url_for.call(this,
|
174
|
+
resultHtml += (0, import_hexo_util.htmlTag)("link", { rel: "stylesheet", href: import_hexo_util.url_for.call(this, file.path), media: "none", onload: "this.media='all'" }, "");
|
173
175
|
}
|
174
176
|
});
|
175
177
|
return resultHtml;
|
@@ -196,7 +198,7 @@ hexo.extend.generator.register("script", async function(locals) {
|
|
196
198
|
});
|
197
199
|
res.push({
|
198
200
|
path: theme.js + "/cf-patch.js",
|
199
|
-
data: resultCF.outputFiles[0].
|
201
|
+
data: resultCF.outputFiles[0].text
|
200
202
|
});
|
201
203
|
}
|
202
204
|
return res;
|
@@ -108,14 +108,16 @@ export const sidebarTOC = () => {
|
|
108
108
|
}
|
109
109
|
|
110
110
|
document.querySelectorAll('.toc .active').forEach((element) => {
|
111
|
-
element && element.classList.remove('active
|
111
|
+
element && element.classList.remove('active')
|
112
|
+
element && element.classList.remove('current')
|
112
113
|
})
|
113
114
|
|
114
115
|
sections.forEach((element) => {
|
115
116
|
element && element.classList.remove('active')
|
116
117
|
})
|
117
118
|
|
118
|
-
target.classList.add('active
|
119
|
+
target.classList.add('active')
|
120
|
+
target.classList.add('current')
|
119
121
|
sections[index] && sections[index].classList.add('active')
|
120
122
|
|
121
123
|
let parent = <Element> target.parentNode
|
@@ -16,7 +16,7 @@ export const siteBrand = document.getElementById('brand')
|
|
16
16
|
export let toolBtn = document.getElementById('tool')
|
17
17
|
export let backToTop: HTMLElement
|
18
18
|
export let goToComment
|
19
|
-
export let showContents
|
19
|
+
export let showContents: HTMLElement
|
20
20
|
export let siteSearch = document.getElementById('search')
|
21
21
|
export let siteNavHeight: number, headerHightInner: number, headerHight: number
|
22
22
|
export let oWinHeight = window.innerHeight
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import DOMPurify from 'dompurify';
|
2
|
+
import { HanaImgViewer } from 'hana-img-viewer'
|
3
|
+
import { createApp } from 'vue';
|
4
|
+
|
5
|
+
export const postImageViewer = (p: string) => {
|
6
|
+
document.querySelectorAll(`${p} .md img:not(.emoji):not(.vemoji)`).forEach((element) => {
|
7
|
+
const img = element as HTMLImageElement;
|
8
|
+
const imgSrc = DOMPurify.sanitize(img.dataset.src);
|
9
|
+
|
10
|
+
const wrapper = document.createElement('div');
|
11
|
+
console.log(wrapper)
|
12
|
+
img.replaceWith(wrapper);
|
13
|
+
|
14
|
+
console.log(imgSrc)
|
15
|
+
const app = createApp(HanaImgViewer, { src: imgSrc, maskOpacity: 0.8 });
|
16
|
+
console.log(app)
|
17
|
+
app.mount(wrapper);
|
18
|
+
console.log(app)
|
19
|
+
});
|
20
|
+
};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { postImageViewer } from './imageviewer'
|
2
2
|
import { clipBoard, showtip } from '../globals/tools'
|
3
3
|
import { CONFIG, BODY } from '../globals/globalVars'
|
4
4
|
import { pageScroll, transition } from '../library/anime'
|
@@ -7,9 +7,7 @@ import { getDisplay, setDisplay, wrapObject } from '../library/proto'
|
|
7
7
|
export const postBeauty = () => {
|
8
8
|
if (!document.querySelector('.md')) { return }
|
9
9
|
|
10
|
-
|
11
|
-
postFancybox('.post.block')
|
12
|
-
}
|
10
|
+
postImageViewer('.post.block');
|
13
11
|
|
14
12
|
(document.querySelector('.post.block') as HTMLTextAreaElement).oncopy = (event) => {
|
15
13
|
showtip(LOCAL.copyright)
|
@@ -1,66 +0,0 @@
|
|
1
|
-
import { insertAfter } from '../library/proto'
|
2
|
-
import DOMPurify from 'dompurify';
|
3
|
-
|
4
|
-
// TODO 使用PhotoSwipe替换Fancybox
|
5
|
-
export const postFancybox = (p:string) => {
|
6
|
-
if (document.querySelector(p + ' .md img')) {
|
7
|
-
// vendorCss('fancybox')
|
8
|
-
// vendorCss('justifiedGallery')
|
9
|
-
document.querySelectorAll(p + ' p.gallery').forEach((element) => {
|
10
|
-
const box = document.createElement('div')
|
11
|
-
box.className = 'gallery'
|
12
|
-
box.setAttribute('data-height', String(element.getAttribute('data-height') || 220))
|
13
|
-
|
14
|
-
box.innerHTML = element.innerHTML.replace(/<br>/g, '')
|
15
|
-
|
16
|
-
element.parentNode.insertBefore(box, element)
|
17
|
-
element.remove()
|
18
|
-
})
|
19
|
-
|
20
|
-
document.querySelectorAll(p + ' .md img:not(.emoji):not(.vemoji)').forEach((element) => {
|
21
|
-
const $image = $(element)
|
22
|
-
const imageLink = DOMPurify.sanitize($image.attr('src')) // 替换
|
23
|
-
const $imageWrapLink = $image.wrap('<a class="fancybox" href="' + imageLink + '" itemscope itemtype="https://schema.org/ImageObject" itemprop="url"></a>').parent('a')
|
24
|
-
let info; let captionClass = 'image-info'
|
25
|
-
if (!$image.is('a img')) {
|
26
|
-
$image.data('safe-src', imageLink)
|
27
|
-
if (!$image.is('.gallery img')) {
|
28
|
-
$imageWrapLink.attr('data-fancybox', 'default').attr('rel', 'default')
|
29
|
-
} else {
|
30
|
-
captionClass = 'jg-caption'
|
31
|
-
}
|
32
|
-
}
|
33
|
-
if ((info = element.getAttribute('title'))) {
|
34
|
-
$imageWrapLink.attr('data-caption', info)
|
35
|
-
const para = document.createElement('span')
|
36
|
-
const txt = document.createTextNode(info)
|
37
|
-
para.appendChild(txt)
|
38
|
-
para.addClass(captionClass)
|
39
|
-
insertAfter(element, para)
|
40
|
-
}
|
41
|
-
})
|
42
|
-
|
43
|
-
document.querySelectorAll(p + ' div.gallery').forEach((el, i) => {
|
44
|
-
// @ts-ignore
|
45
|
-
$(el).justifiedGallery({
|
46
|
-
rowHeight: $(el).data('height') || 120,
|
47
|
-
rel: 'gallery-' + i
|
48
|
-
}).on('jg.complete', function () {
|
49
|
-
$(this).find('a').each((k, ele) => {
|
50
|
-
ele.setAttribute('data-fancybox', 'gallery-' + i)
|
51
|
-
})
|
52
|
-
})
|
53
|
-
})
|
54
|
-
|
55
|
-
$.fancybox.defaults.hash = false
|
56
|
-
$(p + ' .fancybox').fancybox({
|
57
|
-
loop: true,
|
58
|
-
// @ts-ignore
|
59
|
-
helpers: {
|
60
|
-
overlay: {
|
61
|
-
locked: false
|
62
|
-
}
|
63
|
-
}
|
64
|
-
})
|
65
|
-
}
|
66
|
-
}
|