hexo-theme-shokax 0.3.11 → 0.3.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -32,11 +32,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
32
32
  };
33
33
  Object.defineProperty(exports, "__esModule", { value: true });
34
34
  const injects_1 = __importDefault(require("./lib/injects"));
35
- const node_https_1 = require("node:https");
36
- // @ts-ignore
37
- // import { version } from '../../package.json'
35
+ const package_json_1 = require("../../package.json");
38
36
  const fs = __importStar(require("node:fs"));
39
- const version = '0.3.10';
40
37
  hexo.on('generateBefore', () => {
41
38
  // 加载`theme_injects`过滤器
42
39
  (0, injects_1.default)(hexo);
@@ -49,19 +46,11 @@ hexo.on('generateBefore', () => {
49
46
  });
50
47
  hexo.on('generateAfter', () => {
51
48
  // 检查版本更新
52
- (0, node_https_1.get)('https://api.github.com/repos/theme-shoka-x/hexo-theme-shokaX/releases/latest', {
53
- headers: {
54
- 'User-Agent': 'Theme ShokaX Client'
55
- }
56
- }, (res) => {
57
- let result = '';
58
- res.on('data', (data) => {
59
- result += data;
60
- });
61
- res.on('end', () => {
49
+ fetch('https://api.github.com/repos/theme-shoka-x/hexo-theme-shokaX/releases/latest').then((res) => {
50
+ res.json().then((resp) => {
62
51
  try {
63
- const latest = JSON.parse(result).tag_name.replace('v', '').split('.');
64
- const current = version.split('.');
52
+ const latest = resp.tag_name.replace('v', '').split('.');
53
+ const current = package_json_1.version.split('.');
65
54
  let isOutdated = false;
66
55
  for (let i = 0; i < Math.max(latest.length, current.length); i++) {
67
56
  if (!current[i] || latest[i] > current[i]) {
@@ -77,13 +66,13 @@ hexo.on('generateAfter', () => {
77
66
  hexo.log.warn('Visit https://github.com/theme-shoka-x/hexo-theme-shokaX/releases for more information.');
78
67
  }
79
68
  }
80
- catch (err) {
81
- hexo.log.error('Failed to detect version info. Error message:');
82
- hexo.log.error(err);
69
+ catch (e) {
70
+ hexo.log.warn('Failed to detect version info. Error message:');
71
+ hexo.log.warn(e);
83
72
  }
73
+ }).catch((e) => {
74
+ hexo.log.warn('Failed to detect version info. Error message:');
75
+ hexo.log.warn(e);
84
76
  });
85
- }).on('error', err => {
86
- hexo.log.error('Failed to detect version info. Error message:');
87
- hexo.log.error(err);
88
77
  });
89
78
  });
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getVendorLink = void 0;
4
+ function getVendorLink(hexo, source) {
5
+ const VendorsCfg = hexo.theme.config.vendors;
6
+ const tagIdx = source.indexOf('|');
7
+ if (tagIdx !== -1) {
8
+ return `${VendorsCfg.cdns[source.substring(0, tagIdx)]}/${source.substring(tagIdx + 1)}`;
9
+ }
10
+ else {
11
+ return source;
12
+ }
13
+ }
14
+ exports.getVendorLink = getVendorLink;
@@ -39,12 +39,14 @@
39
39
  width: auto;
40
40
  height: auto;
41
41
  background: none;
42
- border-radius: 10px;
42
+ border-radius: 0;
43
43
  border-bottom: .125rem solid transparent;
44
44
  }
45
45
 
46
46
  &.active::before {
47
47
  border-bottom-color: var(--primary-color);
48
+ left: 0;
49
+ right: 0;
48
50
  }
49
51
  }
50
52
  }
@@ -149,12 +149,12 @@ input, textarea {
149
149
  @font-face {
150
150
  font-family: 'ic';
151
151
  font-display: swap;
152
- src: url('//at.alicdn.com/t/font_' + $iconfont + '.eot');
153
- src: url('//at.alicdn.com/t/font_' + $iconfont + '.eot?#iefix') format('embedded-opentype'),
154
- url('//at.alicdn.com/t/font_' + $iconfont + '.woff2') format('woff2'),
155
- url('//at.alicdn.com/t/font_' + $iconfont + '.woff') format('woff'),
156
- url('//at.alicdn.com/t/font_' + $iconfont + '.ttf') format('truetype'),
157
- url('//at.alicdn.com/t/font_' + $iconfont + '.svg#ic') format('svg');
152
+ src: url('//at.alicdn.com/t/c/font_' + $iconfont + '.eot');
153
+ src: url('//at.alicdn.com/t/c/font_' + $iconfont + '.eot?#iefix') format('embedded-opentype'),
154
+ url('//at.alicdn.com/t/c/font_' + $iconfont + '.woff2') format('woff2'),
155
+ url('//at.alicdn.com/t/c/font_' + $iconfont + '.woff') format('woff'),
156
+ url('//at.alicdn.com/t/c/font_' + $iconfont + '.ttf') format('truetype'),
157
+ url('//at.alicdn.com/t/c/font_' + $iconfont + '.svg#ic') format('svg');
158
158
  }
159
159
 
160
160
  @font-face {
@@ -449,3 +449,7 @@
449
449
  .i-cloud-music:before {
450
450
  content: "\e76a";
451
451
  }
452
+
453
+ .i-gitee:before {
454
+ content: "\e607";
455
+ }
@@ -122,7 +122,6 @@ export const sidebarTOC = () => {
122
122
  if (navItems.length < 1) {
123
123
  return;
124
124
  }
125
- // @ts-ignore
126
125
  let sections = [...navItems];
127
126
  let activeLock = null;
128
127
  sections = sections.map((element, index) => {
@@ -70,46 +70,6 @@ export const scrollHandle = () => {
70
70
  $dom('.percent').changeOrGetWidth(scrollPercent);
71
71
  }
72
72
  };
73
- /**
74
- * 此函数用于修改右键点击显示菜单 <br/>
75
- * 需要在document下存在如下元素:
76
- * - id为clickMenu的容器(右键菜单容器)
77
- * - class为clickSubmenu的容器(可以有0到无限个)(子菜单容器)
78
- * CSS应有如下class:
79
- * - clickMenu的active类(控制显示)
80
- */
81
- export const clickMenu = () => {
82
- const menuElement = $dom('#clickMenu');
83
- window.oncontextmenu = function (event) {
84
- if (event.ctrlKey) { // 当按下ctrl键时不触发自定义菜单
85
- return;
86
- }
87
- event.preventDefault();
88
- let x = event.offsetX; // 触发点到页面窗口左边的距离
89
- let y = event.offsetY;
90
- const winWidth = window.innerWidth; // 窗口的内部宽度(包括滚动条)
91
- const winHeight = window.innerHeight;
92
- const menuWidth = menuElement.offsetWidth; // 菜单宽度
93
- const menuHeight = menuElement.offsetHeight;
94
- x = winWidth - menuWidth >= x ? x : winWidth - menuWidth;
95
- y = winHeight - menuHeight >= y ? y : winHeight - menuHeight;
96
- menuElement.style.top = y + 'px';
97
- menuElement.style.left = x + 'px';
98
- menuElement.classList.add('active');
99
- $dom.each('.clickSubmenu', (submenu) => {
100
- if (x > (winWidth - menuWidth - submenu.offsetWidth)) {
101
- submenu.style.left = '-200px';
102
- }
103
- else {
104
- submenu.style.left = '';
105
- submenu.style.right = '-200px';
106
- }
107
- });
108
- };
109
- window.addEventListener('click', () => {
110
- menuElement.classList.remove('active');
111
- });
112
- };
113
73
  // 可见度监听(离开页面和返回时更改document的title)
114
74
  export const visibilityListener = () => {
115
75
  const iconNode = $dom('[rel="icon"]');
@@ -1,15 +1,6 @@
1
1
  // 与第三方js的交互或第三方嵌入js
2
- import lozad from 'lozad';
3
2
  import { loadCat } from './globalVars';
4
3
  import { transition } from '../library/anime';
5
- /**
6
- * 懒加载图片
7
- */
8
- export const lazyload = lozad('img, [data-background-image]', {
9
- loaded(el) {
10
- el.addClass('lozaded');
11
- }
12
- });
13
4
  // 加载动画
14
5
  export const Loader = {
15
6
  timer: undefined,
@@ -49,44 +49,18 @@ export const positionInit = (comment) => {
49
49
  }
50
50
  };
51
51
  /*
52
- 这段代码是用来复制文本的。它使用了浏览器的 Clipboard API,如果浏览器支持该 API 并且当前页面是安全协议 (https),
53
- 它将使用 Clipboard API 将文本复制到剪贴板。如果不支持,它会创建一个隐藏的文本区域并使用 document.execCommand('copy') 将文本复制到剪贴板。
54
- 最后,它会回调传入的函数并传入一个布尔值表示是否成功复制。
52
+ 基于clipboard API的复制功能,仅在https环境下有效
55
53
  */
56
54
  export const clipBoard = (str, callback) => {
57
55
  if (navigator.clipboard && window.isSecureContext) {
58
56
  navigator.clipboard.writeText(str).then(() => {
59
- // eslint-disable-next-line chai-friendly/no-unused-expressions
60
57
  callback && callback(true);
61
58
  }, () => {
62
- // eslint-disable-next-line chai-friendly/no-unused-expressions
63
59
  callback && callback(false);
64
60
  });
65
61
  }
66
62
  else {
67
- // TODO 根据caniuse,需要此polyfill的设备不足5%,应考虑删除
68
- const ta = BODY.createChild('textarea', {
69
- style: {
70
- top: window.scrollY + 'px',
71
- position: 'absolute',
72
- opacity: '0'
73
- },
74
- readOnly: true,
75
- value: str
76
- });
77
- const selection = document.getSelection();
78
- const selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false;
79
- ta.select();
80
- ta.setSelectionRange(0, str.length);
81
- ta.readOnly = false;
82
- const result = document.execCommand('copy');
83
- // eslint-disable-next-line chai-friendly/no-unused-expressions
84
- callback && callback(result);
85
- ta.blur(); // For iOS
86
- if (selected) {
87
- selection.removeAllRanges();
88
- selection.addRange(selected);
89
- }
90
- BODY.removeChild(ta);
63
+ console.error('Too old browser, clipborad API not supported.');
64
+ callback && callback(false);
91
65
  }
92
66
  };
@@ -66,6 +66,7 @@ export const transition = (target, type, complete, begin) => {
66
66
  };
67
67
  break;
68
68
  default:
69
+ // @ts-ignore
69
70
  animation = type;
70
71
  // @ts-ignore
71
72
  display = type.display;
@@ -76,12 +77,10 @@ export const transition = (target, type, complete, begin) => {
76
77
  duration: 200,
77
78
  easing: 'linear',
78
79
  begin() {
79
- // eslint-disable-next-line chai-friendly/no-unused-expressions
80
80
  begin && begin();
81
81
  },
82
82
  complete() {
83
83
  target.display(display);
84
- // eslint-disable-next-line chai-friendly/no-unused-expressions
85
84
  complete && complete();
86
85
  }
87
86
  }, animation)).play();
@@ -101,9 +100,7 @@ export const pageScroll = (target, offset, complete) => {
101
100
  scrollTop: offset || (typeof target === 'number' ? target : (target ? target.getTop() + document.documentElement.scrollTop - siteNavHeight : 0)),
102
101
  // 完成回调函数
103
102
  complete() {
104
- // eslint-disable-next-line chai-friendly/no-unused-expressions
105
103
  complete && complete();
106
104
  }
107
105
  }).play();
108
- // 调用 anime.js 函数,并传入参数
109
106
  };
@@ -4,15 +4,15 @@ import { getScript } from './scriptPjax';
4
4
  */
5
5
  const assetUrl = (asset, type) => {
6
6
  const str = CONFIG[asset][type];
7
+ if (str.includes('http')) {
8
+ return str;
9
+ }
7
10
  if (str.includes('gh') || str.includes('combine')) {
8
11
  return `https://cdn.jsdelivr.net/${str}`;
9
12
  }
10
13
  if (str.includes('npm')) {
11
14
  return `https://cdn.jsdelivr.net/${str}`;
12
15
  }
13
- if (str.includes('http')) {
14
- return str;
15
- }
16
16
  return `/${str}`;
17
17
  };
18
18
  export const vendorJs = (type, callback, condition) => {
@@ -3,6 +3,7 @@ import { vendorCss, vendorJs } from '../library/loadFile';
3
3
  export const postFancybox = (p) => {
4
4
  if ($dom(p + ' .md img')) {
5
5
  vendorCss('fancybox');
6
+ vendorCss('justifiedGallery');
6
7
  vendorJs('fancybox', () => {
7
8
  const q = jQuery.noConflict();
8
9
  $dom.each(p + ' p.gallery', (element) => {
@@ -25,8 +25,8 @@ export default function domInit() {
25
25
  backToTop.addEventListener('click', backToTopHandle);
26
26
  goToComment.addEventListener('click', goToCommentHandle);
27
27
  showContents.addEventListener('click', sideBarToggleHandle);
28
- if (typeof mediaPlayer !== 'undefined') {
29
- mediaPlayer(toolPlayer);
28
+ if (typeof mediaPlayer !== 'undefined' && !CONFIG.noPlayer) {
29
+ /* @__PURE__ */ mediaPlayer(toolPlayer);
30
30
  $dom('main').addEventListener('click', () => {
31
31
  toolPlayer.player.mini();
32
32
  });
@@ -9,7 +9,7 @@ import { loadCat, menuToggle, setLocalHash, setLocalUrl, setOriginTitle, sideBar
9
9
  import { mediaPlayer } from '../player';
10
10
  import { pagePosition, positionInit } from '../globals/tools';
11
11
  import { menuActive, sideBarTab, sidebarTOC } from '../components/sidebar';
12
- import { Loader, isOutime, lazyload } from '../globals/thirdparty';
12
+ import { Loader, isOutime } from '../globals/thirdparty';
13
13
  import { tabFormat } from '../page/tab';
14
14
  export const pjaxReload = () => {
15
15
  pagePosition();
@@ -30,7 +30,6 @@ export const siteRefresh = (reload) => {
30
30
  vendorCss('katex');
31
31
  vendorJs('copy_tex');
32
32
  vendorCss('mermaid');
33
- vendorJs('chart');
34
33
  if (reload !== 1) {
35
34
  $dom.each('script[data-pjax]', pjaxScript);
36
35
  }
@@ -49,6 +48,5 @@ export const siteRefresh = (reload) => {
49
48
  positionInit();
50
49
  }, 500);
51
50
  cardActive();
52
- lazyload.observe();
53
51
  isOutime();
54
52
  };
@@ -9,6 +9,7 @@ import { pagePosition } from '../globals/tools';
9
9
  import { initFireworks } from '../fireworks';
10
10
  import Pjax from 'theme-shokax-pjax';
11
11
  import { initVue } from '../library/vue';
12
+ import { lazyLoad } from 'unlazy';
12
13
  const siteInit = () => {
13
14
  domInit();
14
15
  initVue();
@@ -32,6 +33,7 @@ const siteInit = () => {
32
33
  themeColorListener();
33
34
  algoliaSearch(pjax);
34
35
  initFireworks();
36
+ lazyLoad();
35
37
  window.addEventListener('scroll', scrollHandle);
36
38
  window.addEventListener('resize', resizeHandle);
37
39
  window.addEventListener('pjax:send', pjaxReload);
@@ -6,10 +6,7 @@ import { $storage } from './library/storage';
6
6
  import { tabFormat } from './page/tab';
7
7
  let NOWPLAYING = null;
8
8
  const isMobile = /mobile/i.test(window.navigator.userAgent);
9
- export const mediaPlayer = (t, config) => {
10
- if (CONFIG.noPlayer) {
11
- return;
12
- }
9
+ export const mediaPlayer = /* @__PURE__ */ (t, config) => {
13
10
  const buttons = {
14
11
  el: {},
15
12
  create() {