hexo-theme-solitude 1.0.0
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/LICENSE +19 -0
- package/README.md +56 -0
- package/_config.yml +432 -0
- package/languages/en-US.yml +39 -0
- package/languages/zh-CN.yml +39 -0
- package/layout/404.ejs +34 -0
- package/layout/archive.ejs +10 -0
- package/layout/category.ejs +18 -0
- package/layout/index.ejs +20 -0
- package/layout/layout.ejs +35 -0
- package/layout/page/about.ejs +13 -0
- package/layout/page/categories.ejs +12 -0
- package/layout/page/circle.ejs +5 -0
- package/layout/page/echarts.ejs +14 -0
- package/layout/page/equipment.ejs +2 -0
- package/layout/page/links.ejs +57 -0
- package/layout/page/page.ejs +3 -0
- package/layout/page/rss.ejs +37 -0
- package/layout/page/says.ejs +16 -0
- package/layout/page/tags.ejs +12 -0
- package/layout/page/tlink.ejs +11 -0
- package/layout/page.ejs +45 -0
- package/layout/partial/body.ejs +8 -0
- package/layout/partial/compoment/about/authorinfo.ejs +18 -0
- package/layout/partial/compoment/about/award.ejs +57 -0
- package/layout/partial/compoment/about/contentinfo.ejs +33 -0
- package/layout/partial/compoment/about/hobbies.ejs +44 -0
- package/layout/partial/compoment/about/motto.ejs +17 -0
- package/layout/partial/compoment/about/other.ejs +68 -0
- package/layout/partial/compoment/about/personalities.ejs +11 -0
- package/layout/partial/compoment/about/skillsinfo.ejs +62 -0
- package/layout/partial/compoment/aside/aside.ejs +28 -0
- package/layout/partial/compoment/aside/asideAllInfo.ejs +6 -0
- package/layout/partial/compoment/aside/asideArchive.ejs +11 -0
- package/layout/partial/compoment/aside/asideFlipCard.ejs +8 -0
- package/layout/partial/compoment/aside/asideInfoCard.ejs +39 -0
- package/layout/partial/compoment/aside/asideNewestPost.ejs +31 -0
- package/layout/partial/compoment/aside/asidePower.ejs +31 -0
- package/layout/partial/compoment/aside/asideSwitch.ejs +35 -0
- package/layout/partial/compoment/aside/asideTag.ejs +5 -0
- package/layout/partial/compoment/aside/asideToc.ejs +11 -0
- package/layout/partial/compoment/aside/asideWebInfo.ejs +60 -0
- package/layout/partial/compoment/circle/angle.ejs +26 -0
- package/layout/partial/compoment/circle/banner.ejs +11 -0
- package/layout/partial/compoment/circle/content.ejs +22 -0
- package/layout/partial/compoment/dorakika/rightmenu.ejs +115 -0
- package/layout/partial/compoment/equipment/list.ejs +37 -0
- package/layout/partial/compoment/home/homeCategoryBar.ejs +11 -0
- package/layout/partial/compoment/home/postList.ejs +37 -0
- package/layout/partial/compoment/hometop/bbTimeList.ejs +15 -0
- package/layout/partial/compoment/hometop/categoryGroup.ejs +19 -0
- package/layout/partial/compoment/hometop/groupTag.ejs +30 -0
- package/layout/partial/compoment/hometop/topGroup.ejs +48 -0
- package/layout/partial/compoment/inject/body.ejs +57 -0
- package/layout/partial/compoment/inject/head.ejs +19 -0
- package/layout/partial/compoment/links/banner.ejs +42 -0
- package/layout/partial/compoment/links/linksCard.ejs +27 -0
- package/layout/partial/compoment/links/linksItem.ejs +21 -0
- package/layout/partial/compoment/mixins/articleSort.ejs +26 -0
- package/layout/partial/compoment/mixins/pagination.ejs +11 -0
- package/layout/partial/compoment/nav/left.ejs +22 -0
- package/layout/partial/compoment/nav/menu.ejs +25 -0
- package/layout/partial/compoment/nav/right.ejs +42 -0
- package/layout/partial/compoment/post/award.ejs +52 -0
- package/layout/partial/compoment/post/copyright.ejs +37 -0
- package/layout/partial/compoment/post/postMeta.ejs +83 -0
- package/layout/partial/compoment/post/postNav.ejs +41 -0
- package/layout/partial/compoment/post/wave.ejs +14 -0
- package/layout/partial/compoment/says/banner.ejs +10 -0
- package/layout/partial/compoment/says/saysBottom.ejs +18 -0
- package/layout/partial/compoment/says/saysContent.ejs +11 -0
- package/layout/partial/compoment/third-party/comments/comment.ejs +12 -0
- package/layout/partial/compoment/third-party/comments/twikoo.ejs +29 -0
- package/layout/partial/compoment/third-party/comments/twikoo_k.ejs +29 -0
- package/layout/partial/compoment/third-party/music.ejs +5 -0
- package/layout/partial/compoment/third-party/pjax.ejs +31 -0
- package/layout/partial/compoment/third-party/search/algolia-search.ejs +20 -0
- package/layout/partial/compoment/third-party/search/index.ejs +10 -0
- package/layout/partial/compoment/third-party/search/local-search.ejs +22 -0
- package/layout/partial/compoment/tlink/banner.ejs +10 -0
- package/layout/partial/console.ejs +62 -0
- package/layout/partial/footer.ejs +107 -0
- package/layout/partial/head.ejs +37 -0
- package/layout/partial/header.ejs +6 -0
- package/layout/partial/hometop.ejs +15 -0
- package/layout/partial/loading.ejs +86 -0
- package/layout/partial/nav.ejs +34 -0
- package/layout/partial/pwa.ejs +40 -0
- package/layout/partial/sidebar.ejs +31 -0
- package/layout/post.ejs +36 -0
- package/layout/tag.ejs +19 -0
- package/package.json +24 -0
- package/scripts/event/init.js +22 -0
- package/scripts/event/page.js +40 -0
- package/scripts/event/welcome.js +15 -0
- package/scripts/filter/checkThemeConfig.js +18 -0
- package/scripts/filter/default.js +23 -0
- package/scripts/filter/katex.js +25 -0
- package/scripts/filter/lazyload.js +11 -0
- package/scripts/filter/randomPosts.js +9 -0
- package/scripts/helper/charts.js +397 -0
- package/scripts/helper/getArchiveLength.js +18 -0
- package/scripts/helper/randomLinks.js +16 -0
- package/scripts/helper/related_post.js +91 -0
- package/scripts/helper/themeJsExport.js +77 -0
- package/scripts/tags/bvideo.js +42 -0
- package/scripts/tags/expand.js +4 -0
- package/scripts/tags/fold.js +19 -0
- package/scripts/tags/link.js +17 -0
- package/scripts/tags/note.js +3 -0
- package/scripts/tags/tabs.js +61 -0
- package/scripts/tags/timeline.js +35 -0
- package/source/css/commentBarrage.css +174 -0
- package/source/css/custom.css +901 -0
- package/source/css/main.css +16471 -0
- package/source/css/search/algolia-search.css +141 -0
- package/source/css/search/local-search.css +138 -0
- package/source/css/var.css +186 -0
- package/source/img/default.png +0 -0
- package/source/img/loading.gif +0 -0
- package/source/img/power.png +0 -0
- package/source/img/pwa/180.png +0 -0
- package/source/img/pwa/192.png +0 -0
- package/source/img/pwa/512.png +0 -0
- package/source/img/pwa/logo.png +0 -0
- package/source/img/pwa/siteicon/splash-1125x2436.png +0 -0
- package/source/img/pwa/siteicon/splash-1136x640.png +0 -0
- package/source/img/pwa/siteicon/splash-1170x2532.png +0 -0
- package/source/img/pwa/siteicon/splash-1179x2556.png +0 -0
- package/source/img/pwa/siteicon/splash-1242x2208.png +0 -0
- package/source/img/pwa/siteicon/splash-1242x2688.png +0 -0
- package/source/img/pwa/siteicon/splash-1248x2778.png +0 -0
- package/source/img/pwa/siteicon/splash-1290x2796.png +0 -0
- package/source/img/pwa/siteicon/splash-1334x750.png +0 -0
- package/source/img/pwa/siteicon/splash-1536x2048.png +0 -0
- package/source/img/pwa/siteicon/splash-1620x2160.png +0 -0
- package/source/img/pwa/siteicon/splash-1668x2224.png +0 -0
- package/source/img/pwa/siteicon/splash-1668x2388.png +0 -0
- package/source/img/pwa/siteicon/splash-1792x828.png +0 -0
- package/source/img/pwa/siteicon/splash-2048x1536.png +0 -0
- package/source/img/pwa/siteicon/splash-2048x2732.png +0 -0
- package/source/img/pwa/siteicon/splash-2160x1620.png +0 -0
- package/source/img/pwa/siteicon/splash-2208x1242.png +0 -0
- package/source/img/pwa/siteicon/splash-2224x1668.png +0 -0
- package/source/img/pwa/siteicon/splash-2388x1668.png +0 -0
- package/source/img/pwa/siteicon/splash-2436x1125.png +0 -0
- package/source/img/pwa/siteicon/splash-2532x1170.png +0 -0
- package/source/img/pwa/siteicon/splash-2556x1179.png +0 -0
- package/source/img/pwa/siteicon/splash-2688x1242.png +0 -0
- package/source/img/pwa/siteicon/splash-2732x2048.png +0 -0
- package/source/img/pwa/siteicon/splash-2778x1248.png +0 -0
- package/source/img/pwa/siteicon/splash-2796x1290.png +0 -0
- package/source/img/pwa/siteicon/splash-640x1136.png +0 -0
- package/source/img/pwa/siteicon/splash-750x1334.png +0 -0
- package/source/img/pwa/siteicon/splash-828x1792.png +0 -0
- package/source/img/theme/avatar.png +0 -0
- package/source/js/circle.js +1828 -0
- package/source/js/commentBarrage.js +148 -0
- package/source/js/extend/console/comment.js +99 -0
- package/source/js/extend/covercolor/local.js +150 -0
- package/source/js/extend/covercolor/web.js +137 -0
- package/source/js/extend/search/algolia-search.js +136 -0
- package/source/js/extend/search/local-search.js +160 -0
- package/source/js/main.js +705 -0
- package/source/js/post_ai.js +517 -0
- package/source/js/utils.js +153 -0
- package/source/lib/bundle.js +27 -0
- package/source/lib/friends_post.js +98 -0
- package/source/lib/lazyload.js +1 -0
- package/source/lib/snackbar.js +16 -0
- package/source/lib/snackbar.min.css +1 -0
- package/source/lib/view-image.js +13 -0
- package/source/lib/waterfall.min.js +1 -0
@@ -0,0 +1,160 @@
|
|
1
|
+
const $searchMask = document.getElementById('search-mask'),
|
2
|
+
$searchDialog = document.querySelector('#local-search .search-dialog'),
|
3
|
+
$input = document.querySelector('#search-input'),
|
4
|
+
$resultContent = document.getElementById('search-results'),
|
5
|
+
$loadingStatus = document.getElementById('loading-status')
|
6
|
+
let dataObj = null
|
7
|
+
|
8
|
+
class search{
|
9
|
+
static openSearch(){
|
10
|
+
utils.fadeIn($searchMask, '0.5')
|
11
|
+
utils.fadeIn($searchDialog, '0.5')
|
12
|
+
setTimeout(() => { document.querySelector('#search-input').focus() }, 100)
|
13
|
+
search.search()
|
14
|
+
document.addEventListener('keydown', function f (event) {
|
15
|
+
if (event.code === 'Escape') {
|
16
|
+
closeSearch()
|
17
|
+
document.removeEventListener('keydown', f)
|
18
|
+
}
|
19
|
+
})
|
20
|
+
}
|
21
|
+
|
22
|
+
static closeSearch(){
|
23
|
+
utils.fadeOut($searchDialog, '0.5')
|
24
|
+
utils.fadeOut($searchMask, '0.5')
|
25
|
+
}
|
26
|
+
|
27
|
+
static async fetchData(path){
|
28
|
+
let data = []
|
29
|
+
const response = await fetch(path)
|
30
|
+
const res = await new window.DOMParser().parseFromString(await response.text(), 'text/xml')
|
31
|
+
data = [...res.querySelectorAll('entry')].map(item => {
|
32
|
+
return {
|
33
|
+
title: item.querySelector('title').textContent,
|
34
|
+
content: item.querySelector('content') && item.querySelector('content').textContent,
|
35
|
+
url: item.querySelector('url').textContent
|
36
|
+
}
|
37
|
+
})
|
38
|
+
if (response.ok) {
|
39
|
+
const $loadDataItem = document.getElementById('loading-database')
|
40
|
+
$loadDataItem.nextElementSibling.style.display = 'block'
|
41
|
+
$loadDataItem.remove()
|
42
|
+
}
|
43
|
+
return data
|
44
|
+
}
|
45
|
+
|
46
|
+
static search(){
|
47
|
+
if (!GLOBALCONFIG.localsearch.preload && dataObj === null) dataObj = this.fetchData(GLOBALCONFIG.localsearch.path)
|
48
|
+
$input.addEventListener('input', function type() {
|
49
|
+
const keywords = this.value.trim().toLowerCase().split(/[\s]+/)
|
50
|
+
if (keywords[0] !== '') $loadingStatus.innerHTML = '<i class="ri-loader-2-fill"></i><span>加载中</span>'
|
51
|
+
else {
|
52
|
+
$resultContent.innerHTML = ''
|
53
|
+
return
|
54
|
+
}
|
55
|
+
|
56
|
+
if (keywords.length <= 0) return
|
57
|
+
let count = 0, str = '<div class="search-result-list">'
|
58
|
+
// perform local searching
|
59
|
+
dataObj.then(data => {
|
60
|
+
data.forEach(data => {
|
61
|
+
let isMatch = true
|
62
|
+
let dataTitle = data.title ? data.title.trim().toLowerCase() : ''
|
63
|
+
const dataContent = data.content ? data.content.trim().replace(/<[^>]+>/g, '').toLowerCase() : ''
|
64
|
+
const dataUrl = data.url.startsWith('/') ? data.url : GLOBALCONFIG.root + data.url
|
65
|
+
let indexTitle = -1
|
66
|
+
let indexContent = -1
|
67
|
+
let firstOccur = -1
|
68
|
+
// only match articles with not empty titles and contents
|
69
|
+
if (dataTitle !== '' || dataContent !== '') {
|
70
|
+
keywords.forEach((keyword, i) => {
|
71
|
+
indexTitle = dataTitle.indexOf(keyword)
|
72
|
+
indexContent = dataContent.indexOf(keyword)
|
73
|
+
if (indexTitle < 0 && indexContent < 0) {
|
74
|
+
isMatch = false
|
75
|
+
} else {
|
76
|
+
if (indexContent < 0) {
|
77
|
+
indexContent = 0
|
78
|
+
}
|
79
|
+
if (i === 0) {
|
80
|
+
firstOccur = indexContent
|
81
|
+
}
|
82
|
+
}
|
83
|
+
})
|
84
|
+
} else {
|
85
|
+
isMatch = false
|
86
|
+
}
|
87
|
+
|
88
|
+
// show search results
|
89
|
+
if (isMatch) {
|
90
|
+
if (firstOccur >= 0) {
|
91
|
+
// cut out 130 characters
|
92
|
+
let start = firstOccur - 30
|
93
|
+
let end = firstOccur + 100
|
94
|
+
let pre = ''
|
95
|
+
let post = ''
|
96
|
+
|
97
|
+
if (start < 0) {
|
98
|
+
start = 0
|
99
|
+
}
|
100
|
+
|
101
|
+
if (start === 0) {
|
102
|
+
end = 100
|
103
|
+
} else {
|
104
|
+
pre = '...'
|
105
|
+
}
|
106
|
+
|
107
|
+
if (end > dataContent.length) {
|
108
|
+
end = dataContent.length
|
109
|
+
} else {
|
110
|
+
post = '...'
|
111
|
+
}
|
112
|
+
|
113
|
+
let matchContent = dataContent.substring(start, end)
|
114
|
+
// highlight all keywords
|
115
|
+
keywords.forEach(keyword => {
|
116
|
+
const regex = new RegExp(`(?!<[^>]*?)(${keyword})(?![^<]*?>)`, 'gi')
|
117
|
+
matchContent = matchContent.replaceAll(regex, '<span class="search-keyword">$1</span>')
|
118
|
+
dataTitle = dataTitle.replaceAll(regex, '<span class="search-keyword">$1</span>')
|
119
|
+
})
|
120
|
+
|
121
|
+
str += '<div class="search__hit-item"><a href="' + dataUrl + '"><span class="search-result-title">' + dataTitle + '</span>'
|
122
|
+
count += 1
|
123
|
+
if (dataContent !== '') {
|
124
|
+
str += '<div class="search-result">' + pre + matchContent + post + '</div>'
|
125
|
+
}
|
126
|
+
}
|
127
|
+
str += '</a></div>'
|
128
|
+
}
|
129
|
+
})
|
130
|
+
if (count === 0) {
|
131
|
+
str += `<div id="search__hits-empty">${GLOBALCONFIG.lang.search.empty}</div>`
|
132
|
+
}else{
|
133
|
+
str += `<div class="search__hits-count">${GLOBALCONFIG.lang.search.hit.replace('${query}', '<span class="search-keyword">' + count + '</span>')}</div>`
|
134
|
+
}
|
135
|
+
str += '</div>'
|
136
|
+
$resultContent.innerHTML = str
|
137
|
+
if (keywords[0] !== '') $loadingStatus.innerHTML = ''
|
138
|
+
})
|
139
|
+
})
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
const searchClickFn = () => {
|
144
|
+
document.querySelector('#search-button > .search').addEventListener('click', search.openSearch)
|
145
|
+
}
|
146
|
+
|
147
|
+
const searchClickFnOnce = () => {
|
148
|
+
document.querySelector('#local-search .search-close-button').addEventListener('click', search.closeSearch)
|
149
|
+
$searchMask.addEventListener('click', search.closeSearch)
|
150
|
+
if (GLOBALCONFIG.localsearch.preload) dataObj = search.fetchData(GLOBALCONFIG.localsearch.path)
|
151
|
+
}
|
152
|
+
|
153
|
+
window.addEventListener('load', () => {
|
154
|
+
searchClickFn()
|
155
|
+
searchClickFnOnce()
|
156
|
+
})
|
157
|
+
|
158
|
+
window.addEventListener('pjax:complete', () => {
|
159
|
+
searchClickFn()
|
160
|
+
})
|