47 Commits

Author SHA1 Message Date
凡梦星尘
0db1dac57f Merge branch 'release_v4.2.0'
Some checks failed
sync-2-gitee / sync-2-gitee (push) Failing after 3s
2022-08-15 21:58:03 +08:00
凡梦星尘
c9d4a00120 🔖 Start for release v4.2.0. 2022-08-15 21:53:45 +08:00
凡梦星尘
9c102f9695 💄 Auto scroll to show overflow code block content. 2022-08-15 21:51:31 +08:00
凡梦星尘
5fb6618bd3 💄 Use scroll to show overflow code block content. 2022-08-15 21:36:22 +08:00
凡梦星尘
3de3e1de4d 💄 Make flinks page support note short code. 2022-08-13 16:27:15 +08:00
凡梦星尘
51eea3acc0 💄 Update the flinks show style in mobile driver. 2022-08-13 16:10:35 +08:00
凡梦星尘
be3bf4e1f2 🔧 Enable the robots file. 2022-08-13 14:32:56 +08:00
凡梦星尘
cbc39591d2 💄 Fixed the SVG image fixed width pixes over the div DOM. 2022-08-13 14:31:43 +08:00
凡梦星尘
3965c0c108 💄 Udpate sub folder archive page title with i18n support. 2022-08-10 22:07:03 +08:00
凡梦星尘
fc44e79ddd 🐛 Fixed the sidebar posts link with 404 error. 2022-08-09 17:56:07 +08:00
凡梦星尘
d3eb723e24 💄 Make note short code support without icon style. 2022-08-09 09:37:59 +08:00
凡梦星尘
b739434f8d 💄 🐛 Fixed code block line number background color style. 2022-08-09 09:23:37 +08:00
凡梦星尘
36b428f1d9 💄 🐛 Code block layout add more word break rules. 2022-08-08 14:33:09 +08:00
凡梦星尘
678b92c0a7 💄 🐛 Try to fixed the highlight code block over layout issue. 2022-08-08 12:56:01 +08:00
凡梦星尘
aa8a60d852 🎨 Use more standard parameter name which call avatar in flinks page. 2022-08-07 16:59:38 +08:00
凡梦星尘
30d161b1e2 💄 Fixed the highlight code block margin bottom pixels. 2022-08-07 11:48:05 +08:00
凡梦星尘
96ba605026 🐛 Fixed some configuration & display scripts. 2022-08-06 16:15:15 +08:00
凡梦星尘
1677648167 💄 Add quote & note shortcodes. Close #29 2022-08-06 15:18:13 +08:00
凡梦星尘
6cf961d392 💄 Implement the special page for friend's links show. Close #26 2022-08-05 15:18:52 +08:00
凡梦星尘
97799aaaa8 🐛 Fixed the archives list page permalink visit. 2022-08-02 18:42:33 +08:00
凡梦星尘
1f668be6fa 🐛 Fixed the build error due to about the syntax error 2022-08-02 18:34:55 +08:00
凡梦星尘
bb70f5b6a5 🔧 Try to fixed the Pre in section. 2022-08-02 18:18:26 +08:00
凡梦星尘
fdd49ab3cb 💄 Mark the search result of algolia search. 2022-08-02 15:12:49 +08:00
凡梦星尘
1917055634 🐛 Fixed the algolia search script find result in content. 2022-08-02 11:22:19 +08:00
凡梦星尘
7ed095d42c 🐛 Fixed the aloglia index content . 2022-08-01 17:18:56 +08:00
凡梦星尘
ac844e4e8c 🔧 Add algolia search indexes content. 2022-08-01 17:14:22 +08:00
凡梦星尘
34faa6f6f3 💄 Add algolia logo flag in search result. 2022-07-31 18:21:42 +08:00
凡梦星尘
c1e7e59646 🔧 🌱 Complete the algolia search feature, Close #9. 2022-07-31 18:01:57 +08:00
凡梦星尘
9a4883832f 🔧 🌱 Complete the local search feature. 2022-07-31 11:02:55 +08:00
凡梦星尘
6cbffe48b7 🔧 Re Change default section display not use archive page. 2022-07-30 17:39:57 +08:00
凡梦星尘
403a2e6f54 Merge branch 'release_v4.1.0'
Some checks failed
sync-2-gitee / sync-2-gitee (push) Failing after 3s
2022-07-27 21:43:21 +08:00
凡梦星尘
832953372a Merge branch 'release_v4.1.0' into develop 2022-07-27 21:42:45 +08:00
凡梦星尘
1171bcbfb3 🍱 Update the fontawesome version. 2022-07-27 21:29:04 +08:00
凡梦星尘
6ffddb602f 🔖 Start release Version 4.1.0 . 2022-07-27 13:56:02 +08:00
凡梦星尘
f430f0730b 🔧 Add Hugo version judge logic to avoid the lower version building. Closed #21 2022-07-27 11:21:03 +08:00
凡梦星尘
87301d1d83 🐛 fixed the SCSS build waring things. 2022-07-27 11:06:02 +08:00
凡梦星尘
e83dbabc3f 🔧 Archives page demo shows. 2022-07-26 22:18:43 +08:00
凡梦星尘
af59e93d25 🔧 Add special list for archives articles show. 2022-07-26 21:41:07 +08:00
凡梦星尘
d42375820d Use script to control comments container show. 2022-07-22 18:35:04 +08:00
凡梦星尘
31f6e21671 Improve page scripts configuration files. 2022-07-22 17:16:34 +08:00
凡梦星尘
a9ff14d312 🔧 Upgrade the config file settings. 2022-07-20 18:29:31 +08:00
凡梦星尘
12fbc945bc Improve site generate speed with use partialCached function. 2022-07-20 15:42:01 +08:00
凡梦星尘
ad271c1c20 Use dynamic function load analytic scripts avoid affecting the execution of page functions. 2022-07-20 09:03:11 +08:00
凡梦星尘
81cff8a5c2 Improved the comments plug-in load function, close #12 2022-07-13 21:25:15 +08:00
凡梦星尘
bf55ada93c 📝 Update the config description information. 2022-07-08 10:09:23 +08:00
凡梦星尘
1339ffe29b 🚧 Add new config parameters for Giscus comment. 2022-07-07 09:00:07 +08:00
凡梦星尘
c12cdf7b48 Merge branch 'release_v4.0.1' into develop 2022-07-05 22:08:07 +08:00
107 changed files with 1754 additions and 857 deletions

23
.gitignore vendored
View File

@@ -1,6 +1,25 @@
# Ignore files in Hugo NexT theme # Ignore files in Hugo NexT theme
exampleSite/ exampleSite/*
# Exclude special files in content folder
exampleSite/content/**/
!exampleSite/content !exampleSite/content
!exmapleSite/content/about.md
!exampleSite/content/archives
!exampleSite/content/post
# Exclude special files in data folder
!exampleSite/data
# Exclude special files in static folder
!exampleSite/static
# Exclude special files
!exampleSite/config.yaml
!exampleSite/start.sh !exampleSite/start.sh
!exampleSite/config.yaml
data/*
!data/config.yaml
!data/resources.yaml

View File

@@ -1 +1 @@
4.0.0 4.2.0

View File

@@ -0,0 +1,141 @@
.flinks-block {
.flinks-block-title {
text-align: center;
font-weight: bold;
}
.flinks-list-title {
font-size: 1.25em;
font-weight: bold;
}
.flinks-lists > div:not(:first-child) {
margin-top: 40px;
}
.flinks-list-desc {
font-style: italic;
}
.flinks-list-items {
overflow: auto;
padding: 10px 10px 0;
text-align: center;
.flinks-list-item {
@include mobile() {
display: flex;
justify-content: center;
align-items: center;
}
position: relative;
float: left;
overflow: hidden;
margin: 15px 7px;
width: calc(100% / 3 - 18px);
height: 90px;
border-radius: 8px;
line-height: 17px;
-webkit-transform: translateZ(0);
border: groove 1px var(--highlight-foreground);
box-shadow: .6rem .5rem 0.3rem var(--body-bg-color);
&:hover:before,
&:focus:before,
&:active:before {
-webkit-transform:scale(1);
-moz-transform:scale(1);
-o-transform:scale(1);
-ms-transform:scale(1);
transform: scale(1);
}
&:hover .flinks-item-icon {
margin-left:-10px;
width:0;
}
&:before {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: -1;
background: var(--body-bg-color);
content: ' ';
transition: transform .3s ease-out;
transform: scale(0);
}
a {
//color: var(--font-color);
text-decoration: none;
}
.flinks-item-icon {
float: left;
overflow: hidden;
margin: 15px 10px;
width: 60px;
height: 60px;
border-radius: 35px;
border: solid 1px var(--body-bg-color);
-webkit-transition: width .3s ease-out;
-moz-transition: width .3s ease-out;
-o-transition: width .3s ease-out;
-ms-transition: width .3s ease-out;
transition: width .3s ease-out;
img {
width: 100%;
height: 100%;
-webkit-transition: filter 375ms ease-in .2s,-webkit-transform .3s;
-moz-transition: filter 375ms ease-in .2s,-moz-transform .3s;
-o-transition: filter 375ms ease-in .2s,-o-transform .3s;
-ms-transition: filter 375ms ease-in .2s,-ms-transform .3s;
transition: filter 375ms ease-in .2s,transform .3s;
object-fit: cover;
}
}
.flinks-item-name, .flinks-item-desc {
overflow:hidden;
-o-text-overflow:ellipsis;
text-overflow:ellipsis;
white-space:nowrap
}
.flinks-item-name {
padding: 20px 0 0 0;
height: 20px;
font-weight: 700;
font-size: 1em;
font-weight: bold;
@include mobile() {
display: none;
}
}
.flinks-item-desc {
padding: 10px 0;
font-size: .92em;
@include mobile() {
display: none;
}
}
}
}
.flinks-page-desc {
margin-top: 20px;
}
}

View File

@@ -3,3 +3,4 @@
@import 'schedule'; @import 'schedule';
@import 'breadcrumb'; @import 'breadcrumb';
@import 'tag-cloud'; @import 'tag-cloud';
@import 'flinks';

View File

@@ -18,7 +18,7 @@
.use-motion { .use-motion {
@if $motion_trans_post_block { @if $motion_trans_post_block {
.post-block, .pagination, .comments, .post-comments { .post-block, .flinks-block, .pagination, .comments, .post-comments {
visibility: hidden; visibility: hidden;
} }
} }

View File

@@ -76,4 +76,8 @@
width: 100%; width: 100%;
} }
} }
svg {
max-width: 98%;
}
} }

View File

@@ -3,7 +3,7 @@
// Fix issue #16 // Fix issue #16
// To do: use `gap` instead of `margin` // To do: use `gap` instead of `margin`
// See https://caniuse.com/flexbox-gap // See https://caniuse.com/flexbox-gap
.post-footer { .post-footer, .flinks-list-footer {
@include flex-column(); @include flex-column();
hr{ hr{

View File

@@ -106,6 +106,13 @@
padding: 5px 0; padding: 5px 0;
} }
} }
mark.search-keyword {
background: transparent;
border-bottom: 1px dashed $red;
color: $red;
font-weight: bold;
}
} }
@if $algolia_search_enable { @if $algolia_search_enable {
@@ -169,11 +176,4 @@
margin: auto; margin: auto;
} }
} }
mark.search-keyword {
background: transparent;
border-bottom: 1px dashed $red;
color: $red;
font-weight: bold;
}
} }

View File

@@ -2,14 +2,29 @@
.highlight { .highlight {
background: var(--highlight-background); background: var(--highlight-background);
margin-bottom: 26px;
.table-container, pre { //TODO Need fixed the copy button show position.
div:first-child {
overflow-x: auto;
}
pre {
position: relative; position: relative;
} }
.table-container table tbody tr { table tbody tr {
background: none; //TODO Fixed the too long code line over
// layout background color.
background: #272822;
} }
/* pre > code span {
white-space: break-spaces;
overflow: hidden;
word-break: break-all;
word-wrap: break-word;
} */
} }
@if $codeblock_copy_btn_enable { @if $codeblock_copy_btn_enable {

View File

@@ -6,7 +6,7 @@
} }
pre { pre {
padding: 10px; padding: 18px;
margin: 0; margin: 0;
} }

View File

@@ -1,7 +1,7 @@
//@use 'sass:map'; //@use 'sass:map';
@if $note_style != 'disabled' { @if $note_style != 'disabled' {
.post-body .note { .main .note {
$note-icons : $note_icons; $note-icons : $note_icons;
$note-style : $note_style; $note-style : $note_style;

View File

@@ -25,7 +25,7 @@
// ================================================== // ==================================================
// Post blocks. // Post blocks.
.main-inner > { .main-inner > {
.sub-menu, .post-block, .tabs-comment, .comments, .post-comments, .pagination { .sub-menu, .post-block, .flinks-block, .tabs-comment, .comments, .post-comments, .pagination {
background: var(--content-bg-color); background: var(--content-bg-color);
border-radius: $border-radius-inner; border-radius: $border-radius-inner;
box-shadow: $box-shadow-inner; box-shadow: $box-shadow-inner;
@@ -47,7 +47,7 @@
} }
// Post & Comments blocks. // Post & Comments blocks.
.post-block, .comments, .post-comments { .post-block, .flinks-block, .comments, .post-comments {
padding: $content-desktop-padding; padding: $content-desktop-padding;
} }
@@ -91,7 +91,7 @@
} }
} }
.post-block { .post-block, .flinks-block {
// Inside posts blocks content padding (default 40px). // Inside posts blocks content padding (default 40px).
padding: ($content-tablet-padding * 2); padding: ($content-tablet-padding * 2);
} }
@@ -119,7 +119,7 @@
} }
} }
.post-block { .post-block, .flinks-block {
// Inside posts blocks content padding (default 40px). // Inside posts blocks content padding (default 40px).
padding: $sidebar-offset; padding: $sidebar-offset;
} }

View File

@@ -131,9 +131,9 @@ $gitter_enable : {{ $P.gitter.enable }};
// Comment // Comment
//$disqusjs_enable : {{ $P.disqusjs.enable }}; //$disqusjs_enable : {{ $P.disqusjs.enable }};
$disqusjs_enable : false; $disqusjs_enable : false;
$livere_enable : {{ isset $P.livere "uid" }}; $livere_enable : {{ isset $P "livere" }};
$utterances_enable : {{ isset $P.utterances "utterances" }}; $utterances_enable : {{ isset $P "utterances" }};
$waline_enable : {{ isset $P.waline "serverurl" }}; $waline_enable : {{ isset $P "waline" }};
{{- with .Site.Params.comments }} {{- with .Site.Params.comments }}
{{- $tce := and (isset . "nav") (and .storage (gt (len .nav) 1)) }} {{- $tce := and (isset . "nav") (and .storage (gt (len .nav) 1)) }}
$two_comments_enable : {{ $tce }}; $two_comments_enable : {{ $tce }};

View File

@@ -52,5 +52,5 @@ document.addEventListener('DOMContentLoaded', () => {
document.addEventListener('pjax:success', scrollToMark); document.addEventListener('pjax:success', scrollToMark);
}; };
init(CONFIG.bookmark.save); init(NexT.CONFIG.bookmark.save);
}); });

View File

@@ -7,13 +7,13 @@
element.addEventListener('click', () => { element.addEventListener('click', () => {
commentButton.forEach(active => active.classList.toggle('active', active === element)); commentButton.forEach(active => active.classList.toggle('active', active === element));
document.querySelectorAll('.comment-position').forEach(active => active.classList.toggle('active', active.classList.contains(commentClass))); document.querySelectorAll('.comment-position').forEach(active => active.classList.toggle('active', active.classList.contains(commentClass)));
if (CONFIG.comments.storage) { if (NexT.CONFIG.comments.storage) {
localStorage.setItem('comments_active', commentClass); localStorage.setItem('comments_active', commentClass);
} }
}); });
}); });
let { activeClass } = CONFIG.comments; let { activeClass } = NexT.CONFIG.comments;
if (CONFIG.comments.storage) { if (NexT.CONFIG.comments.storage) {
activeClass = localStorage.getItem('comments_active') || activeClass; activeClass = localStorage.getItem('comments_active') || activeClass;
} }
if (activeClass) { if (activeClass) {

View File

@@ -1,8 +1,8 @@
/* global CONFIG */ /* global CONFIG */
window.addEventListener('tabs:register', () => { window.addEventListener('tabs:register', () => {
let { activeClass } = CONFIG.comments; let { activeClass } = NexT.CONFIG.comments;
if (CONFIG.comments.storage) { if (NexT.CONFIG.comments.storage) {
activeClass = localStorage.getItem('comments_active') || activeClass; activeClass = localStorage.getItem('comments_active') || activeClass;
} }
if (activeClass) { if (activeClass) {
@@ -12,7 +12,7 @@ window.addEventListener('tabs:register', () => {
} }
} }
}); });
if (CONFIG.comments.storage) { if (NexT.CONFIG.comments.storage) {
window.addEventListener('tabs:click', event => { window.addEventListener('tabs:click', event => {
if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return; if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
const commentClass = event.target.classList[1]; const commentClass = event.target.classList[1];

View File

@@ -1,51 +1,67 @@
if (!window.NexT) window.NexT = {}; if (!window.NexT) window.NexT = {};
(function() { (function() {
const className = 'next-config';
const siteConfig = { const staticConfig = {};
"hostname" : "{{ .Site.BaseURL }}", let variableConfig = {};
"root" : "/",
"images" : "{{ .Site.Params.images }}", const parse = text => JSON.parse(text || '{}');
"scheme" : "{{ .Site.Params.scheme }}",
"darkmode" : {{ .Site.Params.darkmode }}, const update = name => {
"version" : "{{ .Site.Data.config.version }}", const targetEle = document.querySelector(`.${className}[data-name="${name}"]`);
"sidebar" : {{ .Site.Params.sidebar | jsonify }}, if (!targetEle) return;
"copybtn" : {{ .Site.Params.codeblock.copyBtn }}, const parsedConfig = parse(targetEle.text);
"bookmark" : {{ .Site.Params.bookmark | jsonify }}, if (name === 'main') {
"comments" : {{ .Site.Params.comments | jsonify }}, Object.assign(staticConfig, parsedConfig);
"lazyload" : {{ .Site.Params.lazyload }}, } else {
"pangu" : {{ .Site.Params.pangu }}, variableConfig[name] = parsedConfig;
"stickytabs" : {{ .Site.Params.tabs.sticky }},
"motion" : {{ .Site.Params.motion | jsonify }},
// TODO Find prismjs
//"prism" : "",
"i18n" : {
"placeholder" : "",
"empty" : "${query}",
"hits_time" : "'${hits}', '${time}'",
"hits" : "${hits}"
},
{{- if .Site.Params.algoliaSearch.enable }}
// TODO
"algolia" : {
"appID" : "",
"apiKey" : "",
"indexName" : "",
"hits" : ""
} }
{{- end }}
{{- if .Site.Params.localSearch.enable }}
// TODO
"path" : "/search.json",
"localsearch": {{ .Site.Params.localSearch | jsonify }},
{{- end }}
"lang" : "{{ .Site.LanguageCode }}",
"permalink" : "{{ .Page.Permalink | absURL }}",
"title" : "{{ .Page.Title }}",
"isHome" : {{ .IsHome }},
"isPage" : {{ .IsPage }}
}; };
window.CONFIG = new Proxy(siteConfig, {});
update('main');
window.NexT.CONFIG = new Proxy({}, {
get(overrideConfig, name) {
let existing;
if (name in staticConfig) {
existing = staticConfig[name];
} else {
if (!(name in variableConfig)) update(name);
existing = variableConfig[name];
}
// For unset override and mixable existing
if (!(name in overrideConfig) && typeof existing === 'object') {
// Get ready to mix.
overrideConfig[name] = {};
}
if (name in overrideConfig) {
const override = overrideConfig[name];
// When mixable
if (typeof override === 'object' && typeof existing === 'object') {
// Mix, proxy changes to the override.
return new Proxy({ ...existing, ...override }, {
set(target, prop, value) {
target[prop] = value;
override[prop] = value;
return true;
}
});
}
return override;
}
// Only when not mixable and override hasn't been set.
return existing;
}
});
// TODO
// document.addEventListener('pjax:success', () => {
// variableConfig = {};
// });
})(); })();

View File

@@ -10,12 +10,12 @@ NexT.motion.integrator = {
}, },
add: function(fn) { add: function(fn) {
const sequence = fn(); const sequence = fn();
if (CONFIG.motion.async) this.queue.push(sequence); if (NexT.CONFIG.motion.async) this.queue.push(sequence);
else this.queue = this.queue.concat(sequence); else this.queue = this.queue.concat(sequence);
return this; return this;
}, },
bootstrap: function() { bootstrap: function() {
if (!CONFIG.motion.async) this.queue = [this.queue]; if (!NexT.CONFIG.motion.async) this.queue = [this.queue];
this.queue.forEach(sequence => { this.queue.forEach(sequence => {
const timeline = window.anime.timeline({ const timeline = window.anime.timeline({
duration: 200, duration: 200,
@@ -52,12 +52,12 @@ NexT.motion.middleWares = {
} }
pushToSequence('header.header'); pushToSequence('header.header');
CONFIG.scheme === 'Mist' && getMistLineSettings('.logo-line'); NexT.CONFIG.scheme === 'Mist' && getMistLineSettings('.logo-line');
CONFIG.scheme === 'Muse' && pushToSequence('.custom-logo-image'); NexT.CONFIG.scheme === 'Muse' && pushToSequence('.custom-logo-image');
pushToSequence('.site-title'); pushToSequence('.site-title');
pushToSequence('.site-brand-container .toggle', true); pushToSequence('.site-brand-container .toggle', true);
pushToSequence('.site-subtitle'); pushToSequence('.site-subtitle');
(CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini') && pushToSequence('.custom-logo-image'); (NexT.CONFIG.scheme === 'Pisces' || NexT.CONFIG.scheme === 'Gemini') && pushToSequence('.custom-logo-image');
document.querySelectorAll('.menu-item').forEach(targets => { document.querySelectorAll('.menu-item').forEach(targets => {
sequence.push({ sequence.push({
@@ -82,7 +82,7 @@ NexT.motion.middleWares = {
postList: function() { postList: function() {
const sequence = []; const sequence = [];
const { postblock, postheader, postbody, collheader } = CONFIG.motion.transition; const { postblock, postheader, postbody, collheader } = NexT.CONFIG.motion.transition;
function animate(animation, selector) { function animate(animation, selector) {
if (!animation) return; if (!animation) return;
@@ -95,7 +95,7 @@ NexT.motion.middleWares = {
}); });
} }
animate(postblock, '.post-block, .pagination, .post-comments'); animate(postblock, '.post-block,.flinks-block, .pagination, .post-comments');
animate(collheader, '.collection-header'); animate(collheader, '.collection-header');
animate(postheader, '.post-header'); animate(postheader, '.post-header');
animate(postbody, '.post-body'); animate(postbody, '.post-body');
@@ -105,9 +105,9 @@ NexT.motion.middleWares = {
sidebar: function() { sidebar: function() {
const sidebar = document.querySelector('.sidebar'); const sidebar = document.querySelector('.sidebar');
const sidebarTransition = CONFIG.motion.transition.sidebar; const sidebarTransition = NexT.CONFIG.motion.transition.sidebar;
// Only for Pisces | Gemini. // Only for Pisces | Gemini.
if (sidebarTransition && (CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini')) { if (sidebarTransition && (NexT.CONFIG.scheme === 'Pisces' || NexT.CONFIG.scheme === 'Gemini')) {
return [{ return [{
targets : sidebar, targets : sidebar,
complete: () => sidebar.classList.add('animated', sidebarTransition) complete: () => sidebar.classList.add('animated', sidebarTransition)

View File

@@ -5,7 +5,7 @@ NexT.boot = {};
NexT.boot.registerEvents = function() { NexT.boot.registerEvents = function() {
NexT.utils.registerScrollPercent(); NexT.utils.registerScrollPercent();
NexT.utils.registerCanIUseTag(); // NexT.utils.registerCanIUseTag();
// Mobile top menu bar. // Mobile top menu bar.
document.querySelector('.site-nav-toggle .toggle').addEventListener('click', event => { document.querySelector('.site-nav-toggle .toggle').addEventListener('click', event => {
@@ -33,33 +33,41 @@ NexT.boot.registerEvents = function() {
NexT.boot.refresh = function() { NexT.boot.refresh = function() {
/** if (!NexT.CONFIG.page.isPage) return;
NexT.utils.registerSidebarTOC();
NexT.utils.replacePostCRLink();
NexT.utils.registerCopyCode();
NexT.utils.registerPostReward();
if(NexT.CONFIG.page.comments) {
NexT.utils.initCommontesDispaly();
NexT.utils.registerCommonSwitch();
} else {
NexT.utils.hideCommontes();
}
//TODO
/**
* Register JS handlers by condition option. * Register JS handlers by condition option.
* Need to add config option in Front-End at 'scripts/helpers/next-config.js' file. * Need to add config option in Front-End at 'scripts/helpers/next-config.js' file.
*/ */
//CONFIG.prism && window.Prism.highlightAll(); //NexT.CONFIG.prism && window.Prism.highlightAll();
/*CONFIG.mediumzoom && window.mediumZoom('.post-body :not(a) > img, .post-body > img', { /*NexT.CONFIG.mediumzoom && window.mediumZoom('.post-body :not(a) > img, .post-body > img', {
background: 'var(--content-bg-color)' background: 'var(--content-bg-color)'
});*/ });*/
CONFIG.lazyload && window.lozad('.post-body img').observe(); // NexT.CONFIG.lazyload && window.lozad('.post-body img').observe();
CONFIG.pangu && window.pangu.spacingPage(); // NexT.CONFIG.pangu && window.pangu.spacingPage();
/*NexT.utils.registerTabsTag();
CONFIG.isPage && NexT.utils.replacePostCRLink(); NexT.utils.registerActiveMenuItem();
CONFIG.isPage && CONFIG.copybtn && NexT.utils.registerCopyCode();
NexT.utils.registerTabsTag();
/*NexT.utils.registerActiveMenuItem();
NexT.utils.registerLangSelect();*/ NexT.utils.registerLangSelect();*/
CONFIG.isPage && NexT.utils.registerSidebarTOC(); /*NexT.utils.wrapTableWithBox();
CONFIG.isPage && NexT.utils.registerPostReward(); NexT.utils.registerVideoIframe();*/
CONFIG.isPage && NexT.utils.initCommontesDispaly();
CONFIG.isPage && NexT.utils.registerCommonSwitch();
NexT.utils.wrapTableWithBox();
NexT.utils.registerVideoIframe();
}; };
NexT.boot.motion = function() { NexT.boot.motion = function() {
// Define Motion Sequence & Bootstrap Motion. // Define Motion Sequence & Bootstrap Motion.
if (CONFIG.motion.enable) { if (NexT.CONFIG.motion.enable) {
NexT.motion.integrator NexT.motion.integrator
.add(NexT.motion.middleWares.header) .add(NexT.motion.middleWares.header)
.add(NexT.motion.middleWares.postList) .add(NexT.motion.middleWares.postList)
@@ -72,6 +80,6 @@ NexT.boot.motion = function() {
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
NexT.boot.registerEvents(); NexT.boot.registerEvents();
NexT.boot.refresh();
NexT.boot.motion(); NexT.boot.motion();
NexT.boot.refresh();
}); });

View File

@@ -11,21 +11,21 @@ const pjax = new Pjax({
], ],
analytics: false, analytics: false,
cacheBust: false, cacheBust: false,
scrollTo : !CONFIG.bookmark.enable scrollTo : !NexT.CONFIG.bookmark.enable
}); });
document.addEventListener('pjax:success', () => { document.addEventListener('pjax:success', () => {
pjax.executeScripts(document.querySelectorAll('script[data-pjax]')); pjax.executeScripts(document.querySelectorAll('script[data-pjax]'));
NexT.boot.refresh(); NexT.boot.refresh();
// Define Motion Sequence & Bootstrap Motion. // Define Motion Sequence & Bootstrap Motion.
if (CONFIG.motion.enable) { if (NexT.CONFIG.motion.enable) {
NexT.motion.integrator NexT.motion.integrator
.init() .init()
.add(NexT.motion.middleWares.subMenu) .add(NexT.motion.middleWares.subMenu)
.add(NexT.motion.middleWares.postList) .add(NexT.motion.middleWares.postList)
.bootstrap(); .bootstrap();
} }
if (CONFIG.sidebar.display !== 'remove') { if (NexT.CONFIG.sidebar.display !== 'remove') {
const hasTOC = document.querySelector('.post-toc'); const hasTOC = document.querySelector('.post-toc');
document.querySelector('.sidebar-inner').classList.toggle('sidebar-nav-active', hasTOC); document.querySelector('.sidebar-inner').classList.toggle('sidebar-nav-active', hasTOC);
NexT.utils.activateSidebarPanel(hasTOC ? 0 : 1); NexT.utils.activateSidebarPanel(hasTOC ? 0 : 1);

View File

@@ -2,7 +2,7 @@
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const isRight = CONFIG.sidebar.position === 'right'; const isRight = NexT.CONFIG.sidebar.position === 'right';
const sidebarToggleMotion = { const sidebarToggleMotion = {
mouse: {}, mouse: {},
@@ -46,7 +46,7 @@ document.addEventListener('DOMContentLoaded', () => {
document.body.classList.remove('sidebar-active'); document.body.classList.remove('sidebar-active');
} }
}; };
if (CONFIG.sidebar.display !== 'remove') sidebarToggleMotion.init(); if (NexT.CONFIG.sidebar.display !== 'remove') sidebarToggleMotion.init();
function updateFooterPosition() { function updateFooterPosition() {
const footer = document.querySelector('.footer'); const footer = document.querySelector('.footer');

View File

@@ -0,0 +1,36 @@
document.addEventListener('DOMContentLoaded', () => {
const element = '.artalk-container';
if (!NexT.CONFIG.page.comments
|| !NexT.CONFIG.artalk
|| !NexT.utils.checkDOMExist(element)) return;
const artalk_css = NexT.utils.getCDNResource(NexT.CONFIG.artalk.css);
NexT.utils.getStyle(artalk_css, null);
const artalk_js = NexT.utils.getCDNResource(NexT.CONFIG.artalk.js);
const {
site,
placeholder,
server,
} = NexT.CONFIG.artalk.cfg;
NexT.utils.loadComments(element)
.then(() => NexT.utils.getScript(artalk_js, {
}))
.then(() => {
new Artalk({
el : element,
pageKey : NexT.CONFIG.permalink,
pageTitle : NexT.CONFIG.title,
server : server,
site : site,
locale : NexT.CONFIG.lang,
placeholder : placeholder,
darkMode : 'auto'
});
NexT.utils.hiddeLodingCmp(element);
});
});

View File

@@ -1,39 +0,0 @@
/* global NexT, CONFIG */
document.addEventListener('page:loaded', () => {
const { appid, appkey } = CONFIG.changyan;
const mainJs = 'https://cy-cdn.kuaizhan.com/upload/changyan.js';
const countJs = `https://cy-cdn.kuaizhan.com/upload/plugins/plugins.list.count.js?clientId=${appid}`;
// Get the number of comments
setTimeout(() => {
return NexT.utils.getScript(countJs, {
attributes: {
async: true,
id : 'cy_cmt_num'
}
});
}, 0);
// When scroll to comment section
if (CONFIG.page.comments && !CONFIG.page.isHome) {
NexT.utils.loadComments('#SOHUCS')
.then(() => {
return NexT.utils.getScript(mainJs, {
attributes: {
async: true
}
});
})
.then(() => {
window.changyan.api.config({
appid,
conf: appkey
});
})
.catch(error => {
// eslint-disable-next-line no-console
console.error('Failed to load Changyan', error);
});
}
});

View File

@@ -1,41 +0,0 @@
/* global NexT, CONFIG, DISQUS */
document.addEventListener('page:loaded', () => {
if (CONFIG.disqus.count) {
const loadCount = () => {
NexT.utils.getScript(`https://${CONFIG.disqus.shortname}.disqus.com/count.js`, {
attributes: { id: 'dsq-count-scr' }
});
};
// defer loading until the whole page loading is completed
window.addEventListener('load', loadCount, false);
}
if (CONFIG.page.comments) {
// `disqus_config` should be a global variable
// See https://help.disqus.com/en/articles/1717084-javascript-configuration-variables
window.disqus_config = function() {
this.page.url = CONFIG.page.permalink;
this.page.identifier = CONFIG.page.path;
this.page.title = CONFIG.page.title;
if (CONFIG.disqus.i18n.disqus !== 'disqus') {
this.language = CONFIG.disqus.i18n.disqus;
}
};
NexT.utils.loadComments('#disqus_thread').then(() => {
if (window.DISQUS) {
DISQUS.reset({
reload: true,
config: window.disqus_config
});
} else {
NexT.utils.getScript(`https://${CONFIG.disqus.shortname}.disqus.com/embed.js`, {
attributes: { dataset: { timestamp: '' + +new Date() } }
});
}
});
}
});

View File

@@ -1,18 +0,0 @@
/* global NexT, CONFIG, DisqusJS */
document.addEventListener('page:loaded', () => {
if (!CONFIG.page.comments) return;
NexT.utils.loadComments('#disqus_thread')
.then(() => NexT.utils.getScript(CONFIG.disqusjs.js, { condition: window.DisqusJS }))
.then(() => {
window.dsqjs = new DisqusJS({
api : CONFIG.disqusjs.api || 'https://disqus.com/api/',
apikey : CONFIG.disqusjs.apikey,
shortname : CONFIG.disqusjs.shortname,
url : CONFIG.page.permalink,
identifier: CONFIG.page.path,
title : CONFIG.page.title
});
});
});

View File

@@ -0,0 +1,41 @@
document.addEventListener('DOMContentLoaded', () => {
const element = '.giscus-container';
if (!NexT.CONFIG.page.comments
|| !NexT.CONFIG.giscus
|| !NexT.utils.checkDOMExist(element)) return;
const {
category,
categoryid,
emit,
inputposition,
mapping,
reactions,
repo,
repoid,
theme } = NexT.CONFIG.giscus.cfg;
NexT.utils.loadComments(element)
.then(() => NexT.utils.getScript(NexT.CONFIG.giscus.js, {
attributes: {
'async' : true,
'crossorigin' : 'anonymous',
'data-repo' : repo,
'data-repo-id' : repoid,
'data-category' : category,
'data-category-id' : categoryid,
'data-mapping' : mapping,
'data-reactions-enabled' : reactions ? 1:0,
'data-emit-metadata' : emit ? 1:0,
'data-input-position' : inputposition,
'data-theme' : theme,
'data-lang' : NexT.CONFIG.lang,
'data-loading' : 'lazy'
},
parentNode: document.querySelector(element)
}));
NexT.utils.hiddeLodingCmp(element);
});

View File

@@ -1,24 +0,0 @@
/* global NexT, CONFIG, Gitalk */
document.addEventListener('page:loaded', () => {
if (!CONFIG.page.comments) return;
NexT.utils.loadComments('.gitalk-container')
.then(() => NexT.utils.getScript(CONFIG.gitalk.js, {
condition: window.Gitalk
}))
.then(() => {
const gitalk = new Gitalk({
clientID : CONFIG.gitalk.client_id,
clientSecret : CONFIG.gitalk.client_secret,
repo : CONFIG.gitalk.repo,
owner : CONFIG.gitalk.github_id,
admin : [CONFIG.gitalk.admin_user],
id : CONFIG.gitalk.path_md5,
proxy : CONFIG.gitalk.proxy,
language : CONFIG.gitalk.language || window.navigator.language,
distractionFreeMode: CONFIG.gitalk.distraction_free_mode
});
gitalk.render(document.querySelector('.gitalk-container'));
});
});

View File

@@ -1,15 +0,0 @@
/* global NexT, CONFIG */
document.addEventListener('page:loaded', () => {
if (!CONFIG.page.comments) return;
NexT.utils.loadComments('#isso-thread')
.then(() => NexT.utils.getScript(`${CONFIG.isso}js/embed.min.js`, {
attributes: {
dataset: {
isso: `${CONFIG.isso}`
}
},
parentNode: document.querySelector('#isso-thread')
}));
});

View File

@@ -1,19 +1,18 @@
/* global NexT, CONFIG, LivereTower */ document.addEventListener('DOMContentLoaded', () => {
document.addEventListener('page:loaded', () => { const element = '#lv-container';
if (!CONFIG.page.comments) return; if (!NexT.CONFIG.page.comments
|| !NexT.CONFIG.livere
|| !NexT.utils.checkDOMExist(element)) return;
NexT.utils.loadComments('#lv-container').then(() => { NexT.utils.loadComments(element).then(() => {
window.livereOptions = { NexT.utils.getScript(NexT.CONFIG.livere.js, {
refer: CONFIG.page.path.replace(/index\.html$/, '')
};
if (typeof LivereTower === 'function') return;
NexT.utils.getScript('https://cdn-city.livere.com/js/embed.dist.js', {
attributes: { attributes: {
async: true async: true
} },
parentNode: document.querySelector(element)
}); });
NexT.utils.hiddeLodingCmp(element);
}); });
}); });

View File

@@ -1,17 +1,27 @@
/* global NexT, CONFIG */ document.addEventListener('DOMContentLoaded', () => {
document.addEventListener('page:loaded', () => { const element = '.utterances-container';
if (!CONFIG.page.comments) return; if (!NexT.CONFIG.page.comments
|| !NexT.CONFIG.utterances
|| !NexT.utils.checkDOMExist(element)) return;
NexT.utils.loadComments('.utterances-container') const {
.then(() => NexT.utils.getScript('https://utteranc.es/client.js', { repo,
issueterm,
label,
theme } = NexT.CONFIG.utterances.cfg;
NexT.utils.loadComments(element)
.then(() => NexT.utils.getScript(NexT.CONFIG.utterances.js, {
attributes: { attributes: {
async : true, 'async' : true,
crossOrigin : 'anonymous', 'crossorigin' : 'anonymous',
'repo' : CONFIG.utterances.repo, 'repo' : repo,
'issue-term': CONFIG.utterances.issue_term, 'issue-term' : issueterm,
'theme' : CONFIG.utterances.theme 'theme' : theme
}, },
parentNode: document.querySelector('.utterances-container') parentNode: document.querySelector(element)
})); }));
NexT.utils.hiddeLodingCmp(element);
}); });

View File

@@ -0,0 +1,48 @@
document.addEventListener('DOMContentLoaded', () => {
const element = '.waline-container';
if (!NexT.CONFIG.page.comments
|| !NexT.CONFIG.waline
|| !NexT.utils.checkDOMExist(element)) return;
const {
emoji,
imguploader,
pageview,
placeholder,
requiredmeta,
serverurl,
wordlimit
} = NexT.CONFIG.waline.cfg;
const waline_css = NexT.utils.getCDNResource(NexT.CONFIG.waline.css);
NexT.utils.getStyle(waline_css, null);
const waline_js = NexT.utils.getCDNResource(NexT.CONFIG.waline.js);
const locale = {
placeholder: placeholder
};
NexT.utils.loadComments(element)
.then(() => NexT.utils.getScript(waline_js, {
}))
.then(() => {
Waline.init({
locale,
el : element,
pageview : pageview,
emoji : emoji,
imageUploader : imguploader,
wordLimit : wordlimit,
requiredMeta : requiredmeta,
serverURL : serverurl,
lang : NexT.CONFIG.lang,
dark : "auto"
});
NexT.utils.hiddeLodingCmp(element);
});
});

View File

@@ -1,130 +0,0 @@
/* global instantsearch, algoliasearch, CONFIG, pjax */
document.addEventListener('DOMContentLoaded', () => {
const { indexName, appID, apiKey, hits } = CONFIG.algolia;
const search = instantsearch({
indexName,
searchClient : algoliasearch(appID, apiKey),
searchFunction: helper => {
if (document.querySelector('.search-input').value) {
helper.search();
}
}
});
if (typeof pjax === 'object') {
search.on('render', () => {
pjax.refresh(document.querySelector('.algolia-hits'));
});
}
// Registering Widgets
search.addWidgets([
instantsearch.widgets.configure({
hitsPerPage: hits.per_page || 10
}),
instantsearch.widgets.searchBox({
container : '.search-input-container',
placeholder : CONFIG.i18n.placeholder,
// Hide default icons of algolia search
showReset : false,
showSubmit : false,
showLoadingIndicator: false,
cssClasses : {
input: 'search-input'
}
}),
instantsearch.widgets.stats({
container: '.algolia-stats',
templates: {
text: data => {
const stats = CONFIG.i18n.hits_time
.replace('${hits}', data.nbHits)
.replace('${time}', data.processingTimeMS);
return `<span>${stats}</span>
<img src="${CONFIG.images}/logo-algolia-nebula-blue-full.svg" alt="Algolia">`;
}
},
cssClasses: {
text: 'search-stats'
}
}),
instantsearch.widgets.hits({
container : '.algolia-hits',
escapeHTML: false,
templates : {
item: data => {
const { title, excerpt, excerptStrip, contentStripTruncate } = data._highlightResult;
let result = `<a href="${data.permalink}" class="search-result-title">${title.value}</a>`;
const content = excerpt || excerptStrip || contentStripTruncate;
if (content && content.value) {
const div = document.createElement('div');
div.innerHTML = content.value;
result += `<a href="${data.permalink}"><p class="search-result">${div.textContent.substring(0, 100)}...</p></a>`;
}
return result;
},
empty: data => {
return `<div class="algolia-hits-empty">
${CONFIG.i18n.empty.replace('${query}', data.query)}
</div>`;
}
},
cssClasses: {
list: 'search-result-list'
}
}),
instantsearch.widgets.pagination({
container: '.algolia-pagination',
scrollTo : false,
showFirst: false,
showLast : false,
templates: {
first : '<i class="fa fa-angle-double-left"></i>',
last : '<i class="fa fa-angle-double-right"></i>',
previous: '<i class="fa fa-angle-left"></i>',
next : '<i class="fa fa-angle-right"></i>'
},
cssClasses: {
list : ['pagination', 'algolia-pagination'],
item : 'pagination-item',
link : 'page-number',
selectedItem: 'current',
disabledItem: 'disabled-item'
}
})
]);
search.start();
// Handle and trigger popup window
document.querySelectorAll('.popup-trigger').forEach(element => {
element.addEventListener('click', () => {
document.body.classList.add('search-active');
setTimeout(() => document.querySelector('.search-input').focus(), 500);
});
});
// Monitor main search box
const onPopupClose = () => {
document.body.classList.remove('search-active');
};
document.querySelector('.search-pop-overlay').addEventListener('click', event => {
if (event.target === document.querySelector('.search-pop-overlay')) {
onPopupClose();
}
});
document.querySelector('.popup-btn-close').addEventListener('click', onPopupClose);
document.addEventListener('pjax:success', onPopupClose);
window.addEventListener('keyup', event => {
if (event.key === 'Escape') {
onPopupClose();
}
});
});

144
assets/js/third-party/search/algolia.js vendored Normal file
View File

@@ -0,0 +1,144 @@
/* global instantsearch, algoliasearch, CONFIG, pjax */
document.addEventListener('DOMContentLoaded', () => {
const algoiajs = NexT.utils.getCDNResource(NexT.CONFIG.algolia.js);
const instantschjs = NexT.utils.getCDNResource(NexT.CONFIG.algolia.instantjs);
NexT.utils.getScript(algoiajs, {});
NexT.utils.getScript(instantschjs, {}).then(() => {
const { indexname, appid, apikey, hits } = NexT.CONFIG.algolia.cfg;
const indexName = indexname;
const search = instantsearch({
indexName,
searchClient: algoliasearch(appid, apikey),
searchFunction: helper => {
if (document.querySelector('.search-input').value) {
helper.search();
}
}
});
const markKeyWords = function(content) {
return content.replaceAll("<mark>", '<mark class="search-keyword">');
};
if (typeof pjax === 'object') {
search.on('render', () => {
pjax.refresh(document.querySelector('.algolia-hits'));
});
}
// Registering Widgets
search.addWidgets([
instantsearch.widgets.configure({
hitsPerPage: hits.perpage || 10
}),
instantsearch.widgets.searchBox({
container: '.search-input-container',
placeholder: NexT.CONFIG.i18n.placeholder,
// Hide default icons of algolia search
showReset: false,
showSubmit: false,
showLoadingIndicator: true,
cssClasses: {
input: 'search-input'
}
}),
instantsearch.widgets.stats({
container: '.algolia-stats',
templates: {
text: data => {
const stats = NexT.CONFIG.i18n.hits_time
.replace('${hits}', data.nbHits)
.replace('${time}', data.processingTimeMS);
return `<span>${stats}</span><img src="/imgs/algolia-logo.svg" alt="Algolia">`;
}
},
cssClasses: {
text: 'search-stats'
}
}),
instantsearch.widgets.hits({
container: '.algolia-hits',
escapeHTML: true,
templates: {
item: data => {
const { title, content } = data._highlightResult;
let result = `<a href="${data.permalink}" class="search-result-title">${markKeyWords(title.value)}</a>`;
//const content = excerpt || excerptStrip || content;
if (content && content.value) {
const div = document.createElement('div');
div.innerHTML = markKeyWords(content.value);
result += `<a href="${data.permalink}"><p class="search-result">${div.innerHTML.substring(0, 200)}...</p></a>`;
}
return result;
},
empty: data => {
return `<div class="algolia-hits-empty">
${NexT.CONFIG.i18n.empty.replace('${query}', data.query)}
</div>`;
}
},
cssClasses: {
list: 'search-result-list'
}
}),
instantsearch.widgets.pagination({
container: '.algolia-pagination',
scrollTo: false,
showFirst: true,
showLast: true,
templates: {
first: '<i class="fa fa-angle-double-left"></i>',
last: '<i class="fa fa-angle-double-right"></i>',
previous: '<i class="fa fa-angle-left"></i>',
next: '<i class="fa fa-angle-right"></i>'
},
cssClasses: {
list: ['pagination', 'algolia-pagination'],
item: 'pagination-item',
link: 'page-number',
selectedItem: 'current',
disabledItem: 'disabled-item'
}
})
]);
search.start();
// Handle and trigger popup window
document.querySelectorAll('.popup-trigger').forEach(element => {
element.addEventListener('click', () => {
document.body.classList.add('search-active');
setTimeout(() => document.querySelector('.search-input').focus(), 500);
});
});
// Monitor main search box
const onPopupClose = () => {
document.body.classList.remove('search-active');
};
document.querySelector('.search-pop-overlay').addEventListener('click', event => {
if (event.target === document.querySelector('.search-pop-overlay')) {
onPopupClose();
}
});
document.querySelector('.popup-btn-close').addEventListener('click', onPopupClose);
document.addEventListener('pjax:success', onPopupClose);
window.addEventListener('keyup', event => {
if (event.key === 'Escape') {
onPopupClose();
}
});
});;
});

View File

@@ -1,99 +0,0 @@
/* global CONFIG, pjax, LocalSearch */
document.addEventListener('DOMContentLoaded', () => {
if (!CONFIG.path) {
// Search DB path
console.warn('`hexo-generator-searchdb` plugin is not installed!');
return;
}
const localSearch = new LocalSearch({
path : CONFIG.path,
top_n_per_article: CONFIG.localsearch.top_n_per_article,
unescape : CONFIG.localsearch.unescape
});
const input = document.querySelector('.search-input');
const inputEventFunction = () => {
if (!localSearch.isfetched) return;
const searchText = input.value.trim().toLowerCase();
const keywords = searchText.split(/[-\s]+/);
const container = document.querySelector('.search-result-container');
let resultItems = [];
if (searchText.length > 0) {
// Perform local searching
resultItems = localSearch.getResultItems(keywords);
}
if (keywords.length === 1 && keywords[0] === '') {
container.classList.add('no-result');
container.innerHTML = '<div class="search-result-icon"><i class="fa fa-search fa-5x"></i></div>';
} else if (resultItems.length === 0) {
container.classList.add('no-result');
container.innerHTML = '<div class="search-result-icon"><i class="far fa-frown fa-5x"></i></div>';
} else {
resultItems.sort((left, right) => {
if (left.includedCount !== right.includedCount) {
return right.includedCount - left.includedCount;
} else if (left.hitCount !== right.hitCount) {
return right.hitCount - left.hitCount;
}
return right.id - left.id;
});
const stats = CONFIG.i18n.hits.replace('${hits}', resultItems.length);
container.classList.remove('no-result');
container.innerHTML = `<div class="search-stats">${stats}</div>
<hr>
<ul class="search-result-list">${resultItems.map(result => result.item).join('')}</ul>`;
if (typeof pjax === 'object') pjax.refresh(container);
}
};
localSearch.highlightSearchWords(document.querySelector('.post-body'));
if (CONFIG.localsearch.preload) {
localSearch.fetchData();
}
if (CONFIG.localsearch.trigger === 'auto') {
input.addEventListener('input', inputEventFunction);
} else {
document.querySelector('.search-icon').addEventListener('click', inputEventFunction);
input.addEventListener('keypress', event => {
if (event.key === 'Enter') {
inputEventFunction();
}
});
}
window.addEventListener('search:loaded', inputEventFunction);
// Handle and trigger popup window
document.querySelectorAll('.popup-trigger').forEach(element => {
element.addEventListener('click', () => {
document.body.classList.add('search-active');
// Wait for search-popup animation to complete
setTimeout(() => input.focus(), 500);
if (!localSearch.isfetched) localSearch.fetchData();
});
});
// Monitor main search box
const onPopupClose = () => {
document.body.classList.remove('search-active');
};
document.querySelector('.search-pop-overlay').addEventListener('click', event => {
if (event.target === document.querySelector('.search-pop-overlay')) {
onPopupClose();
}
});
document.querySelector('.popup-btn-close').addEventListener('click', onPopupClose);
document.addEventListener('pjax:success', () => {
localSearch.highlightSearchWords(document.querySelector('.post-body'));
onPopupClose();
});
window.addEventListener('keyup', event => {
if (event.key === 'Escape') {
onPopupClose();
}
});
});

326
assets/js/third-party/search/local.js vendored Normal file
View File

@@ -0,0 +1,326 @@
/* global CONFIG, pjax, LocalSearch */
class LocalSearch {
constructor({
path = '',
unescape = false,
top_n_per_article = 1
}) {
this.path = path;
this.unescape = unescape;
this.top_n_per_article = top_n_per_article;
this.isfetched = false;
this.datas = null;
}
getIndexByWord(words, text, caseSensitive = false) {
const index = [];
const included = new Set();
if (!caseSensitive) {
text = text.toLowerCase();
}
words.forEach(word => {
if (this.unescape) {
const div = document.createElement('div');
div.innerText = word;
word = div.innerHTML;
}
const wordLen = word.length;
if (wordLen === 0) return;
let startPosition = 0;
let position = -1;
if (!caseSensitive) {
word = word.toLowerCase();
}
while ((position = text.indexOf(word, startPosition)) > -1) {
index.push({ position, word });
included.add(word);
startPosition = position + wordLen;
}
});
// Sort index by position of keyword
index.sort((left, right) => {
if (left.position !== right.position) {
return left.position - right.position;
}
return right.word.length - left.word.length;
});
return [index, included];
}
// Merge hits into slices
mergeIntoSlice(start, end, index) {
let item = index[0];
let { position, word } = item;
const hits = [];
const count = new Set();
while (position + word.length <= end && index.length !== 0) {
count.add(word);
hits.push({
position,
length: word.length
});
const wordEnd = position + word.length;
// Move to next position of hit
index.shift();
while (index.length !== 0) {
item = index[0];
position = item.position;
word = item.word;
if (wordEnd > position) {
index.shift();
} else {
break;
}
}
}
return {
hits,
start,
end,
count: count.size
};
}
// Highlight title and content
highlightKeyword(val, slice) {
let result = '';
let index = slice.start;
for (const { position, length } of slice.hits) {
result += val.substring(index, position);
index = position + length;
result += `<mark class="search-keyword">${val.substr(position, length)}</mark>`;
}
result += val.substring(index, slice.end);
return result;
}
getResultItems(keywords) {
const resultItems = [];
this.datas.forEach(({ title, content, url }) => {
// The number of different keywords included in the article.
const [indexOfTitle, keysOfTitle] = this.getIndexByWord(keywords, title);
const [indexOfContent, keysOfContent] = this.getIndexByWord(keywords, content);
const includedCount = new Set([...keysOfTitle, ...keysOfContent]).size;
// Show search results
const hitCount = indexOfTitle.length + indexOfContent.length;
if (hitCount === 0) return;
const slicesOfTitle = [];
if (indexOfTitle.length !== 0) {
slicesOfTitle.push(this.mergeIntoSlice(0, title.length, indexOfTitle));
}
let slicesOfContent = [];
while (indexOfContent.length !== 0) {
const item = indexOfContent[0];
const { position } = item;
// Cut out 100 characters. The maxlength of .search-input is 80.
const start = Math.max(0, position - 20);
const end = Math.min(content.length, position + 80);
slicesOfContent.push(this.mergeIntoSlice(start, end, indexOfContent));
}
// Sort slices in content by included keywords' count and hits' count
slicesOfContent.sort((left, right) => {
if (left.count !== right.count) {
return right.count - left.count;
} else if (left.hits.length !== right.hits.length) {
return right.hits.length - left.hits.length;
}
return left.start - right.start;
});
// Select top N slices in content
const upperBound = parseInt(this.top_n_per_article, 10);
if (upperBound >= 0) {
slicesOfContent = slicesOfContent.slice(0, upperBound);
}
let resultItem = '';
url = new URL(url, location.origin);
url.searchParams.append('highlight', keywords.join(' '));
if (slicesOfTitle.length !== 0) {
resultItem += `<li><a href="${url.href}" class="search-result-title">${this.highlightKeyword(title, slicesOfTitle[0])}</a>`;
} else {
resultItem += `<li><a href="${url.href}" class="search-result-title">${title}</a>`;
}
slicesOfContent.forEach(slice => {
resultItem += `<a href="${url.href}"><p class="search-result">${this.highlightKeyword(content, slice)}...</p></a>`;
});
resultItem += '</li>';
resultItems.push({
item: resultItem,
id : resultItems.length,
hitCount,
includedCount
});
});
return resultItems;
}
fetchData() {
const isXml = !this.path.endsWith('json');
fetch(this.path)
.then(response => response.text())
.then(res => {
// Get the contents from search data
this.isfetched = true;
this.datas = isXml ? [...new DOMParser().parseFromString(res, 'text/xml').querySelectorAll('entry')].map(element => ({
title : element.querySelector('title').textContent,
content: element.querySelector('content').textContent,
url : element.querySelector('url').textContent
})) : JSON.parse(res);
// Only match articles with non-empty titles
this.datas = this.datas.filter(data => data.title).map(data => {
data.title = data.title.trim();
data.content = data.content ? data.content.trim().replace(/<[^>]+>/g, '') : '';
data.url = decodeURIComponent(data.url).replace(/\/{2,}/g, '/');
return data;
});
// Remove loading animation
window.dispatchEvent(new Event('search:loaded'));
});
}
// Highlight by wrapping node in mark elements with the given class name
highlightText(node, slice, className) {
const val = node.nodeValue;
let index = slice.start;
const children = [];
for (const { position, length } of slice.hits) {
const text = document.createTextNode(val.substring(index, position));
index = position + length;
const mark = document.createElement('mark');
mark.className = className;
mark.appendChild(document.createTextNode(val.substr(position, length)));
children.push(text, mark);
}
node.nodeValue = val.substring(index, slice.end);
children.forEach(element => {
node.parentNode.insertBefore(element, node);
});
}
// Highlight the search words provided in the url in the text
highlightSearchWords(body) {
const params = new URL(location.href).searchParams.get('highlight');
const keywords = params ? params.split(' ') : [];
if (!keywords.length || !body) return;
const walk = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null);
const allNodes = [];
while (walk.nextNode()) {
if (!walk.currentNode.parentNode.matches('button, select, textarea')) allNodes.push(walk.currentNode);
}
allNodes.forEach(node => {
const [indexOfNode] = this.getIndexByWord(keywords, node.nodeValue);
if (!indexOfNode.length) return;
const slice = this.mergeIntoSlice(0, node.nodeValue.length, indexOfNode);
this.highlightText(node, slice, 'search-keyword');
});
}
}
document.addEventListener('DOMContentLoaded', () => {
if (! NexT.CONFIG.localSearch.path) {
// Search DB path
console.warn('`search indexes file` is not configurate!');
return;
}
const localSearch = new LocalSearch({
path : NexT.CONFIG.localSearch.path,
top_n_per_article: NexT.CONFIG.localSearch.topnperarticle,
unescape : NexT.CONFIG.localSearch.unescape
});
const input = document.querySelector('.search-input');
const inputEventFunction = () => {
if (!localSearch.isfetched) return;
const searchText = input.value.trim().toLowerCase();
const keywords = searchText.split(/[-\s]+/);
const container = document.querySelector('.search-result-container');
let resultItems = [];
if (searchText.length > 0) {
// Perform local searching
resultItems = localSearch.getResultItems(keywords);
}
if (keywords.length === 1 && keywords[0] === '') {
container.classList.add('no-result');
container.innerHTML = '<div class="search-result-icon"><i class="fa fa-search fa-5x"></i></div>';
} else if (resultItems.length === 0) {
container.classList.add('no-result');
container.innerHTML = '<div class="search-result-icon"><i class="far fa-frown fa-5x"></i></div>';
} else {
resultItems.sort((left, right) => {
if (left.includedCount !== right.includedCount) {
return right.includedCount - left.includedCount;
} else if (left.hitCount !== right.hitCount) {
return right.hitCount - left.hitCount;
}
return right.id - left.id;
});
const stats = NexT.CONFIG.i18n.hits.replace('${hits}', resultItems.length);
container.classList.remove('no-result');
container.innerHTML = `<div class="search-stats">${stats}</div>
<hr>
<ul class="search-result-list">${resultItems.map(result => result.item).join('')}</ul>`;
if (typeof pjax === 'object') pjax.refresh(container);
}
};
localSearch.highlightSearchWords(document.querySelector('.post-body'));
if (NexT.CONFIG.localSearch.preload) {
localSearch.fetchData();
}
if (NexT.CONFIG.localSearch.trigger === 'auto') {
input.addEventListener('input', inputEventFunction);
} else {
document.querySelector('.search-icon').addEventListener('click', inputEventFunction);
input.addEventListener('keypress', event => {
if (event.key === 'Enter') {
inputEventFunction();
}
});
}
window.addEventListener('search:loaded', inputEventFunction);
// Handle and trigger popup window
document.querySelectorAll('.popup-trigger').forEach(element => {
element.addEventListener('click', () => {
document.body.classList.add('search-active');
// Wait for search-popup animation to complete
setTimeout(() => input.focus(), 500);
if (!localSearch.isfetched) localSearch.fetchData();
});
});
// Monitor main search box
const onPopupClose = () => {
document.body.classList.remove('search-active');
};
document.querySelector('.search-pop-overlay').addEventListener('click', event => {
if (event.target === document.querySelector('.search-pop-overlay')) {
onPopupClose();
}
});
document.querySelector('.popup-btn-close').addEventListener('click', onPopupClose);
document.addEventListener('pjax:success', () => {
localSearch.highlightSearchWords(document.querySelector('.post-body'));
onPopupClose();
});
window.addEventListener('keyup', event => {
if (event.key === 'Escape') {
onPopupClose();
}
});
});

16
assets/js/third-party/share/addthis.js vendored Normal file
View File

@@ -0,0 +1,16 @@
document.addEventListener('DOMContentLoaded', () => {
const element = '.addthis_inline_share_toolbox';
if (!NexT.CONFIG.addthis || !NexT.utils.checkDOMExist(element)) return;
const addthis_js = NexT.CONFIG.addthis.js + '?pubid=' + NexT.CONFIG.addthis.cfg.pubid;
NexT.utils.loadComments(element).then(() => {
NexT.utils.getScript(addthis_js, {
attributes: {
async: true
},
parentNode: document.querySelector(element)
});
});
});

View File

@@ -23,8 +23,31 @@ HTMLElement.prototype.wrap = function(wrapper) {
NexT.utils = { NexT.utils = {
checkDOMExist: function(selector) {
return document.querySelector(selector) != null;
},
getCDNResource: function(res) {
let { plugins, router } = NexT.CONFIG.vendor;
let { name, version, file, alias } = res;
let npm_name = name;
let res_src = '';
switch(plugins) {
case 'cdnjs':
let cdnjs_name = alias || name;
let cdnjs_file = file.replace(/\.js$/, '.min.js').replace(/^(dist|lib|source\/js|)\/(browser\/|)/, '');
res_src = `${router}/${cdnjs_name}/${version}/${cdnjs_file}`
break;
default:
res_src = `${router}/${npm_name}@${version}/${file}`
}
return res_src;
},
replacePostCRLink: function() { replacePostCRLink: function() {
if (CONFIG.hostname.startsWith('http')) return; if (NexT.CONFIG.hostname.startsWith('http')) return;
// Try to support mutli domain without base URL sets. // Try to support mutli domain without base URL sets.
let href = window.location.href; let href = window.location.href;
if (href.indexOf('#')>-1){ if (href.indexOf('#')>-1){
@@ -40,8 +63,10 @@ NexT.utils = {
* One-click copy code support. * One-click copy code support.
*/ */
registerCopyCode: function() { registerCopyCode: function() {
if (!NexT.CONFIG.copybtn) return;
let figure = document.querySelectorAll('.highlight pre'); let figure = document.querySelectorAll('.highlight pre');
if (figure.length === 0 || !CONFIG.copybtn) return; if (figure.length === 0 || !NexT.CONFIG.copybtn) return;
figure.forEach(element => { figure.forEach(element => {
let cn = element.querySelector('code').className; let cn = element.querySelector('code').className;
// TODO seems hard code need find other ways fixed it. // TODO seems hard code need find other ways fixed it.
@@ -170,13 +195,14 @@ NexT.utils = {
// https://stackoverflow.com/questions/20306204/using-queryselector-with-ids-that-are-numbers // https://stackoverflow.com/questions/20306204/using-queryselector-with-ids-that-are-numbers
const tActive = document.getElementById(element.querySelector('a').getAttribute('href').replace('#', '')); const tActive = document.getElementById(element.querySelector('a').getAttribute('href').replace('#', ''));
[...tActive.parentNode.children].forEach(target => { [...tActive.parentNode.children].forEach(target => {
// Array.prototype.slice.call(tActive.parentNode.children).forEach(target => {
target.classList.toggle('active', target === tActive); target.classList.toggle('active', target === tActive);
}); });
// Trigger event // Trigger event
tActive.dispatchEvent(new Event('tabs:click', { tActive.dispatchEvent(new Event('tabs:click', {
bubbles: true bubbles: true
})); }));
if (!CONFIG.stickytabs) return; if (!NexT.CONFIG.stickytabs) return;
const offset = nav.parentNode.getBoundingClientRect().top + window.scrollY + 10; const offset = nav.parentNode.getBoundingClientRect().top + window.scrollY + 10;
window.anime({ window.anime({
targets : document.scrollingElement, targets : document.scrollingElement,
@@ -204,7 +230,7 @@ NexT.utils = {
/*registerActiveMenuItem: function() { /*registerActiveMenuItem: function() {
document.querySelectorAll('.menu-item a[href]').forEach(target => { document.querySelectorAll('.menu-item a[href]').forEach(target => {
const isSamePath = target.pathname === location.pathname || target.pathname === location.pathname.replace('index.html', ''); const isSamePath = target.pathname === location.pathname || target.pathname === location.pathname.replace('index.html', '');
const isSubPath = !CONFIG.root.startsWith(target.pathname) && location.pathname.startsWith(target.pathname); const isSubPath = !NexT.CONFIG.root.startsWith(target.pathname) && location.pathname.startsWith(target.pathname);
target.classList.toggle('menu-item-active', target.hostname === location.hostname && (isSamePath || isSubPath)); target.classList.toggle('menu-item-active', target.hostname === location.hostname && (isSamePath || isSubPath));
}); });
}, },
@@ -212,7 +238,7 @@ NexT.utils = {
registerLangSelect: function() { registerLangSelect: function() {
const selects = document.querySelectorAll('.lang-select'); const selects = document.querySelectorAll('.lang-select');
selects.forEach(sel => { selects.forEach(sel => {
sel.value = CONFIG.page.lang; sel.value = NexT.CONFIG.page.lang;
sel.addEventListener('change', () => { sel.addEventListener('change', () => {
const target = sel.options[sel.selectedIndex]; const target = sel.options[sel.selectedIndex];
document.querySelectorAll('.lang-select-label span').forEach(span => { document.querySelectorAll('.lang-select-label span').forEach(span => {
@@ -253,7 +279,7 @@ NexT.utils = {
}); });
}, },
initCommontesDispaly: function(){ initCommontesDispaly: function(){
const comms = document.querySelectorAll('.comment-wrap > div'); const comms = document.querySelectorAll('.comment-wrap > div');
if (comms.length<=1) return; if (comms.length<=1) return;
comms.forEach(function(item){ comms.forEach(function(item){
@@ -278,6 +304,15 @@ NexT.utils = {
}); });
}, },
hideCommontes:function() {
document.querySelector('.post-comments').style.display = 'none';
},
hiddeLodingCmp: function(selector) {
const loadding = document.querySelector(selector).previousElementSibling;
loadding.style.display = 'none';
},
activateNavByIndex: function(index) { activateNavByIndex: function(index) {
const target = document.querySelectorAll('.post-toc li a.nav-link')[index]; const target = document.querySelectorAll('.post-toc li a.nav-link')[index];
if (!target || target.classList.contains('active-current')) return; if (!target || target.classList.contains('active-current')) return;
@@ -303,13 +338,13 @@ NexT.utils = {
}, },
updateSidebarPosition: function() { updateSidebarPosition: function() {
if (window.innerWidth < 992 || CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini') return; if (window.innerWidth < 992 || NexT.CONFIG.scheme === 'Pisces' || NexT.CONFIG.scheme === 'Gemini') return;
// Expand sidebar on post detail page by default, when post has a toc. // Expand sidebar on post detail page by default, when post has a toc.
const hasTOC = document.querySelector('.post-toc'); const hasTOC = document.querySelector('.post-toc');
let display = CONFIG.sidebar; let display = NexT.CONFIG.sidebar;
if (typeof display !== 'boolean') { if (typeof display !== 'boolean') {
// There's no definition sidebar in the page front-matter. // There's no definition sidebar in the page front-matter.
display = CONFIG.sidebar.display === 'always' || (CONFIG.sidebar.display === 'post' && hasTOC); display = NexT.CONFIG.sidebar.display === 'always' || (NexT.CONFIG.sidebar.display === 'post' && hasTOC);
} }
if (display) { if (display) {
window.dispatchEvent(new Event('sidebar:show')); window.dispatchEvent(new Event('sidebar:show'));
@@ -344,6 +379,15 @@ NexT.utils = {
}); });
}, },
getStyle: function(src, parent) {
const link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('type', 'text/css');
link.setAttribute('href', src);
(parent || document.head).appendChild(link);
},
getScript: function(src, options = {}, legacyCondition) { getScript: function(src, options = {}, legacyCondition) {
if (typeof options === 'function') { if (typeof options === 'function') {
return this.getScript(src, { return this.getScript(src, {
@@ -362,6 +406,7 @@ NexT.utils = {
} = {}, } = {},
parentNode = null parentNode = null
} = options; } = options;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (condition) { if (condition) {
resolve(); resolve();
@@ -401,7 +446,7 @@ NexT.utils = {
} }
return new Promise(resolve => { return new Promise(resolve => {
const element = document.querySelector(selector); const element = document.querySelector(selector);
if (!CONFIG.comments.lazyload || !element) { if (!element) {
resolve(); resolve();
return; return;
} }

View File

@@ -1,4 +1,4 @@
# Hugo NexT theme's custom config # Hugo NexT theme's custom config
# #
version: 4.0.0 version: 4.2.0

View File

@@ -1,27 +1,84 @@
# CDN 公共资源商列表
# Public CDN vendor list # Public CDN vendor list
#
vendors: vendors:
cdnjs: "//cdnjs.cloudflare.com/ajax/libs/${name}/${version}/${file}" cdnjs: "https://cdnjs.cloudflare.com/ajax/libs"
unpkg: "//unpkg.com/${name}@${version}/${file}" unpkg: "https://unpkg.com"
# JavaScript 资源
# Javascript Resources # JavaScript Resources
#
js: js:
- name: animejs - name: animejs
version: 3.2.1 version: 3.2.1
file: lib/anime.min.js file: lib/anime.min.js
- name: mathjax # TODO
version: 3.2.0 #- name: mathjax
file: es5/tex-mml-chtml.js # version: 3.2.0
# file: es5/tex-mml-chtml.js
# CSS 资源
# CSS Resources # CSS Resources
#
css: css:
- name: '@fortawesome/fontawesome-free' - name: '@fortawesome/fontawesome-free'
version: 6.1.1 version: 6.1.2
file: css/all.min.css file: css/all.min.css
alias: font-awesome alias: font-awesome
- name: animate.css - name: animate.css
version: 3.1.1 version: 3.1.1
file: animate.min.css file: animate.min.css
# 第三方服务组件资源
# 3rd servcies Resource
# 站点统计
# Site analytics engine
analytics:
la: https://sdk.51.la/js-sdk-pro.min.js
# 文章分享
# Share
addthis:
js: https://s7.addthis.com/js/300/addthis_widget.js
# 评论组件
# Comment component
waline:
js:
name: '@waline/client'
version: 2.6.1
file: dist/waline.js
alias: waline
css:
name: '@waline/client'
version: 2.6.1
file: dist/waline.css
alias: waline
artalk:
js:
name: artalk
version: 2.3.4
file: dist/Artalk.js
css:
name: artalk
version: 2.3.4
file: dist/Artalk.css
giscus:
js: https://giscus.app/client.js
utterances:
js: https://utteranc.es/client.js
livere:
js: https://cdn-city.livere.com/js/embed.dist.js
# 全文搜索
# Full text search
algolia:
name: algoliasearch
version: 4.13.0
file: dist/algoliasearch-lite.umd.js
instant:
name: instantsearch.js
version: 4.40.5
file: dist/instantsearch.production.min.js

View File

@@ -55,6 +55,42 @@ markup:
endLevel: 3 endLevel: 3
ordered: false ordered: false
# 站点文章导航文件
# Site map of all articles
sitemap:
filename: "sitemap.xml"
changefreq: "weekly"
priority: 0.5
outputFormats:
RSS:
baseName: "rss"
# 自定义生成本地搜索文件
# Custom file of indexes for local search
LocalIndexes:
mediaType: application/xml
baseName: searchindexes
isPlainText: true
notAlternative: true
# 生成 Algolia 索引文件
# Build indexes of Aloglia
AlgoliaIndexes:
mediaType: application/json
baseName: algolia
isPlainText: true
notAlternative: true
# 默认使用本地搜索,如切换到 Algolia 搜索引擎,
# 请将下面的 LocalIndexes 替换成 AlgoliaIndexes
# By default use local search, before switch to Algolia engine
# Please replace LocalIndexes with AlgoliaIndexes
outputs:
home: ["HTML", "RSS", "LocalIndexes"]
# 输出 robots 文件支持爬虫扫描
# Enable robots with support crawler scan
enableRobotsTXT: true
#-------------------------------------- #--------------------------------------
# 菜单配置说明 # 菜单配置说明
# identifier 唯一标识不可重复 # identifier 唯一标识不可重复
@@ -84,16 +120,21 @@ menus:
pageref: /about.html pageref: /about.html
pre: user pre: user
weight: 2 weight: 2
- identifier: flinks
name: 站点示例
pageref: /flinks.html
pre: thumbs-up
weight: 3
- identifier: archives - identifier: archives
name: 归档 name: 归档
pageref: /posts pageref: /archives
pre: archive pre: archive
weight: 3 weight: 4
- identifier: commonweal - identifier: commonweal
name: 公益 404 name: 公益 404
url: /404.html url: /404.html
pre: heartbeat pre: heartbeat
weight: 4 weight: 5
#----------------------------------------- #-----------------------------------------
# Hugo NexT 主题参数配置 # Hugo NexT 主题参数配置
@@ -103,7 +144,7 @@ params:
# 需要显示文章的部分即content目录下的文件夹名称 # 需要显示文章的部分即content目录下的文件夹名称
# Sections for show in home & archive page # Sections for show in home & archive page
# and it's forlder name which under content # and it's forlder name which under content
mainSections: ["posts"] mainSections: ["post"]
# 年,月,日及时间的格式化样式 # 年,月,日及时间的格式化样式
# Format style for year,month,date & time # Format style for year,month,date & time
yearFormat: "2006" yearFormat: "2006"
@@ -139,7 +180,7 @@ params:
appleTouchIcon: /imgs/icons/apple_touch_icon_next.png appleTouchIcon: /imgs/icons/apple_touch_icon_next.png
# 自定义 Logo (目前只支持 Mist 页面模式) # 自定义 Logo (目前只支持 Mist 页面模式)
# Custom Logo (Warning: Do not support scheme Mist) # Custom Logo (Warning: Only support scheme Mist)
customLogo: #/imgs/hugo_next_logo.png customLogo: #/imgs/hugo_next_logo.png
# 知识共享国际许可 4.0 # 知识共享国际许可 4.0
@@ -553,7 +594,7 @@ params:
enable: true enable: true
# 你的 Github 仓库地址 # 你的 Github 仓库地址
# Your repository url on Github. # Your repository url on Github.
permalink: https://github.com/yourname permalink: https://github.com/hugo-next
# 关注说明 # 关注说明
# Show this title when cursor move on. # Show this title when cursor move on.
title: Follow me on GitHub title: Follow me on GitHub
@@ -765,35 +806,35 @@ params:
# 更多配置信息请参考https://artalk.js.org # 更多配置信息请参考https://artalk.js.org
# Artalk comments system # Artalk comments system
# More info see: https://artalk.js.org # More info see: https://artalk.js.org
artalk: # artalk:
site: "默认站点" # site: "默认站点"
placeholder: "请文明发言,谢谢!" # placeholder: "请文明发言,谢谢!"
server: #<your artalk server url> # server: #<your artalk server url>
# Artalk 评论插件 # Artalk 评论插件
# 更多配置信息请参考: # 更多配置信息请参考:
# LiveRe comments system # LiveRe comments system
# You can get your uid from https://livere.com/ # You can get your uid from https://livere.com/
livere: # livere:
uid: # <your_uid> # uid: # <your_uid>
# Utterances 评论插件 # Utterances 评论插件
# 更多配置信息请参考https://utteranc.es # 更多配置信息请参考https://utteranc.es
# Utterances comments system # Utterances comments system
# For more information: https://utteranc.es # For more information: https://utteranc.es
utterances: # utterances:
# Github 仓库地址,格式:用户名/仓库名称 # # Github 仓库地址,格式:用户名/仓库名称
# Github repository owner and name # # Github repository owner and name
repo: username/repo-name # repo: username/repo-name
# 问题标题的模式可选值pathname | url | title | og:title # # 问题标题的模式可选值pathname | url | title | og:title
# Available values: pathname | url | title | og:title # # Available values: pathname | url | title | og:title
issueTerm: pathname # issueTerm: pathname
# 问题的标签分类 # # 问题的标签分类
# Label flag for Github issues # # Label flag for Github issues
label: comments # label: comments
# 主题可选值: github-light | github-dark | preferred-color-scheme | github-dark-orange | icy-dark | dark-blue | photon-dark | boxy-light # # 主题可选值: github-light | github-dark | preferred-color-scheme | github-dark-orange | icy-dark | dark-blue | photon-dark | boxy-light
# Available values: github-light | github-dark | preferred-color-scheme | github-dark-orange | icy-dark | dark-blue | photon-dark | boxy-light # # Available values: github-light | github-dark | preferred-color-scheme | github-dark-orange | icy-dark | dark-blue | photon-dark | boxy-light
theme: preferred-color-scheme # theme: preferred-color-scheme
# Giscus 评论插件 # Giscus 评论插件
# 更多配置信息请参考https://giscus.app # 更多配置信息请参考https://giscus.app
@@ -802,16 +843,24 @@ params:
giscus: giscus:
# Github 仓库地址,格式:用户名/仓库名称 # Github 仓库地址,格式:用户名/仓库名称
# Github repository owner and name # Github repository owner and name
repo: username/repo_name repo: username/repo-name
# Giscus 生成的仓库 Id # Giscus 生成的仓库 Id
# Generate repository Id from Giscus # Generate repository Id from Giscus
repoId: #<repo_id> repoId: #<repo-id>
# 讨论区的分类名称 # 讨论区的分类名称
# Github discussions category # Github discussions category
category: Announcements category: Comments
# 讨论区分类 ID # 讨论区分类 ID
# Generate category Id from Giscus # Generate category Id from Giscus
categoryId: #<category_id> categoryId: #<category-id>
# 帖子上的反应将会显示在评论前
# The reactions for post will be shown before the comments
reactions: false
# 将元数据定期被发送到父页面(被嵌入的页面或控制台,用于调试)
# Metadata will be sent periodically to the parent window
emit: false
# 评论输入框的位置,可选值: top | bottom
# Aavilable value: top | bottom
# 讨论区帖子标题,可选值: pathname | url | title | og:title | 自定义 # 讨论区帖子标题,可选值: pathname | url | title | og:title | 自定义
# Available values: pathname | url | title | og:title | custom # Available values: pathname | url | title | og:title | custom
mapping: title mapping: title
@@ -854,7 +903,7 @@ params:
# 更多信息请参考https://invite.51.la/1NUfGTS1?target=V6 # 更多信息请参考https://invite.51.la/1NUfGTS1?target=V6
# 51La Analytics # 51La Analytics
# See: https://invite.51.la/1NUfGTS1?target=V6 # See: https://invite.51.la/1NUfGTS1?target=V6
laId: #<anaytics_id> laId: #<anaytics_id>
# TODO # TODO
# Show Views / Visitors of the website / page with busuanzi. # Show Views / Visitors of the website / page with busuanzi.
@@ -869,8 +918,7 @@ params:
# --------------------------------------------------------------- # ---------------------------------------------------------------
# TODO # 内容搜索服务
# 内容搜索服务(暂时未实现)
# Search Services # Search Services
# --------------------------------------------------------------- # ---------------------------------------------------------------
@@ -878,19 +926,32 @@ params:
# For more information: https://www.algolia.com # For more information: https://www.algolia.com
algoliaSearch: algoliaSearch:
enable: false enable: false
appId: #<algolia app id>
apiKey: #<algolia api key>
indexName: #<algolia index name>
hits: hits:
perPage: 10 perPage: 10
# 本地搜索
# Local Search # Local Search
localSearch: localSearch:
# 是否开启搜索功能
# Enable search function
enable: true enable: true
# 搜索索引文件路径
# Indexes file path for search
path: searchindexes.xml
# 是立即搜索当输入关键字时,可选值: auto | manual
# If auto, trigger search by changing input. # If auto, trigger search by changing input.
# If manual, trigger search by pressing enter key or search button. # If manual, trigger search by pressing enter key or search button.
trigger: auto trigger: auto
# 显示头部的搜索记录,-1 表示显示所有搜索结果
# Show top n results per article, show all results by setting to -1 # Show top n results per article, show all results by setting to -1
top_n_per_article: 1 topNPerArticle: -1
# 将 html 字符串转换为可读字符串
# Unescape html strings to the readable one. # Unescape html strings to the readable one.
unescape: false unescape: false
# 页面加载时是否要重新载入索引文件
# Preload the search data when the page loads. # Preload the search data when the page loads.
preload: false preload: false

View File

@@ -1,6 +1,6 @@
--- ---
title: "关于 Hugo NexT 组织" title: "关于 Hugo NexT 组织"
description: "" description: "Hugo NexT 组织介绍说明。"
date: 2022-06-09T20:12:52+08:00 date: 2022-06-09T20:12:52+08:00
lastmod: 2022-06-09T20:12:52+08:00 lastmod: 2022-06-09T20:12:52+08:00
@@ -16,4 +16,12 @@ url: about.html
# 我们的愿景 # 我们的愿景
延续 `NexT` 经典的黑白调搭配,保持简单的易用性及强大的功能。 延续 `NexT` 经典的黑白调搭配,保持简单的易用性及强大的功能。
# 使用反馈
- 加入 [GitHub Discussions](https://github.com/hugo-next/hugo-theme-next/discussions) 或 [Gitter](https://gitter.im/hugo-next/community) 在线讨论 :beers:
- [GitHub Issues](https://github.com/hugo-next/hugo-theme-next/issues/new?labels=Bug&template=bug-report.md) 提交错误报告 :bug:
- [GitHub Feature](https://github.com/hugo-next/hugo-theme-next/issues/new?labels=Feature+Request&template=feature-request.md) 表新功能的想法 :sparkles:
> 同时国内用户也可加入 QQ 群交流: 604710815

View File

@@ -0,0 +1,3 @@
---
date: 2022-07-26T21:46:25+08:00
---

View File

@@ -0,0 +1,16 @@
---
title: "站点示例"
type: flinks
url: flinks.html
---
如想要交换友情链接,请在评论区留下你的站点信息,格式参考如下:
{{< note success no-icon >}}
**名称:** NexT 主题 <br/>
**说明:** 保持简单的易用性和强大的功能。 <br/>
**站标:** https://hugo-next.eu.org/imgs/hugo_next_avatar.png <br/>
**网址:** https://hugo-next.eu.org <br/>
{{< /note >}}

View File

@@ -0,0 +1,86 @@
---
title: "自定义短语示例"
description: "将常用的块引用、标签卡、按钮等信息设置成短代码,便于快速引用"
keywords: "shortcode,短代码"
date: 2022-08-06T14:41:50+08:00
lastmod: 2022-08-06T14:41:50+08:00
categories:
- 示例
tags:
- 短代码
- 语法
url: "post/shortcodes.html"
---
虽然 `Markdown` 语法已经非常丰富能够满足我们写文章的绝大部分需求,但是为更好的对文章内容进行更友好的排版,为引设计一套自定义的短语,便于在使用时能够快速引用。
<!--more-->
# 块引用
在引用一些经典名言名句时,可以采用此短语,语法参考如下:
```markdown
{{</* quote */>}}
### block quote
写下你想表达的话语!
{{</* /quote */>}}
```
实际效果:
{{< quote >}}
希望是无所谓有,无所谓无的,这正如地上的路。
其实地上本没有路,走的人多了,也便成了路。
**鲁迅**
{{< /quote >}}
# 信息块
支持 `default``info``success``warning``danger` 等五种不同效果的展示,语法参考如下:
```markdown
{{</* note [class] [no-icon] */>}}
书写表达的信息
支持 Markdown 语法
{{</* /note */>}}
```
实际效果:
{{< note default no-icon >}}
### Default Header without icon
**Welcome** to [Hugo NexT!](https://preview.hugo-next.eu.org)
{{< /note >}}
{{< note default >}}
### Default Header
**Welcome** to [Hugo NexT!](https://preview.hugo-next.eu.org)
{{< /note >}}
{{< note info >}}
### Info Header
**Welcome** to [Hugo NexT!](https://preview.hugo-next.eu.org)
{{< /note >}}
{{< note success >}}
### Success Header
**Welcome** to [Hugo NexT!](https://preview.hugo-next.eu.org)
{{< /note >}}
{{< note warning >}}
### Warning Header
**Welcome** to [Hugo NexT!](https://preview.hugo-next.eu.org)
{{< /note >}}
{{< note danger >}}
### Danger Header
**Welcome** to [Hugo NexT!](https://preview.hugo-next.eu.org)
{{< /note >}}

View File

@@ -0,0 +1,29 @@
# 友情链接
# Friend's links
- FLinksTitle: 官方示例
FLinksDesc: 来自主题官方的示例内容。
FLinksList:
- name: Hugo
desc: 世界上最快的网站建设框架!
avatar: https://gohugo.io/favicon-32x32.png
link: https://gohugo.io
- name: Hugo-NexT
desc: Hugo NexT 官方预览网站。
avatar: https://hugo-next.eu.org/imgs/hugo_next_avatar.png
link: https://hugo-next.eu.org
- name: 凡梦星尘空间站
desc: 再平凡的人也有属于他的梦想!
avatar: https://lisenhui.cn/img/avatar.png
link: https://lisenhui.cn
- FLinksTitle: Hugo NexT 粉丝群体
FLinksDesc: 来自 Hugo NexT 主题爱好者们的精彩呈现!
FLinksList:
- name: 阿哈吉
desc: 全网首个 Hugo NexT 忠实粉丝用户
avatar: https://a.happy2008.top/imgs/stayhome-small.png
link: https://a.happy2008.top/

View File

@@ -20,4 +20,4 @@ EOT
next `cat ../VERSION` next `cat ../VERSION`
hugo server -D -t ../.. --port 1414 --panicOnWarning hugo server -t ../.. --port 1414 --panicOnWarning --config config.yaml

View File

@@ -1,49 +0,0 @@
#--------------------------------------
# English Version
#--------------------------------------
[ColoneFlag]
other = ":"
[SitePostsTitle]
other = "Posts"
[SiteCatesTitle]
other = "Categories"
[SiteTagsTitle]
other = "Tags"
[TableOfContents]
other = "TOC"
[SiteInfo]
other = "Site Info"
[RSSTitle]
other = "RSS Subscribe"
[CCLinkTitle]
other = "Creative Commons"
[PostPublishDate]
other = "Publish"
[PostPublishTime]
other = "Create Time"
[PostLastModDate]
other = "Update"
[PostLastModTime]
other = "Modify Time"
[PostWords]
other = "Words"
[PostWordCount]
other = "{{- .WordCount -}}"
[PostReading]
other = "Read"
[PostReadTime]
other = "{{- .ReadingTime -}}min"
[PostVisitor]
other = "Views"
[PostCatg]
other = "Categories"
[PostTag]
other = "Tags"
[PostReadMore]
other = "Read More"
[FooterPowerby]
other = "Power by %s"

View File

@@ -1,7 +1,7 @@
#-------------------------------------- #--------------------------------------
# English Version # English Version
#-------------------------------------- #--------------------------------------
posts: archives:
other: Posts other: Posts
tag: tag:
other: Tag other: Tag
@@ -140,4 +140,13 @@ PageViewsLabel:
other: Total Page Views other: Total Page Views
FooterPowerby: FooterPowerby:
other: "Power by %s" other: "Power by %s"
SearchPh:
other: Searching...
SearchEmpty:
other: "We didn't find any results for the search: ${query}"
SearchHits:
hits: "${hits} results found"
SearchHitsTime:
other: "${hits} results found in ${time} ms"

View File

@@ -1,49 +0,0 @@
#--------------------------------------
# 中文版本
#--------------------------------------
[ColoneFlag]
other = ""
[SitePostsTitle]
other = "日志"
[SiteCatesTitle]
other = "分类"
[SiteTagsTitle]
other = "标签"
[TableOfContents]
other = "文章目录"
[SiteInfo]
other = "站点概览"
[RSSTitle]
other = "RSS 订阅"
[CCLinkTitle]
other = "共享知识"
[PostPublishDate]
other = "发表于"
[PostPublishTime]
other = "创建时间"
[PostLastModDate]
other = "更新于"
[PostLastModTime]
other = "修改时间"
[PostWords]
other = "字数"
[PostWordCount]
other = "{{- .WordCount -}}"
[PostReading]
other = "阅读"
[PostReadTime]
other = "{{- .ReadingTime -}}分钟"
[PostVisitor]
other = "浏览数"
[PostCatg]
other = "分类"
[PostTag]
other = "标签"
[PostReadMore]
other = "阅读全文"
[FooterPowerby]
other = "由 %s 强力驱动"

View File

@@ -2,7 +2,7 @@
# 中文版本 # 中文版本
#-------------------------------------- #--------------------------------------
posts: archives:
other: 文章 other: 文章
tag: tag:
other: 标签 other: 标签
@@ -141,4 +141,13 @@ PageViewsLabel:
other: 总访问量 other: 总访问量
FooterPowerby: FooterPowerby:
other: 由 %s 强力驱动 other: 由 %s 强力驱动
SearchPh:
other: 搜索...
SearchEmpty:
other: "没有找到任何搜索结果:${query}"
SearchHits:
hits: "找到 ${hits} 个搜索结果"
SearchHitsTime:
other: "找到 ${hits} 个搜索结果(用时 ${time} 毫秒)"

View File

@@ -1,4 +1,6 @@
{{- partial "init.html" . -}} {{- range $k, $v := (partialCached "init.html" .) -}}
{{- $.Scratch.Set $k $v -}}
{{- end -}}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{ .Site.LanguageCode }}"> <html lang="{{ .Site.LanguageCode }}">
@@ -28,13 +30,13 @@
<!-- Submenu,Content,Comment --> <!-- Submenu,Content,Comment -->
{{- block "main" . }}{{- end }} {{- block "main" . }}{{- end }}
{{- if .IsPage }} {{- if .IsPage }}
{{- partial "comments.html" . }} {{- partialCached "comments.html" . }}
{{- end }} {{- end }}
</div> </div>
</main> </main>
<footer class="footer"> <footer class="footer">
<div class="footer-inner"> <div class="footer-inner">
{{- partial "footer.html" . }} {{- partialCached "footer.html" . }}
</div> </div>
</footer> </footer>

View File

@@ -0,0 +1,12 @@
[
{{- range $index, $entry := where .Site.RegularPages "Kind" "page" }}
{{- if $index }}, {{ end }}
{
"permalink": "{{ .Permalink | relURL }}",
"title": {{ .Title | jsonify }},
"content": {{ .Plain | jsonify }},
"date": {{ .Date.Format $.Site.Params.timeFormat | jsonify }},
"updated": {{ .Lastmod.Format $.Site.Params.timeFormat | jsonify }}
}
{{- end }}
]

View File

@@ -1,29 +1,3 @@
{{ range .Paginator.Pages.GroupByDate "2006" }} {{ $paginator := .Paginator.Pages.GroupByDate "2006" }}
<div class="collection-year"> {{ partial "list.html" $paginator }}
<span class="collection-header">{{ .Key }}</span>
</div>
{{ range .Pages }}
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta-container">
{{ $month := .Date.Format .Site.Params.monthFormat }}
<time itemprop="dateCreated" datetime="{{ .Date.Format .Site.Params.timeFormat }}" content="{{ $month }}">
{{ $month }}
</time>
</div>
<div class="post-title">
{{- if isset .Params "extlink" }}
<a href="{{ .Params.extlink }}" rel="noopener external nofollow noreferrer" target="_blank" class="exturl post-title-link post-title-link-external" title="">
<span itemprop="name">{{- .Title -}}</span>
<i class="fa fa-external-link-alt"></i>
</a>
{{- else }}
<a class="post-title-link" href="{{ .Permalink }}" itemprop="url">
<span itemprop="name">{{ .Title }}</span>
</a>
{{- end }}
</div>
</header>
</article>
{{ end }}
{{ end }}

View File

@@ -0,0 +1,18 @@
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>" | safeHTML }}
<search>
{{range where .Site.RegularPages "Kind" "page"}}
<entry>
<title>{{ .Title }}</title>
<url>{{ .Permalink }}</url>
<categories>
{{- range .Params.categories }}<category>{{ . }}</category>{{- end }}
</categories>
<tags>
{{- range .Params.tags }}
<tag>{{ . }}</tag>
{{- end }}
</tags>
<content type="html"><![CDATA[{{ .Content | plainify }}]]></content>
</entry>
{{ end }}
</search>

View File

@@ -1,36 +1,15 @@
{{- define "title" }} {{- define "title" }}
{{- .Params.Title | default (T .Section) | default .Section | dict "Some" | T "AllSome" }} - {{ .Site.Title -}} {{- .Params.Title | default (T .Section) | default .Section }} - {{ .Site.Title -}}
{{- end -}} {{- end -}}
{{ define "main_inner_class" }}archive posts-collapse{{ end }} {{ define "main_inner_class" }}index posts-expand{{ end }}
{{- define "main" }}
<div class="post-block">
<div class="post-content">
<div class="collection-title">
{{- $cheers := "Um" }}
{{- $posts := .Scratch.Get "postsCount" }}
{{- if gt $posts 210 }}
{{- $cheers = "Excellent" }}
{{- else if gt $posts 130 }}
{{- $cheers = "Great" }}
{{- else if gt $posts 80 }}
{{- $cheers = "Good" }}
{{- else if gt $posts 50 }}
{{- $cheers = "Nice" }}
{{- else if gt $posts 30 }}
{{- $cheers = "Ok" }}
{{- end }}
<span class="collection-header">
{{- T (printf "PostArchiveCheers%s" $cheers) }}
{{- T "SymbolComma" }}
{{- T "ArchiveCounterTitle" $posts | safeHTML }}
{{- T "SymbolComma" }}
{{- T "PostArchiveKeepOn" }}
</span>
</div>
{{ .Render "list" }} {{- define "main" }}
</div> {{ $paginator := .Paginate (where .Site.RegularPages "Section" "==" .Section) }}
</div> {{- range $paginator.Pages }}
{{- partial "pagination.html" . }} {{ partial "post.html" (dict "ctx" . "IsHome" true) }}
{{- end }}
{{- partial "partials/pagination.html" . }}
{{- end }} {{- end }}

View File

@@ -0,0 +1,2 @@
{{ $paginator := (.Paginate (where .Page.Site.RegularPages "Section" "in" .Site.Params.mainSections)).Pages.GroupByDate "2006" }}
{{ partial "list.html" $paginator }}

View File

@@ -0,0 +1,36 @@
{{- define "title" }}
{{- .Params.Title | default (T .Section) | default .Section | dict "Some" | T "AllSome" }} - {{ .Site.Title -}}
{{- end -}}
{{ define "main_inner_class" }}archive posts-collapse{{ end }}
{{- define "main" }}
<div class="post-block">
<div class="post-content">
<div class="collection-title">
{{- $cheers := "Um" }}
{{- $posts := .Scratch.Get "postsCount" }}
{{- if gt $posts 210 }}
{{- $cheers = "Excellent" }}
{{- else if gt $posts 130 }}
{{- $cheers = "Great" }}
{{- else if gt $posts 80 }}
{{- $cheers = "Good" }}
{{- else if gt $posts 50 }}
{{- $cheers = "Nice" }}
{{- else if gt $posts 30 }}
{{- $cheers = "Ok" }}
{{- end }}
<span class="collection-header">
{{- T (printf "PostArchiveCheers%s" $cheers) }}
{{- T "SymbolComma" }}
{{- T "ArchiveCounterTitle" $posts | safeHTML }}
{{- T "SymbolComma" }}
{{- T "PostArchiveKeepOn" }}
</span>
</div>
{{ .Render "list" }}
</div>
</div>
{{- partial "pagination.html" . }}
{{- end }}

View File

@@ -0,0 +1,34 @@
{{- define "title" }}{{- .Title }} - {{ .Site.Title -}}{{- end }}
{{- define "main_inner_class" }}flinks posts-expand{{- end }}
{{ define "main" }}
<div class="flinks-block">
<h1 class="flinks-block-title">{{ .Title }}</h1>
<div class="flinks-lists">
{{ range .Site.Data.flinks }}
<div class="flinks-list">
<div class="flinks-list-title">{{ .FLinksTitle | safeHTML }}</div>
<div class="flinks-list-desc">{{ .FLinksDesc | safeHTML }}</div>
<div class="flinks-list-items">
{{ range .FLinksList }}
<div class="flinks-list-item">
<a href="{{ .link }}" rel="external nofollow noreferrer" title=" {{ .name }}" target="_blank">
<div class="flinks-item-icon">
<img class="no-lightbox entered loaded" src="{{ .avatar }}" alt="{{ .name }}"/>
</div>
<div class="flinks-item-name">{{ .name | safeHTML }}</div>
<div class="flinks-item-desc" title="{{ .desc }}">{{ .desc | safeHTML }}</div>
</a>
</div>
{{ end }}
</div>
</div>
{{ end }}
</div>
<div class="flinks-list-footer"><hr/></div>
<div class="flinks-page-desc">{{ .Content }}</div>
</div>
{{ end }}

View File

@@ -1,8 +1,11 @@
{{- define "main_inner_class" }}index posts-expand{{- end }} {{- define "main_inner_class" }}index posts-expand{{- end }}
{{- define "main" }} {{- define "main" }}
{{ $paginator := .Paginate (where .Site.RegularPages "Section" "in" .Site.Params.mainSections) }} {{ $paginator := .Paginate (where .Site.RegularPages "Section" "in" .Site.Params.mainSections) }}
{{- range $paginator.Pages }} {{- range $paginator.Pages }}
{{ partial "post.html" (dict "ctx" . "IsHome" true) }} {{ partial "post.html" (dict "ctx" . "IsHome" true) }}
{{- end }} {{- end }}
{{- partial "partials/pagination.html" . }} {{- partial "partials/pagination.html" . }}
{{- end }} {{- end }}

View File

@@ -1,2 +1,17 @@
<script charset="UTF-8" id="LA_COLLECT" src="https://sdk.51.la/js-sdk-pro.min.js"></script> <script type="text/javascript">
<script>LA.init({id: "{{ . }}",ck: "{{ . }}",autoTrack:true})</script> document.addEventListener('DOMContentLoaded', () => {
var script = document.createElement('script');
script.charset = "UTF-8";
script.id = "LA_COLLECT";
script.src = "{{ .Site.Data.resources.analytics.la }}";
script.async = "true"
script.onload = function() {
{{ with .Site.Params.analytics.laId }}
LA.init({ id: "{{ . }}",ck: "{{ . }}", autoTrack:true });
{{ end }}
}
document.head.appendChild(script);
});
</script>

View File

@@ -1,20 +1 @@
{{- with .Site.Params.artalk }} <div class="artalk-container"></div>
<link href="//unpkg.com/artalk@2.3.4/dist/Artalk.css" rel="stylesheet">
<script src="//unpkg.com/artalk@2.3.4/dist/Artalk.js"></script>
<!-- Artalk -->
<div id="Comments"></div>
<script>
new Artalk({
el : '#Comments',
pageKey : '{{ $.Page.RelPermalink }}',
pageTitle : '{{ $.Page.Title }}',
server : '{{ .server }}',
site : '{{ .site }}',
locale : 'auto',
placeholder : '{{ .placeholder }}'
})
</script>
{{- end }}

View File

@@ -1,18 +1 @@
{{- with .Site.Params.giscus }} <div class="giscus-container"></div>
<div class="giscus" style="position: relative;"></div>
<script src="https://giscus.app/client.js"
data-repo="{{ .repo }}"
data-repo-id="{{ .repoId }}"
data-category="{{ .category }}"
data-category-id="{{ .categoryId }}"
data-mapping="{{ .mapping }}"
data-reactions-enabled="0"
data-emit-metadata="1"
data-input-position="{{ .inputPosition }}"
data-theme="{{ .theme }}"
data-lang="{{ $.Site.LanguageCode }}"
data-loading="lazy"
crossorigin="anonymous"
async>
</script>
{{- end }}

View File

@@ -1,13 +1 @@
{{- with .Site.Params.LiveRe }} <div id="lv-container" data-id="city" data-uid="{{ .Site.Params.livere.uid }}"></div>
<div id="lv-container" data-id="city" data-uid="{{ .uid }}"></div>
<script type="text/javascript">
(function(d, s) {
var j, e = d.getElementsByTagName(s)[0];
if (typeof LivereTower === 'function') { return; }
j = d.createElement(s);
j.src = '//cdn-city.livere.com/js/embed.dist.js';
j.async = true;
e.parentNode.insertBefore(j, e);
})(document, 'script');
</script>
{{- end }}

View File

@@ -1,9 +1 @@
{{- with .Site.Params.utterances }} <div class="utterances-container"></div>
<script src="https://utteranc.es/client.js"
repo="{{ .repo }}"
issue-term="{{ .issueTerm }}"
label="{{ .label }}"
crossorigin="anonymous"
theme="{{ .theme }}" async>
</script>
{{- end }}

View File

@@ -1,23 +1 @@
{{- with .Site.Params.waline }} <div class="waline-container"></div>
<div id="waline"></div>
<link rel="stylesheet" href="//unpkg.com/@waline/client@v2/dist/waline.css"/>
<script src="//unpkg.com/@waline/client@v2/dist/waline.js"></script>
<script type="text/javascript">
const locale = {
placeholder: "{{ .placeholder }}"
};
Waline.init({
locale,
el : "#waline",
pageview : {{ .pageView }},
emoji : {{ .emoji }},
imageUploader : {{ .imgUploader }},
wordLimit : {{ .wordLimit }},
requiredMeta : {{ .requiredMeta }},
serverURL : "{{ .serverURL }}",
lang : "{{ $.Lang }}",
dark : "auto"
});
</script>
{{- end }}

View File

@@ -0,0 +1,14 @@
<div class="search-header">
<span class="search-icon">
<i class="fa fa-search"></i>
</span>
<div class="search-input-container"></div>
<span class="popup-btn-close" role="button">
<i class="fa fa-times-circle"></i>
</span>
</div>
<div class="search-result-container">
<div class="algolia-stats"><hr></div>
<div class="algolia-hits"></div>
<div class="algolia-pagination"></div>
</div>

View File

@@ -0,0 +1,18 @@
<div class="search-header">
<span class="search-icon">
<i class="fa fa-search"></i>
</span>
<div class="search-input-container">
<input autocomplete="off" autocapitalize="off" maxlength="80"
placeholder="{{ T "SearchPh" }}" spellcheck="false"
type="search" class="search-input">
</div>
<span class="popup-btn-close" role="button">
<i class="fa fa-times-circle"></i>
</span>
</div>
<div class="search-result-container no-result">
<div class="search-result-icon">
<i class="fa fa-spinner fa-pulse fa-5x"></i>
</div>
</div>

View File

@@ -1,5 +1,3 @@
{{- with .Site.Params.addThisId }} {{- if isset .Site.Params "addthisid" }}
<div class="addthis_inline_share_toolbox" style="text-align: center;"> <div class="addthis_inline_share_toolbox" style="text-align: center;"></div>
<script src="//s7.addthis.com/js/300/addthis_widget.js#pubid={{ . }}" async="async"></script>
</div>
{{- end }} {{- end }}

View File

@@ -1,6 +1,5 @@
{{- $root := . -}} {{- $root := . -}}
{{- with .Site.Params.comments }} {{- with .Site.Params.comments }}
{{- if .enable }}
{{- $tc := and .storage (gt (len .nav) 1) }} {{- $tc := and .storage (gt (len .nav) 1) }}
{{- $active := .active }} {{- $active := .active }}
{{- $fc := .active }} {{- $fc := .active }}
@@ -41,4 +40,3 @@
</div> </div>
</div> </div>
{{- end }} {{- end }}
{{- end }}

View File

@@ -5,4 +5,6 @@
{{- partial "head/facebook.html" . }} {{- partial "head/facebook.html" . }}
{{- partial "head/verify.html" . }} {{- partial "head/verify.html" . }}
{{- partialCached "head/style.html" . }} {{- partialCached "head/style.html" . }}
{{- partialCached "head/analytics.html" . }} {{- partial "head/config.html" . }}
{{- partialCached "head/analytics.html" . }}

View File

@@ -1,5 +1,3 @@
{{- with .Site.Params.analytics }} {{- if isset .Site.Params.analytics "laid" }}
{{- if isset . "laid" }} {{ partial "_thirdparty/analytics/51la.html" . }}
{{ partial "_thirdparty/analytics/51la.html" .laId }}
{{- end }} {{- end }}
{{- end }}

View File

@@ -0,0 +1,10 @@
<script class="next-config" data-name="page" type="application/json">
{{- dict
"isHome" .IsHome
"isPage" .IsPage
"comments" (.Params.comments | default .Site.Params.comments.enable)
"permalink" (.Page.Permalink | absURL)
"path" (.Page.Permalink | path.Base)
"title" .Page.Title
-}}
</script>

View File

@@ -1,7 +1,9 @@
<!-- Website icons --> <!-- Website icons -->
<link rel="shortcut icon" type="image/x-icon" href="{{ .Site.Params.favicon.icon }}"> {{- with .Site.Params.favicon }}
<link rel="icon" type="image/x-icon" href="{{ .Site.Params.favicon.icon }}"> <link rel="shortcut icon" type="image/x-icon" href="{{ .icon }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ .Site.Params.favicon.small }}"> <link rel="icon" type="image/x-icon" href="{{ .icon }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ .Site.Params.favicon.medium }}"> <link rel="icon" type="image/png" sizes="16x16" href="{{ .small }}">
<link rel="apple-touch-icon" sizes="180x180" href="{{ .Site.Params.favicon.appleTouchIcon }}"> <link rel="icon" type="image/png" sizes="32x32" href="{{ .medium }}">
<link rel="apple-touch-icon" sizes="180x180" href="{{ .appleTouchIcon }}">
{{- end }}
<!-- Website icons --> <!-- Website icons -->

View File

@@ -1,22 +1,22 @@
<!-- Plugin style files --> <!-- Plugin style files -->
{{- $cssRes := .Site.Data.resources.css }} {{- $cssRes := .Site.Data.resources.css }}
{{- $vendor := .Site.Params.vendors.plugins }} {{- $vendor := .Site.Params.vendors.plugins }}
{{- $vendorCDN := .Scratch.Get "pluginCDN" }} {{- $router := .Scratch.Get "router" }}
{{ $cssFmt := "%s/%s@%s/%s" }}
{{- range $css := $cssRes }} {{- range $css := $cssRes }}
{{- $pluginCSS := $vendorCDN }}
{{- $npm := $css.name }} {{- $npm := $css.name }}
{{- $file := $css.file }} {{- $file := $css.file }}
{{- if eq $vendor "cdnjs" }} {{- if eq $vendor "cdnjs" }}
{{- with $css.alias }} {{- with $css.alias }}
{{- $npm = . }} {{- $npm = . }}
{{- end }} {{- end }}
{{- $file = replaceRE `(dist|lib|source\/js)\/` "" $css.file }} {{- $file = replaceRE `(dist|lib|source\/js)\/` "" $css.file }}
{{- $cssFmt = "%s/%s/%s/%s" }}
{{- end }} {{- end }}
{{- $pluginCSS = replace $pluginCSS "${name}" $npm }} {{- $pluginCSS := printf $cssFmt $router $npm $css.version $file }}
{{- $pluginCSS = replace $pluginCSS "${version}" $css.version }} <link type="text/css" rel="stylesheet" href="{{ $pluginCSS }}" />
{{- $pluginCSS = replace $pluginCSS "${file}" $file }}
<link rel="stylesheet" href="{{ $pluginCSS }}">
{{- end }} {{- end }}
<!-- Main Style file --> <!-- Main Style file -->
{{- $scss := resources.Get "css/main.scss" }} {{- $scss := resources.Get "css/main.scss" }}
{{- $scss = $scss | resources.ExecuteAsTemplate "main.scss" . }} {{- $scss = $scss | resources.ExecuteAsTemplate "main.scss" . }}
@@ -27,7 +27,7 @@
<link rel="stylesheet" href="{{ $css.RelPermalink }}"> <link rel="stylesheet" href="{{ $css.RelPermalink }}">
{{- if .IsPage }} {{- if .IsPage }}
<style type="text/css"> <style type="text/css">
.post-footer hr:after { .post-footer, .flinks-list-footer hr:after {
content: "{{ .Site.Params.postFooter.endLineTip }}"; content: "{{ .Site.Params.postFooter.endLineTip }}";
} }
</style> </style>

View File

@@ -1,2 +1,3 @@
{{ partial "header/brand.html" . }} {{ partial "header/brand.html" . }}
{{ partial "header/menus.html" . }} {{ partial "header/menus.html" . }}
{{ partial "header/search.html" . }}

View File

@@ -0,0 +1,11 @@
{{- if or .Site.Params.algoliaSearch.enable .Site.Params.localSearch.enable }}
<div class="search-pop-overlay">
<div class="popup search-popup">
{{- if .Site.Params.algoliaSearch.enable }}
{{ partial "_thirdparty/search/algolia.html" . }}
{{- else if .Site.Params.localSearch.enable }}
{{ partial "_thirdparty/search/local.html" . }}
{{- end }}
</div>
</div>
{{- end }}

View File

@@ -1,14 +1,109 @@
{{/* Use to defind global variables */}} {{/* Use to defind global variables */}}
{{- if not hugo.IsExtended }} {{ $version := int (index (split hugo.Version ".") 1) }}
{{- warnf "Hugo NexT 主题使用了 SCSS 框架,请到官方地址下载 Hugo Extended 版本https://github.com/gohugoio/hugo/releases" -}} {{ if lt $version 89 }}
{{- errorf "Because that use SCSS framework in Hugo NexT, Please download Hugo extended version on offical site: https://github.com/gohugoio/hugo/releases" -}} {{ warnf "当前 Hugo 版本小于 0.89.0,请到官方地址下载 Hugo 最新版本:https://github.com/gohugoio/hugo/releases" }}
{{- end }} {{ errorf "Current Hugo version is less then 0.89.0, Please download Hugo latest version on offical site: https://github.com/gohugoio/hugo/releases" }}
{{ end }}
{{- .Scratch.Set "postsCount" (len (where .Page.Site.RegularPages "Section" "in" .Site.Params.mainSections)) -}} {{ if not hugo.IsExtended }}
{{- .Scratch.Set "catsCount" (len .Site.Taxonomies.categories) -}} {{ warnf "Hugo NexT 主题使用了 SCSS 框架,请到官方地址下载 Hugo Extended 版本https://github.com/gohugoio/hugo/releases" }}
{{- .Scratch.Set "tagsCount" (len .Site.Taxonomies.tags) -}} {{ errorf "Because that use SCSS framework in Hugo NexT, Please download Hugo extended version on offical site: https://github.com/gohugoio/hugo/releases" }}
{{- $vendors := .Site.Data.resources.vendors -}} {{ end }}
{{- $pluginVen := .Site.Params.vendors.plugins -}}
{{- $pluginCDN := index $vendors $pluginVen -}}
{{- .Scratch.Set "pluginCDN" $pluginCDN -}} {{ $globalVars := newScratch }}
{{ $globalVars.Set "postsCount" (len (where .Page.Site.RegularPages "Section" "in" .Site.Params.mainSections)) }}
{{ $globalVars.Set "catsCount" (len .Site.Taxonomies.categories) }}
{{ $globalVars.Set "tagsCount" (len .Site.Taxonomies.tags) }}
{{ $vendor := .Site.Params.vendors.plugins }}
{{ $router := index .Site.Data.resources.vendors $vendor }}
{{ $globalVars.Set "router" $router }}
{{ $config := dict
"hostname" .Site.BaseURL
"root" "/"
"lang" .Site.LanguageCode
"vendor" (dict "plugins" $vendor "router" $router)
"darkmode" .Site.Params.darkmode
"version" .Site.Data.config.version
"scheme" .Site.Params.scheme
"sidebar" .Site.Params.sidebar
"copybtn" .Site.Params.codeblock.copyBtn
"bookmark" .Site.Params.bookmark
"lazyload" .Site.Params.lazyload
"motion" .Site.Params.motion
"i18n" (dict
"placeholder" (T "SearchPh")
"empty" (T "SearchEmpty")
"hits_time" (T "SearchHitsTime")
"hits" (T "SearchHits")
)
}}
{{ if .Site.Params.localSearch.enable }}
{{ $localSearch := dict "localSearch" .Site.Params.localSearch }}
{{ $config = merge $config $localSearch }}
{{ end }}
{{ if .Site.Params.algoliaSearch.enable }}
{{ $algoliaSearch := dict
"js" .Site.Data.resources.algolia
"instantjs" .Site.Data.resources.instant
"cfg" .Site.Params.algoliaSearch
}}
{{ $config = merge $config (dict "algolia" $algoliaSearch) }}
{{ end }}
{{ with .Site.Params.waline }}
{{ $waline := dict
"js" $.Site.Data.resources.waline.js
"css" $.Site.Data.resources.waline.css
"cfg" .
}}
{{ $config = merge $config (dict "waline" $waline) }}
{{ end }}
{{ with .Site.Params.giscus }}
{{ $giscus := dict
"js" $.Site.Data.resources.giscus.js
"cfg" .
}}
{{ $config = merge $config (dict "giscus" $giscus) }}
{{ end }}
{{ with .Site.Params.artalk }}
{{ $artalk := dict
"js" $.Site.Data.resources.artalk.js
"css" $.Site.Data.resources.artalk.css
"cfg" .
}}
{{ $config = merge $config (dict "artalk" $artalk) }}
{{ end }}
{{ with .Site.Params.livere }}
{{ $livere := dict "js" $.Site.Data.resources.livere.js }}
{{ $config = merge $config (dict "livere" $livere) }}
{{ end }}
{{ with .Site.Params.utterances }}
{{ $utterances := dict
"js" $.Site.Data.resources.utterances.js
"cfg" .
}}
{{ $config = merge $config (dict "utterances" $utterances) }}
{{ end }}
{{ with .Site.Params.addThisId }}
{{ $addthis := dict
"js" $.Site.Data.resources.addthis.js
"cfg" (dict "pubid" .)
}}
{{ $config = merge $config (dict "addthis" $addthis) }}
{{ end }}
{{ $globalVars.Set "config" $config }}
{{ return $globalVars.Values }}

View File

@@ -0,0 +1,29 @@
{{ range . }}
<div class="collection-year">
<span class="collection-header">{{ .Key }}</span>
</div>
{{ range .Pages }}
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta-container">
{{ $month := .Date.Format .Site.Params.monthFormat }}
<time itemprop="dateCreated" datetime="{{ .Date.Format .Site.Params.timeFormat }}" content="{{ $month }}">
{{ $month }}
</time>
</div>
<div class="post-title">
{{- if isset .Params "extlink" }}
<a href="{{ .Params.extlink }}" rel="noopener external nofollow noreferrer" target="_blank" class="exturl post-title-link post-title-link-external" title="">
<span itemprop="name">{{- .Title -}}</span>
<i class="fa fa-external-link-alt"></i>
</a>
{{- else }}
<a class="post-title-link" href="{{ .RelPermalink | relLangURL }}" itemprop="url">
<span itemprop="name">{{ .Title }}</span>
</a>
{{- end }}
</div>
</header>
</article>
{{ end }}
{{ end }}

View File

@@ -25,15 +25,15 @@
<div class="post-nav"> <div class="post-nav">
<div class="post-nav-next post-nav-item"> <div class="post-nav-next post-nav-item">
{{- with .NextInSection }} {{- with .NextInSection }}
<a href="{{ .Permalink}}" rel="next" title="{{.Title}}"> <a href="{{ .RelPermalink | relLangURL }}" rel="next" title="{{ .Title }}">
<i class="fa fa-chevron-left"></i> {{.Title}} <i class="fa fa-chevron-left"></i> {{ .Title }}
</a> </a>
{{- end }} {{- end }}
</div> </div>
<div class="post-nav-prev post-nav-item"> <div class="post-nav-prev post-nav-item">
{{- with .PrevInSection }} {{- with .PrevInSection }}
<a href="{{ .Permalink}}" rel="prev" title="{{.Title}}"> <a href="{{ .RelPermalink | relLangURL }}" rel="prev" title="{{ .Title }}">
{{.Title}} {{ .Title }}
<i class="fa fa-chevron-right"></i> <i class="fa fa-chevron-right"></i>
</a> </a>
{{- end }} {{- end }}

View File

@@ -1,9 +1,9 @@
<!-- Plugin scripts files --> <!-- Plugin scripts files -->
{{- $jsRes := .Site.Data.resources.js }} {{- $jsRes := .Site.Data.resources.js }}
{{- $vendor := .Site.Params.vendors.plugins }} {{- $vendor := .Site.Params.vendors.plugins }}
{{- $vendorCDN := .Scratch.Get "pluginCDN" }} {{- $router := .Scratch.Get "router" }}
{{ $jsFmt := "%s/%s@%s/%s" }}
{{- range $js := $jsRes }} {{- range $js := $jsRes }}
{{- $pluginJS := $vendorCDN }}
{{- $npm := $js.name }} {{- $npm := $js.name }}
{{- $file := $js.file }} {{- $file := $js.file }}
{{- if eq $vendor "cdnjs" }} {{- if eq $vendor "cdnjs" }}
@@ -11,14 +11,15 @@
{{- $npm = . }} {{- $npm = . }}
{{- end }} {{- end }}
{{- $file = replaceRE `(dist|lib|source\/js)\/` "" $js.file }} {{- $file = replaceRE `(dist|lib|source\/js)\/` "" $js.file }}
{{- $jsFmt = "%s/%s/%s/%s" }}
{{- end }} {{- end }}
{{- $pluginJS = replace $pluginJS "${name}" $npm }} {{- $pluginJS := printf $jsFmt $router $npm $js.version $file }}
{{- $pluginJS = replace $pluginJS "${version}" $js.version }}
{{- $pluginJS = replace $pluginJS "${file}" $file }}
<script type="text/javascript" src="{{ $pluginJS }}" defer></script> <script type="text/javascript" src="{{ $pluginJS }}" defer></script>
{{- end }} {{- end }}
{{- $config := resources.Get "js/config.js" | resources.ExecuteAsTemplate "config.js" . }} <script class="next-config" data-name="main" type="application/json">{{- .Scratch.Get "config" -}}</script>
{{- $config := resources.Get "js/config.js" }}
{{- $motion := resources.Get "js/motion.js" }} {{- $motion := resources.Get "js/motion.js" }}
{{- $boot := resources.Get "js/next-boot.js" }} {{- $boot := resources.Get "js/next-boot.js" }}
{{- $utils := resources.Get "js/utils.js" }} {{- $utils := resources.Get "js/utils.js" }}
@@ -39,8 +40,41 @@
{{- $pjaxjs := resources.Get "js/pjax.js" }} {{- $pjaxjs := resources.Get "js/pjax.js" }}
{{- $nextjs = $nextjs | append $pjaxjs }} {{- $nextjs = $nextjs | append $pjaxjs }}
{{- end }} {{- end }}
{{- $nextjs = $nextjs | resources.Concat "js/hugo-next.js"}} {{- if isset .Site.Params "addthisid" }}
{{- $addthisjs := resources.Get "js/third-party/share/addthis.js" }}
{{- $nextjs = $nextjs | append $addthisjs }}
{{- end }}
{{- if isset .Site.Params "waline" }}
{{- $walinejs := resources.Get "js/third-party/comments/waline.js" }}
{{- $nextjs = $nextjs | append $walinejs }}
{{- end }}
{{- if isset .Site.Params "giscus" }}
{{- $giscusjs := resources.Get "js/third-party/comments/giscus.js" }}
{{- $nextjs = $nextjs | append $giscusjs }}
{{- end }}
{{- if isset .Site.Params "livere" }}
{{- $liverejs := resources.Get "js/third-party/comments/livere.js" }}
{{- $nextjs = $nextjs | append $liverejs }}
{{- end }}
{{- if isset .Site.Params "artalk" }}
{{- $artalkjs := resources.Get "js/third-party/comments/artalk.js" }}
{{- $nextjs = $nextjs | append $artalkjs }}
{{- end }}
{{- if isset .Site.Params "utterances" }}
{{- $utterancesjs := resources.Get "js/third-party/comments/utterances.js" }}
{{- $nextjs = $nextjs | append $utterancesjs }}
{{- end }}
{{- if .Site.Params.localSearch.enable }}
{{- $search := resources.Get "js/third-party/search/local.js" }}
{{- $nextjs = $nextjs | append $search }}
{{ end }}
{{- if .Site.Params.algoliaSearch.enable }}
{{- $search := resources.Get "js/third-party/search/algolia.js" }}
{{- $nextjs = $nextjs | append $search }}
{{ end }}
{{- $nextjs = $nextjs | resources.Concat "js/main.js"}}
{{ if hugo.IsProduction }} {{ if hugo.IsProduction }}
{{- $nextjs = $nextjs | minify | fingerprint }} {{- $nextjs = $nextjs | minify | fingerprint }}
{{ end }} {{ end }}
<script type="text/javascript" src="{{ $nextjs.RelPermalink }}" defer></script> <script type="text/javascript" src="{{ $nextjs.RelPermalink }}" defer></script>

View File

@@ -12,7 +12,7 @@
<div class="site-state-wrap site-overview-item animated"> <div class="site-state-wrap site-overview-item animated">
<nav class="site-state"> <nav class="site-state">
<div class="site-state-item site-state-posts"> <div class="site-state-item site-state-posts">
<a href="{{ "/posts/" | relLangURL }}"> <a href="{{ "/archives/" | relLangURL }}">
<span class="site-state-item-count">{{ .Scratch.Get "postsCount" }}</span> <span class="site-state-item-count">{{ .Scratch.Get "postsCount" }}</span>
<span class="site-state-item-name">{{ T "SbPostsLable" }}</span> <span class="site-state-item-name">{{ T "SbPostsLable" }}</span>
</a> </a>

View File

@@ -0,0 +1,3 @@
<div class="note {{ .Get 0 }} {{ .Get 1 }}">
{{ .Inner | markdownify }}
</div>

View File

@@ -0,0 +1,3 @@
<blockquote class="blockquote-center">
{{ .Inner | markdownify }}
</blockquote>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

Some files were not shown because too many files have changed in this diff Show More