chore: 适配

This commit is contained in:
nineya 2023-03-25 16:28:00 +08:00
parent 88e393d846
commit e12c10ca27
33 changed files with 361 additions and 763 deletions

View File

@ -65,18 +65,6 @@ spec:
label: 关闭 label: 关闭
- value: "" - value: ""
label: 跟随默认配置 label: 跟随默认配置
- $formkit: radio
name: index_carousel
label: 开启置顶轮播
value: true
help: '如果该文章被置顶,在此处可开启文章置顶轮播。'
options:
- value: "true"
label: 开启
- value: "false"
label: 关闭
- value: ""
label: 跟随默认配置
--- ---

View File

@ -7,6 +7,12 @@ spec:
- group: basic_info - group: basic_info
label: '基础信息' label: '基础信息'
formSchema: formSchema:
- $formkit: text
name: metadata_name
label: 作者用户名
placeholder: 请输入用户名
value: admin
help: 后台用户管理中作者的用户名填写错误将导致个人资料显示异常示例admin
- $formkit: text - $formkit: text
name: small_title name: small_title
label: 网站副标题 label: 网站副标题
@ -495,8 +501,6 @@ spec:
label: 广告模块 label: 广告模块
- value: 'recent_posts' - value: 'recent_posts'
label: 最近文章模块 label: 最近文章模块
- value: 'recent_comments'
label: 最近评论模块
- value: 'categories' - value: 'categories'
label: 文章分类模块 label: 文章分类模块
- value: 'tags' - value: 'tags'
@ -527,12 +531,6 @@ spec:
label: 桌面设备隐藏 label: 桌面设备隐藏
- value: 'is-not-hidden' - value: 'is-not-hidden'
label: 不隐藏 label: 不隐藏
- $formkit: text
name: metadata_name
label: 作者用户名
placeholder: 请输入用户名
value: admin
help: 后台用户管理中作者的用户名填写错误将导致个人资料显示异常示例admin
- $formkit: radio - $formkit: radio
name: enable_color_character name: enable_color_character
label: 侧边栏信息-开启彩字切换 label: 侧边栏信息-开启彩字切换
@ -702,11 +700,6 @@ spec:
label: 侧边栏最近文章-展示文章数量 label: 侧边栏最近文章-展示文章数量
placeholder: 请输入数量数值 placeholder: 请输入数量数值
value: 5 value: 5
- $formkit: text
name: recent_comments_num
label: 侧边栏最近评论-展示评论数量
placeholder: 请输入数量数值
value: 5
- $formkit: radio - $formkit: radio
name: categories_more name: categories_more
label: 侧边栏分类-显示”更多”按钮 label: 侧边栏分类-显示”更多”按钮

View File

@ -1098,11 +1098,15 @@ table td, table th {
} }
&-searchicon { &-searchicon {
display: none;
cursor: pointer; cursor: pointer;
font-size: 23px !important; font-size: 18px !important;
color: var(--main); color: var(--main);
margin-left: auto; margin-left: auto;
span {
margin-left: 4px;
font-size: 15px;
}
} }
&-mask { &-mask {
@ -3910,7 +3914,11 @@ button.swiper-pagination-bullet {
padding: 0 0.75rem; padding: 0 0.75rem;
.navbar-searchicon { .navbar-searchicon {
display: block; font-size: 23px!important;
span {
display: none;
}
} }
.navbar-search { .navbar-search {

View File

@ -6,7 +6,6 @@ const commonContext = {
initWidget() { initWidget() {
const $columnRight = $('.columns .column-right') const $columnRight = $('.columns .column-right')
const $columnRightShadow = $('.columns .column-right-shadow') const $columnRightShadow = $('.columns .column-right-shadow')
$('.widget.recent-comments .reply .link').html((i, html) => Utils.renderedEmojiHtml(html))
// 实现将右边widget拷贝的左边 // 实现将右边widget拷贝的左边
if ($columnRight.length && $columnRightShadow.length && !$columnRightShadow[0].children.length) { if ($columnRight.length && $columnRightShadow.length && !$columnRightShadow[0].children.length) {
for (const child of $columnRight[0].children) { for (const child of $columnRight[0].children) {
@ -14,36 +13,6 @@ const commonContext = {
} }
} }
}, },
/* 初始化悬浮操作按钮 */
initActions() {
const $bulletScreen = $('.actions>.bullet-screen')
if (localStorage.getItem('stop-bullet-screen') === 'true') {
$bulletScreen.addClass('stop-bullet-screen')
}
if ($('halo-comment[bullet-screen]').length !== 0) {
$bulletScreen.removeClass('is-hidden-all')
}
const applyStopBulletScreen = (stopBulletScreenValue) => {
$('halo-comment[bullet-screen]').each(function () {
const shadowDom = this.shadowRoot.getElementById('halo-comment')
if (stopBulletScreenValue) {
$(shadowDom).attr('stop-bullet-screen', 'true')
} else {
$(shadowDom).removeAttr('stop-bullet-screen')
}
})
if (stopBulletScreenValue) {
$bulletScreen.addClass('stop-bullet-screen')
} else {
$bulletScreen.removeClass('stop-bullet-screen')
}
localStorage.setItem('stop-bullet-screen', stopBulletScreenValue)
}
$bulletScreen.on('click', () => {
let stopBulletScreen = localStorage.getItem('stop-bullet-screen') || false
applyStopBulletScreen(stopBulletScreen.toString() !== 'true')
})
},
/* 初始化目录和公告模块 */ /* 初始化目录和公告模块 */
initTocAndNotice() { initTocAndNotice() {
const {pathname} = location const {pathname} = location
@ -106,10 +75,6 @@ const commonContext = {
} else { } else {
document.documentElement.classList.remove('night') document.documentElement.classList.remove('night')
} }
$('halo-comment').each(function () {
const shadowDom = this.shadowRoot.getElementById('halo-comment')
$(shadowDom)[`${isNightValue ? 'add' : 'remove'}Class`]('night')
})
localStorage.setItem('night', isNightValue) localStorage.setItem('night', isNightValue)
isNight = isNightValue isNight = isNightValue
} }
@ -201,17 +166,6 @@ const commonContext = {
} }
document.addEventListener('scroll', handleScroll) document.addEventListener('scroll', handleScroll)
}, },
/* 搜索框弹窗 */
searchDialog() {
const $result = $('.navbar-search .result')
$('.navbar-search .input').on('click', function (e) {
e.stopPropagation()
$result.addClass('active')
})
$(document).on('click', function () {
$result.removeClass('active')
})
},
/* 小屏幕伸缩侧边栏,包含导航或者目录 */ /* 小屏幕伸缩侧边栏,包含导航或者目录 */
drawerMobile() { drawerMobile() {
$('.navbar-slideicon').on('click', function (e) { $('.navbar-slideicon').on('click', function (e) {
@ -257,30 +211,6 @@ const commonContext = {
$('body, html').animate({scrollTop: 0}, 400) $('body, html').animate({scrollTop: 0}, 400)
}) })
}, },
/* 小屏幕搜索框 */
searchMobile() {
$('.navbar-searchicon').on('click', function (e) {
e.stopPropagation()
/* 关闭侧边栏 */
$('.navbar-slideout').removeClass('active')
/* 处理开启关闭状态 */
const $html = $('html')
const $mask = $('.navbar-mask')
const $above = $('.navbar-above')
const $search_out = $('.navbar-searchout')
if ($search_out.hasClass('active')) {
$html.removeClass('disable-scroll')
$mask.removeClass('active slideout')
$search_out.removeClass('active')
$above.removeClass('solid')
} else {
$html.addClass('disable-scroll')
$mask.addClass('active')
$above.addClass('solid')
$search_out.addClass('active')
}
})
},
/* 点击遮罩层关闭 */ /* 点击遮罩层关闭 */
maskClose() { maskClose() {
$('.navbar-mask') $('.navbar-mask')

View File

@ -8,16 +8,8 @@ const createSerialNumber = () => {
console.log(`sn = ${serialNumber}`) console.log(`sn = ${serialNumber}`)
return serialNumber return serialNumber
} }
const $bulletScreen = $('.actions>.bullet-screen')
// pjax请求时进行界面预处理 // pjax请求时进行界面预处理
const initPjax = () => { const initPjax = () => {
/* 重新加载悬浮导航按钮 */
if ($('halo-comment[bullet-screen]').length === 0) {
$bulletScreen.addClass('is-hidden-all')
} else {
$bulletScreen.removeClass('is-hidden-all')
}
} }
const computeScrollTop = (target) => { const computeScrollTop = (target) => {
@ -173,12 +165,8 @@ $(document).on('pjax:success', async function (event, data, status, xhr, options
} }
console.log('全部处理完成') console.log('全部处理完成')
if (window.pjaxSerialNumber !== serialNumber) return if (window.pjaxSerialNumber !== serialNumber) return
/* 初始化日志界面 */
window.journalPjax && window.journalPjax(serialNumber)
/* 初始化文章界面 */ /* 初始化文章界面 */
window.postPjax && window.postPjax(serialNumber) window.postPjax && window.postPjax(serialNumber)
/* 初始化相册界面 */
window.photoPjax && window.photoPjax(serialNumber)
/* 初始化轮播 */ /* 初始化轮播 */
commonContext.initCarousel() commonContext.initCarousel()
/* 加载主动推送或统计脚本 */ /* 加载主动推送或统计脚本 */

File diff suppressed because one or more lines are too long

View File

@ -1,103 +1,3 @@
class Emoji {
constructor(name, fileName) {
this.name = name
this.fileName = fileName
}
}
const emojiData = [
new Emoji('呵呵', 'hehe'),
new Emoji('哈哈', 'haha'),
new Emoji('吐舌', 'tushe'),
new Emoji('啊', 'a'),
new Emoji('酷', 'ku'),
new Emoji('怒', 'nu'),
new Emoji('开心', 'kaixin'),
new Emoji('汗', 'han'),
new Emoji('泪', 'lei'),
new Emoji('黑线', 'heixian'),
new Emoji('鄙视', 'bishi'),
new Emoji('不高兴', 'bugaoxing'),
new Emoji('真棒', 'zhenbang'),
new Emoji('钱', 'qian'),
new Emoji('疑问', 'yiwen'),
new Emoji('阴险', 'yingxiang'),
new Emoji('吐', 'tu'),
new Emoji('咦', 'yi'),
new Emoji('委屈', 'weiqu'),
new Emoji('花心', 'huaxin'),
new Emoji('呼~', 'hu'),
new Emoji('笑眼', 'xiaoyan'),
new Emoji('冷', 'len'),
new Emoji('太开心', 'taikaixin'),
new Emoji('滑稽', 'huaji'),
new Emoji('勉强', 'mianqiang'),
new Emoji('狂汗', 'kuanhan'),
new Emoji('乖', 'guai'),
new Emoji('睡觉', 'shuijiao'),
new Emoji('惊哭', 'jingku'),
new Emoji('生气', 'shengqi'),
new Emoji('惊讶', 'jingya'),
new Emoji('喷', 'pen'),
new Emoji('突然兴奋', 'turanxingfen'),
new Emoji('挖鼻', 'wabi'),
new Emoji('摊手', 'tanshou'),
new Emoji('捂嘴笑', 'wuzuixiao'),
new Emoji('喝酒', 'hejiu'),
new Emoji('犀利', 'xili'),
new Emoji('懒得理', 'landeli'),
new Emoji('炸药', 'zhayao'),
new Emoji('吃瓜', 'chigua'),
new Emoji('小乖', 'xiaoguai'),
new Emoji('你懂的', 'nidongde'),
new Emoji('嘿嘿嘿', 'heiheihei'),
new Emoji('欢呼', 'huanhu'),
new Emoji('笑尿', 'xiaoniao'),
new Emoji('酸爽', 'suanshuang'),
new Emoji('紧张', 'jinzhang'),
new Emoji('暗中观察', 'anzhongguancha'),
new Emoji('小红脸', 'xiaohonglian'),
new Emoji('呀咩爹', 'yamiedie'),
new Emoji('微微一笑', 'weiweiyixiao'),
new Emoji('what', 'what'),
new Emoji('托腮', 'tuosai'),
new Emoji('噗', 'pu'),
new Emoji('困成狗', 'kunchenggou'),
new Emoji('柯基暗中观察', 'kejianzhongguancha'),
new Emoji('菜狗', 'caigou'),
new Emoji('老虎', 'laohu'),
new Emoji('嗷呜', 'aowu'),
new Emoji('奥特曼', 'aoteman'),
new Emoji('黑头高兴', 'heitougaoxing'),
new Emoji('黑头瞪眼', 'heitoudengyan'),
new Emoji('望远镜', 'wangyuanjing'),
new Emoji('不听', 'butin'),
new Emoji('干饭', 'ganfan'),
new Emoji('大拇指', 'damuzhi'),
new Emoji('胜利', 'shengli'),
new Emoji('haha', 'haha2'),
new Emoji('OK', 'ok'),
new Emoji('红领巾', 'honglingjin'),
new Emoji('爱心', 'aixin'),
new Emoji('心碎', 'xinsui'),
new Emoji('玫瑰', 'meigui'),
new Emoji('礼物', 'liwu'),
new Emoji('烟花', 'yanhua'),
new Emoji('彩虹', 'caihong'),
new Emoji('太阳', 'taiyang'),
new Emoji('星星月亮', 'xingxingyueliang'),
new Emoji('蛋糕', 'dangao'),
new Emoji('茶杯', 'chabei'),
new Emoji('香蕉', 'xiangjiao'),
new Emoji('便便', 'bianbian'),
new Emoji('药丸', 'yaowan'),
new Emoji('钱币', 'qianbi'),
new Emoji('蜡烛', 'lazhu'),
new Emoji('沙发', 'shafa'),
new Emoji('音乐', 'yinyue'),
new Emoji('灯泡', 'dengpao'),
new Emoji('手纸', 'shouzhi')
]
const Utils = { const Utils = {
/** /**
* 是否移动设备 * 是否移动设备
@ -365,19 +265,6 @@ const Utils = {
} }
requestId = window.requestAnimationFrame(step) requestId = window.requestAnimationFrame(step)
}, },
/**
* 表情替换
* @param html
* @returns {*}
*/
renderedEmojiHtml(html) {
for (let emoji of emojiData) {
let name = emoji.name
let img = `<img class="dream-emoji" src="/themes/dream/source/lib/halo-comment@1.1.2/assets/emoji/${emoji.fileName}.png" alt="${name}"/>`
html = html.replace(new RegExp(`\\[/${name}\\]`, 'gm'), img)
}
return html
}
} }
window.Utils = Utils window.Utils = Utils

View File

@ -1,40 +1,36 @@
<#include "templates/layout_pjax.ftl"> <!DOCTYPE html>
<@layout title="归档 - ${blog_title!}" canonical="${archives_url!}"> <th:block xmlns:th="https://www.thymeleaf.org"
<#if (archives)?? && archives?size gt 0> th:insert="~{common/layout :: layout (title = ${'归档 - ' + site.title},
<#list archives as archive> canonical = @{/archives}, content = ~{::content}, isPost = false)}">
<div class="card card-content"> <th:block th:fragment="content" th:with="isEmpty = ${#lists.isEmpty(archives)}">
<div class="timeline-title">${archive.year?c}</div> <div th:if="${isEmpty}" class="card card-empty">
<i class="fa fa-inbox"></i>
还没有发表过文章,回<a th:href="${site.url}">主页</a>看看吧
</div>
<th:block th:unless="${isEmpty}">
<div th:each="archive : ${archives.items}" class="card card-content">
<div class="timeline-title" th:text="${archive.year}"></div>
<div class="timeline"> <div class="timeline">
<#list archive.posts as post> <th:block th:each="months : ${archive.months}">
<article class="media"> <article th:each="post : ${months.posts}" class="media">
<#if post.thumbnail?? && post.thumbnail!=''> <a th:if="${!#strings.isEmpty(post.spec.cover)}" th:href="${post.status.permalink}" class="media-left">
<a href="${post.fullPath}" class="media-left"> <img class="not-gallery" th:src="${post.spec.cover}" th:alt="${post.spec.title}">
<img class="not-gallery" src="${post.thumbnail!}" alt="${post.title!}">
</a> </a>
</#if>
<div class="media-content"> <div class="media-content">
<time datetime="${post.createTime!}">${post.createTime?string('yyyy-MM-dd')}</time> <time th:text="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd')}"></time>
<a href="${post.fullPath!}" class="title has-link-grey">${post.title!}</a> <a th:href="${post.status.permalink}" class="title has-link-grey" th:text="${post.spec.title}"></a>
<#if post.categories?? && post.categories?size gt 0> <p th:if="${!#lists.isEmpty(post.categories)}">
<p>
<#list post.categories as category>
<a class="has-link-grey" <a class="has-link-grey"
href="${category.fullPath!}">${category.name!}</a>&nbsp; th:each="cy : ${post.categories}"
</#list> th:href="${cy.status.permalink}"
th:text="${cy.spec.displayName}"></a>&nbsp;
</p> </p>
</#if>
</div> </div>
</article> </article>
</#list> </th:block>
</div> </div>
</div> </div>
</#list> <th:block th:replace="~{main/pagination :: pagination (${archives}, '/archives')}"/>
<#include "templates/main/pagination.ftl"> </th:block>
<@pagination method="archives" datas=posts display="${settings.page_number!5}" /> </th:block>
<#else> </th:block>
<div class="card card-empty">
<i class="fa fa-inbox"></i>
还没有发表过文章,回<a href="${context!}">主页</a>看看吧
</div>
</#if>
</@layout>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>{const r=new Set($('link[href*=".css"]').map((o,e)=>$(e).attr("href")).get()),c=new Set($('script[src*=".js"]').map((o,e)=>$(e).attr("src")).get()),e=()=>{var o=(new Date).getTime();return window.pjaxSerialNumber=o,console.log("sn = "+o),o},o=$(".actions>.bullet-screen"),i=()=>{0===$("halo-comment[bullet-screen]").length?o.addClass("is-hidden-all"):o.removeClass("is-hidden-all")},m=(e,n,t)=>{if(n>=e.length)t&&t();else{let o=$(e[n]).attr("src");c.has(o)?m(e,n+1,t):(console.log((t?"同步":"异步")+"顺序加载js "+o),Utils.cachedScript(o).done(function(){console.log((t?"同步":"异步")+"顺序加载js完成 "+o),c.add(o),window.DProgress&&DProgress.inc(),m(e,n+1,t)}).fail(function(){console.log((t?"同步":"异步")+"顺序加载js失败 "+o),m(e,n+1,t)}))}};$(document).on("click","a[target!=_blank][href]:not(data-not-pjax)",o=>{$.pjax.click(o,".column-main",{scrollTo:"/"!==o.currentTarget.pathname&&0!==$(".banner").length?window.innerHeight/4:0,fragment:".column-main",serialNumber:e(),timeout:8e3})}),$(document).on("submit","form[data-pjax]",function(o){$.pjax.submit(o,".column-main",{scrollTo:0,fragment:".column-main",serialNumber:e(),timeout:8e3})}),$(document).on("pjax:click",function(o,e){console.log("------------------------"),console.log("pjax:click sn = "+e.serialNumber)}),$(document).on("pjax:beforeSend",function(o,e,n){console.log("pjax:beforeSend sn = "+n.serialNumber),$("html").addClass("pjax-loading")}),$(document).on("pjax:start",function(o,e,n){console.log("pjax:start sn = "+n.serialNumber),window.DProgress&&DProgress.start(),$(".pjax-close").remove()}),$(document).on("pjax:send",function(o,e,n){console.log("pjax:send sn = "+n.serialNumber)}),$(document).on("pjax:clicked",function(o,e){console.log("pjax:clicked sn = "+e.serialNumber)}),$(document).on("pjax:beforeReplace",function(o,e,n){console.log("pjax:beforeReplace sn = "+n.serialNumber),$(".navbar-nav .current,.panel-side-menu .current").removeClass("current"),commonContext.initNavbar(),0<$("html.disable-scroll").length&&$(".navbar-mask").trigger("click")}),$(document).on("pjax:success",async function(o,e,n,t,a){a=a.serialNumber;if(console.log("pjax:success sn = "+a),window.pjaxSerialNumber===a){commonContext.initGallery(),commonContext.initTocAndNotice(),i(),$("html").removeClass("pjax-loading");const s=$($.parseHTML(e,document,!0)),l=$("head");l.find("meta").remove(),l.append(s.filter("meta")),s.filter("link[data-pjax]").each(function(){let o=$(this).attr("href");r.has(o)||(l.append($(this)),console.log("加载css "+$(this).attr("href")),this.onload=function(){r.add(o),window.DProgress&&DProgress.inc(),console.log("加载css完成 "+$(this).attr("href"))})});let o=s.filter("script[data-pjax]");if(0<o.length){o.filter("[async]").each(function(){let o=$(this).attr("src");c.has(o)||(console.log("异步无序加载js "+o),Utils.cachedScript(o).done(function(){console.log("异步无序js完成 "+o),window.DProgress&&DProgress.inc(),c.add(o)}).fail(function(){console.log("异步无序js失败 "+o)}))}),new Promise(()=>{m(o.filter("[defer]"),0)});let e=o.filter(":not([async]):not([defer])");0<e.length&&await new Promise(o=>{m(e,0,o)})}console.log("全部处理完成"),window.pjaxSerialNumber===a&&(window.journalPjax&&window.journalPjax(a),window.postPjax&&window.postPjax(a),window.photoPjax&&window.photoPjax(a),commonContext.initCarousel(),commonContext.loadMaintain(),window.DProgress)&&DProgress.done()}}),$(document).on("pjax:timeout",function(o,e,n){console.log("pjax:timeout sn = "+n.serialNumber)}),$(document).on("pjax:error",function(o,e,n,t,a){console.log(`pjax:error sn = ${a.serialNumber} error `+t)}),$(document).on("pjax:complete",function(o,e,n,t){console.log("pjax:complete sn = "+t.serialNumber)}),$(document).on("pjax:end",function(o,e,n){console.log("pjax:end sn = "+n.serialNumber),null==e&&(commonContext.initTocAndNotice(),i(),commonContext.initCarousel(),window.DProgress&&DProgress.done(),$("html").removeClass("pjax-loading"))}),$(document).on("pjax:popstate",function(){console.log("pjax:popstate")})})(); (()=>{const l=new Set($('link[href*=".css"]').map((o,e)=>$(e).attr("href")).get()),c=new Set($('script[src*=".js"]').map((o,e)=>$(e).attr("src")).get()),e=()=>{var o=(new Date).getTime();return window.pjaxSerialNumber=o,console.log("sn = "+o),o},i=(e,n,t)=>{if(n>=e.length)t&&t();else{let o=$(e[n]).attr("src");c.has(o)?i(e,n+1,t):(console.log((t?"同步":"异步")+"顺序加载js "+o),Utils.cachedScript(o).done(function(){console.log((t?"同步":"异步")+"顺序加载js完成 "+o),c.add(o),window.DProgress&&DProgress.inc(),i(e,n+1,t)}).fail(function(){console.log((t?"同步":"异步")+"顺序加载js失败 "+o),i(e,n+1,t)}))}};$(document).on("click","a[target!=_blank][href]:not(data-not-pjax)",o=>{$.pjax.click(o,".column-main",{scrollTo:"/"!==o.currentTarget.pathname&&0!==$(".banner").length?window.innerHeight/4:0,fragment:".column-main",serialNumber:e(),timeout:8e3})}),$(document).on("submit","form[data-pjax]",function(o){$.pjax.submit(o,".column-main",{scrollTo:0,fragment:".column-main",serialNumber:e(),timeout:8e3})}),$(document).on("pjax:click",function(o,e){console.log("------------------------"),console.log("pjax:click sn = "+e.serialNumber)}),$(document).on("pjax:beforeSend",function(o,e,n){console.log("pjax:beforeSend sn = "+n.serialNumber),$("html").addClass("pjax-loading")}),$(document).on("pjax:start",function(o,e,n){console.log("pjax:start sn = "+n.serialNumber),window.DProgress&&DProgress.start(),$(".pjax-close").remove()}),$(document).on("pjax:send",function(o,e,n){console.log("pjax:send sn = "+n.serialNumber)}),$(document).on("pjax:clicked",function(o,e){console.log("pjax:clicked sn = "+e.serialNumber)}),$(document).on("pjax:beforeReplace",function(o,e,n){console.log("pjax:beforeReplace sn = "+n.serialNumber),$(".navbar-nav .current,.panel-side-menu .current").removeClass("current"),commonContext.initNavbar(),0<$("html.disable-scroll").length&&$(".navbar-mask").trigger("click")}),$(document).on("pjax:success",async function(o,e,n,t,s){s=s.serialNumber;if(console.log("pjax:success sn = "+s),window.pjaxSerialNumber===s){commonContext.initGallery(),commonContext.initTocAndNotice(),$("html").removeClass("pjax-loading");const a=$($.parseHTML(e,document,!0)),r=$("head");r.find("meta").remove(),r.append(a.filter("meta")),a.filter("link[data-pjax]").each(function(){let o=$(this).attr("href");l.has(o)||(r.append($(this)),console.log("加载css "+$(this).attr("href")),this.onload=function(){l.add(o),window.DProgress&&DProgress.inc(),console.log("加载css完成 "+$(this).attr("href"))})});let o=a.filter("script[data-pjax]");if(0<o.length){o.filter("[async]").each(function(){let o=$(this).attr("src");c.has(o)||(console.log("异步无序加载js "+o),Utils.cachedScript(o).done(function(){console.log("异步无序js完成 "+o),window.DProgress&&DProgress.inc(),c.add(o)}).fail(function(){console.log("异步无序js失败 "+o)}))}),new Promise(()=>{i(o.filter("[defer]"),0)});let e=o.filter(":not([async]):not([defer])");0<e.length&&await new Promise(o=>{i(e,0,o)})}console.log("全部处理完成"),window.pjaxSerialNumber===s&&(window.postPjax&&window.postPjax(s),commonContext.initCarousel(),commonContext.loadMaintain(),window.DProgress)&&DProgress.done()}}),$(document).on("pjax:timeout",function(o,e,n){console.log("pjax:timeout sn = "+n.serialNumber)}),$(document).on("pjax:error",function(o,e,n,t,s){console.log(`pjax:error sn = ${s.serialNumber} error `+t)}),$(document).on("pjax:complete",function(o,e,n,t){console.log("pjax:complete sn = "+t.serialNumber)}),$(document).on("pjax:end",function(o,e,n){console.log("pjax:end sn = "+n.serialNumber),null==e&&(commonContext.initTocAndNotice(),commonContext.initCarousel(),window.DProgress&&DProgress.done(),$("html").removeClass("pjax-loading"))}),$(document).on("pjax:popstate",function(){console.log("pjax:popstate")})})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,39 +1,31 @@
<#include "templates/layout_pjax.ftl"> <!DOCTYPE html>
<#macro categoriesTree categories> <th:block xmlns:th="https://www.thymeleaf.org"
<#list categories as category> th:insert="~{common/layout :: layout (title = '分类 - ' + ${site.title}, canonical = @{/categories}, content = ~{::content}, isPost = false)}">
<li> <th:block th:fragment="content" th:with="isEmpty = ${#lists.isEmpty(categories)}">
<a class="level is-marginless" href="${category.fullPath!}"> <div th:if="${isEmpty}" class="card card-empty">
<span class="level-item">${category.name}</span>
<span class="level-item tag">${postCounts[category.id?c]!}</span>
</a>
<#if category.children?? && category.children?size gt 0>
<ul>
<@categoriesTree category.children/>
</ul>
</#if>
</li>
</#list>
</#macro>
<@layout title="分类 - ${blog_title!}" canonical="${categories_url!}">
<#assign postCounts = {}>
<@categoryTag method="list">
<#list categories as category>
<#assign postCounts += {category.id: category.postCount}>
</#list>
</@categoryTag>
<@categoryTag method="tree">
<#if categories?? && categories?size gt 0>
<div class="card card-content">
<div class="card-tab"><div>文章分类</div></div>
<ul class="menu-list">
<@categoriesTree categories/>
</ul>
</div>
<#else>
<div class="card card-empty">
<i class="fa fa-inbox"></i> <i class="fa fa-inbox"></i>
还没有创建过分类,回<a href="${context!}">主页</a>看看吧 还没有创建过分类,回<a th:href="${site.url}">主页</a>看看吧
</div> </div>
</#if> <th:block th:unless="${isEmpty}">
</@categoryTag> <div class="card card-content">
</@layout> <div class="card-tab">
<div>文章分类</div>
</div>
<ul class="menu-list">
<th:block th:replace="~{:: categories (${categories})}"/>
</ul>
</div>
</th:block>
</th:block>
<th:block th:fragment="categories (categories)">
<li th:each="category : ${categories}">
<a class="level is-marginless" th:href="${category.status.permalink}">
<span class="level-item" th:text="${category.spec.displayName}"></span>
<span class="level-item tag" th:text="${category.status.postCount}"></span>
</a>
<ul th:if="${!#lists.isEmpty(category.children)}">
<th:block th:replace="~{:: categories (category.children)}"/>
</ul>
</li>
</th:block>
</th:block>

View File

@ -1,6 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="https://www.thymeleaf.org" <th:block xmlns:th="https://www.thymeleaf.org"
th:include="~{common/layout :: layout (title = ${'分类:' + category.spec.displayName + ' - ' +site.title}, th:insert="~{common/layout :: layout (title = ${'分类:' + category.spec.displayName + ' - ' +site.title},
canonical = ${category.status.permalink}, content = ~{::content}, isPost = false)}"> canonical = ${category.status.permalink}, content = ~{::content}, isPost = false)}">
<th:block th:fragment="content" th:with="isEmpty = ${#lists.isEmpty(posts)}"> <th:block th:fragment="content" th:with="isEmpty = ${#lists.isEmpty(posts)}">
<div th:if="${isEmpty}" class="card card-empty"> <div th:if="${isEmpty}" class="card card-empty">
@ -18,4 +18,4 @@
<th:block th:replace="~{main/pagination :: pagination (${posts}, ${category.status.permalink})}"/> <th:block th:replace="~{main/pagination :: pagination (${posts}, ${category.status.permalink})}"/>
</th:block> </th:block>
</th:block> </th:block>
</html> </th:block>

View File

@ -1,6 +1,6 @@
<head xmlns:th="https://www.thymeleaf.org" th:fragment="head" <head xmlns:th="https://www.thymeleaf.org" th:fragment="head"
th:with="description=${isPost ? post != null ? post.spec.excerpt.raw : singlePage.spec.excerpt.raw : site.seo.description}"> th:with="description=${isPost ? post != null ? post.spec.excerpt.raw : singlePage.spec.excerpt.raw : site.seo.description}">
<title th:text="${title}"></title> <title th:text="${title + (#strings.isEmpty(site.subtitle) ? '' : '|' + site.subtitle)}"></title>
<script th:if="${(theme.config.enhance.enable_sw != 'false')}" th:src="${(theme.config.enhance.enable_sw == 'uninstall')? #theme.assets('/assets/js/sw.min.js') + '?mew=0.0.1' : '/sw.min.js?mew=0.0.1' + theme.config.enhance.enable_sw}"></script> <script th:if="${(theme.config.enhance.enable_sw != 'false')}" th:src="${(theme.config.enhance.enable_sw == 'uninstall')? #theme.assets('/assets/js/sw.min.js') + '?mew=0.0.1' : '/sw.min.js?mew=0.0.1' + theme.config.enhance.enable_sw}"></script>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>

View File

@ -1,4 +1,4 @@
<html xmlns:th="https://www.thymeleaf.org" <html lang="zh" xmlns:th="https://www.thymeleaf.org"
th:fragment="layout (title, canonical, content, isPost)"> th:fragment="layout (title, canonical, content, isPost)">
<th:block th:if="${!#strings.equals('',param._pjax)}"> <th:block th:if="${!#strings.equals('',param._pjax)}">
<th:block th:replace="~{common/head :: head}"/> <th:block th:replace="~{common/head :: head}"/>
@ -9,7 +9,9 @@
<th:block th:replace="~{common/scripts}"/> <th:block th:replace="~{common/scripts}"/>
</body> </body>
</th:block> </th:block>
<th:block th:unless="${!#strings.equals('',param._pjax)}"> <th:block th:unless="${!#strings.equals('',param._pjax)}"
th:with="stats = ${siteStatsFinder.getStats()},
contributor = ${contributorFinder.getContributor(theme.config.sidebar.metadata_name)}">
<th:block th:replace="~{common/head :: head}"/> <th:block th:replace="~{common/head :: head}"/>
<body> <body>
<th:block th:replace="~{common/navbar}"/> <th:block th:replace="~{common/navbar}"/>
@ -20,12 +22,14 @@
<div th:class="${theme.config.basic_style.sidebar_column != 'all' ? 'container two-column' : 'container' }"> <div th:class="${theme.config.basic_style.sidebar_column != 'all' ? 'container two-column' : 'container' }">
<div class="columns"> <div class="columns">
<div class="column column-main"> <div class="column column-main">
<th:block th:insert="${content}"/> <th:block th:replace="${content}"/>
</div> </div>
<th:block th:if="${theme.config.basic_style.sidebar_column!='only-right' && theme.config.basic_style.sidebar_column!='module-left'}"> <th:block
th:if="${theme.config.basic_style.sidebar_column!='only-right' && theme.config.basic_style.sidebar_column!='module-left'}">
<th:block th:replace="~{common/widget :: widget('left')}"/> <th:block th:replace="~{common/widget :: widget('left')}"/>
</th:block> </th:block>
<th:block th:if="${theme.config.basic_style.sidebar_column!='only-left' && theme.config.basic_style.sidebar_column!='module-right'}"> <th:block
th:if="${theme.config.basic_style.sidebar_column!='only-left' && theme.config.basic_style.sidebar_column!='module-right'}">
<th:block th:replace="~{common/widget :: widget('right')}"/> <th:block th:replace="~{common/widget :: widget('right')}"/>
</th:block> </th:block>
</div> </div>

View File

@ -59,120 +59,91 @@
</div> </div>
</th:block> </th:block>
</nav> </nav>
<i th:if="${pluginFinder.available('PluginSearchWidget')}" class="fa fa-search navbar-searchicon" onclick="javascript:SearchWidget.open();"><span>搜索</span></i>
<!-- <form data-pjax class="navbar-search" method="get" action="/search">-->
<!-- <input maxlength="16" autocomplete="off" placeholder="搜索内容..." name="keyword" value class="input" type="text">-->
<!-- <button type="submit" class="submit" aria-label="搜索按钮"><i class="fa fa-search"></i></button>-->
<!-- <span class="icon"></span>-->
<!-- <@postTag method="latest" top="5">-->
<!-- <nav class="result">-->
<!-- <#list posts as post>-->
<!-- <a href="${post.fullPath!}" title="${post.title!}" class="item">-->
<!-- <span class="sort">${post_index+1}</span>-->
<!-- <span class="text">${post.title!}</span>-->
<!-- </a>-->
<!-- </#list>-->
<!-- </nav>-->
<!-- </@postTag>-->
<!-- </form>-->
<i th:if="${pluginFinder.available('PluginSearchWidget')}" class="fa fa-search navbar-searchicon" href="javascript:SearchWidget.open();"></i>
</div> </div>
</div> </div>
<!-- <#&#45;&#45; mobile菜单 &ndash;&gt;--> <#-- mobile菜单 -->
<!-- <div class="navbar-slideout">--> <div class="navbar-slideout">
<!-- <div class="navbar-slideout-wrap">--> <div class="navbar-slideout-wrap">
<!-- <div class="navbar-slideout-author">--> <div class="navbar-slideout-author">
<!-- <img width="50" height="50" src="${user.avatar!}" class="avatar" alt="${user.nickname!}"/>--> <img width="50" height="50" th:src="${contributor.avatar}" th:alt="${contributor.displayName}" class="avatar"/>
<!-- <div class="info">--> <div class="info">
<!-- <a class="link" target="_blank" rel="noopener noreferrer nofollow">${user.nickname!}</a>--> <a class="link" target="_blank" rel="noopener noreferrer nofollow" th:text="${contributor.displayName}"></a>
<!-- <p class="motto">${user.description!'一句话介绍自己吧!'}</p>--> <p class="motto" th:text="${contributor.bio}"></p>
<!-- </div>--> </div>
<!-- </div>--> </div>
<!-- <ul class="navbar-slideout-menu">--> <ul class="navbar-slideout-menu">
<!-- <li class="item">--> <li class="item">
<!-- <i class="fa fa-pencil-square-o"></i>--> <i class="fa fa-pencil-square-o"></i>
<!-- <@postTag method="count"><span>累计撰写 <strong>${count!"0"}</strong> 篇文章</span></@postTag>--> <span>累计撰写 <strong th:text="${stats.post}"></strong> 篇文章</span>
<!-- </li>--> </li>
<!-- <li class="item">--> <li class="item">
<!-- <i class="fa fa-tags"></i>--> <i class="fa fa-tags"></i>
<!-- <@tagTag method="count"><span>累计创建 <strong>${count!"0"}</strong> 个标签</span></@tagTag>--> <span>累计创建 <strong th:text="${stats.category}"></strong> 个分类</span>
<!-- </li>--> </li>
<!-- <li class="item">--> <li class="item">
<!-- <i class="fa fa-commenting-o"></i>--> <i class="fa fa-commenting-o"></i>
<!-- <@commentTag method="count"><span>累计收到 <strong>${count!"0"}</strong> 条评论</span></@commentTag>--> <span>累计收到 <strong th:text="${stats.comment}"></strong> 条评论</span>
<!-- </li>--> </li>
<!-- </ul>--> </ul>
<!-- <ul class="navbar-slideout-menu not-toc">--> <ul class="navbar-slideout-menu not-toc">
<!-- <li>--> <li>
<!-- <a class="link panel" href="#" rel="nofollow">--> <a class="link panel" href="#" rel="nofollow">
<!-- <span>导航</span>--> <span>导航</span>
<!-- <i class="fa fa-angle-right"></i>--> <i class="fa fa-angle-right"></i>
<!-- </a>--> </a>
<!-- <ul class="slides panel-body panel-side-menu">--> <ul class="slides panel-body panel-side-menu">
<!-- <@menuTag method="tree">--> <li th:each="menuItem : ${menuFinder.getPrimary().menuItems}">
<!-- <#list menus?sort_by('priority') as menu>--> <a class="link"
<!-- <#if menu.children?? && menu.children?size gt 0>--> th:if="${#lists.isEmpty(menuItem.children)}"
<!-- <#if menu.name?default('')?starts_with('#hide') != true>--> th:href="${menuItem.status.href}"
<!-- <li>--> th:title="${menuItem.status.displayName}"
<!-- <div class="link panel">--> th:text="${menuItem.status.displayName}"></a>
<!-- <a href="${menu.url!}" title="${menu.name!}">${menu.name!}</a>--> <th:block th:unless="${#lists.isEmpty(menuItem.children)}">
<!-- <i class="fa fa-angle-right"></i>--> <div class="link panel">
<!-- </div>--> <a th:href="${menuItem.status.href}"
<!-- <ul class="slides panel-body">--> th:title="${menuItem.status.displayName}"
<!-- <#if menu.children?? && menu.children?size gt 0>--> th:text="${menuItem.status.displayName}"></a>
<!-- <#list menu.children?sort_by('priority') as child>--> <i class="fa fa-angle-right"></i>
<!-- <#if child.children?? && child.children?size gt 0>--> </div>
<!-- <#if child.name?default('')?starts_with('#hide') != true>--> <ul class="slides panel-body">
<!-- <li>--> <li th:each="dropdown : ${menuItem.children}">
<!-- <div class="link panel">--> <a class="link"
<!-- <a href="${child.url!}" title="${child.name!}">${child.name!}</a>--> th:if="${#lists.isEmpty(dropdown.children)}"
<!-- <i class="fa fa-angle-right"></i>--> th:href="${dropdown.status.href}"
<!-- </div>--> th:title="${dropdown.status.displayName}"
<!-- <ul class="slides panel-body">--> th:text="${dropdown.status.displayName}"></a>
<!-- <#list child.children?sort_by('priority') as child1>--> <th:block th:unless="${#lists.isEmpty(dropdown.children)}">
<!-- <#if child1.name?default('')?starts_with('#hide') != true>--> <div class="link panel">
<!-- <li>--> <a th:href="${dropdown.status.href}"
<!-- <a class="link" href="${child1.url!}" title="${child1.name!}">${child1.name!}</a>--> th:title="${dropdown.status.displayName}"
<!-- </li>--> th:text="${dropdown.status.displayName}"></a>
<!-- </#if>--> <i class="fa fa-angle-right"></i>
<!-- </#list>--> </div>
<!-- </ul>--> <ul class="slides panel-body">
<!-- </li>--> <li th:each="dropdownChild : ${dropdown.children}">
<!-- </#if>--> <a class="link"
<!-- <#else>--> th:href="${dropdownChild.status.href}"
<!-- <#if child.name?default('')?starts_with('#hide') != true>--> th:title="${dropdownChild.status.displayName}"
<!-- <li>--> th:text="${dropdownChild.status.displayName}"></a>
<!-- <a class="link" href="${child.url!}" title="${child.name!}">${child.name!}</a>--> </li>
<!-- </li>--> </ul>
<!-- </#if>--> </th:block>
<!-- </#if>--> </li>
<!-- </#list>--> </ul>
<!-- </#if>--> </th:block>
<!-- </ul>--> </li>
<!-- </li>--> </ul>
<!-- </#if>--> </li>
<!-- <#else>--> </ul>
<!-- <#if menu.name?default('')?starts_with('#hide') != true>--> <ul th:if="${theme.config.basic_style.drawer_toc}" class="navbar-slideout-menu is-toc">
<!-- <li>--> <a class="link in" href="#" rel="nofollow"><span>目录</span></a>
<!-- <a class="link" href="${menu.url!}" title="${menu.name!}">${menu.name!}</a>--> <div class="toc-content">
<!-- </li>--> </div>
<!-- </#if>--> </ul>
<!-- </#if>--> </div>
<!-- </#list>--> </div>
<!-- </@menuTag>-->
<!-- </ul>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <#if settings.drawer_toc!true>-->
<!-- <ul class="navbar-slideout-menu is-toc">-->
<!-- <a class="link in" href="#" rel="nofollow"><span>目录</span></a>-->
<!-- <div class="toc-content">-->
<!-- </div>-->
<!-- </ul>-->
<!-- </#if>-->
<!-- </div>-->
<!-- </div>-->
<div class="navbar-mask"></div> <div class="navbar-mask"></div>
</header> </header>

View File

@ -1,5 +1,6 @@
<th:block xmlns:th="https://www.thymeleaf.org"> <th:block xmlns:th="https://www.thymeleaf.org">
<script th:src="@{/assets/js/utils.min.js(mew=${theme.spec.version})}"></script> <script th:src="@{/assets/js/utils.min.js(mew=${theme.spec.version})}"></script>
<script th:src="@{/assets/js/btoc.min.js(mew=${theme.spec.version})}"></script>
<!--<#if is_carousel??>--> <!--<#if is_carousel??>-->
<!-- <script data-pjax th:src="@{/assets/lib/swiper@8.4.6/swiper-bundle.min.js}"></script>--> <!-- <script data-pjax th:src="@{/assets/lib/swiper@8.4.6/swiper-bundle.min.js}"></script>-->
<!--</#if>--> <!--</#if>-->

View File

@ -1,14 +1,98 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="https://www.thymeleaf.org" <th:block xmlns:th="https://www.thymeleaf.org"
th:include="~{common/layout :: layout (title = ${site.title}, canonical = ${site.url}, content = ~{::content}, isPost = false)}"> th:insert="~{common/layout :: layout (title = ${site.title}, canonical = ${site.url}, content = ~{::content}, isPost = false)}">
<th:block th:fragment="content" th:with="isEmpty = ${#lists.isEmpty(posts)}"> <th:block th:fragment="content" th:with="isEmpty = ${#lists.isEmpty(posts)}">
<div th:if="${isEmpty}" class="card card-empty"> <div th:if="${isEmpty}" class="card card-empty">
<i class="fa fa-inbox"></i> <i class="fa fa-inbox"></i>
还没有发表过文章 还没有发表过文章
</div> </div>
<th:block th:unless="${isEmpty}"> <th:block th:unless="${isEmpty}">
<th:block th:replace="~{::firstIndex}"/>
<th:block th:replace="~{main/article_list :: articleList (${posts.items}, ${posts.first})}"/> <th:block th:replace="~{main/article_list :: articleList (${posts.items}, ${posts.first})}"/>
<th:block th:replace="~{main/pagination :: pagination (${posts}, '/index')}"/> <th:block th:replace="~{main/pagination :: pagination (${posts}, '/index')}"/>
</th:block> </th:block>
</th:block> </th:block>
</html>
<th:block th:if="${posts.first}" th:fragment="firstIndex">
<th:block th:replace="~{::carousel}"/>
<div th:if="${!#strings.isEmpty(theme.config.basic_info.index_inform)}" class="card tips brightness"
th:text="${theme.config.basic_info.index_inform}"></div>
</th:block>
<th:block th:fragment="carousel">
</th:block>
</th:block>
<!-- <#if is_first_index!false>-->
<!-- <#local carousel_content>-->
<!-- <#list posts as post>-->
<!-- <#if post.topPriority!=1>-->
<!-- <#break>-->
<!-- </#if>-->
<!-- <#if !post.metas?? || (post.metas.index_carousel!'false')=='false'>-->
<!-- <#continue>-->
<!-- </#if>-->
<!-- <#local thumbnail = (post.thumbnail?? && post.thumbnail!='')?then(post.thumbnail!, (settings.default_thumbnail?? && settings.default_thumbnail!='')?then(settings.default_thumbnail + settings.default_thumbnail?contains('?')?then("&","?") + "postId=" + post.id?c, ''))>-->
<!-- <#if thumbnail != ''>-->
<!-- <a class="swiper-slide bg-shadow cover-image" style="background-image: url(${thumbnail})" href="${post.fullPath!}">-->
<!-- <div class="swiper-slide-details" data-swiper-parallax="200" data-swiper-parallax-duration="600">-->
<!-- <p class="swiper-slide-details-title">${post.title!}</p>-->
<!-- <ul class="breadcrumb">-->
<!-- <li><@global.timeline datetime=post.createTime/></li>-->
<!-- <li><i class="fa fa-eye"></i>${post.visits?c}</li>-->
<!-- <#if !post.disallowComment!false>-->
<!-- <li><i class="fa fa-comments-o"></i>${post.commentCount?c}</li></#if>-->
<!-- <li><i class="fa fa-thumbs-o-up"></i>${post.likes?c}</li>-->
<!-- <#local heat= (24+post.visits*0.1+post.likes*2+post.commentCount*3) />-->
<!-- <#local heatColor= '#'+(heat < 37)?string('ffa87e',(heat < 120)?string('fb734a','e0081c')) />-->
<!-- <li style="color: ${heatColor}">${heat}℃</li>-->
<!-- </ul>-->
<!-- </div>-->
<!-- </a>-->
<!-- </#if>-->
<!-- </#list>-->
<!-- </#local>-->
<!-- <#if settings.sidebar_column=='module-left' || settings.sidebar_column=='module-right'>-->
<!-- <#if settings.module_links?? && settings.module_links?trim != ''>-->
<!-- <#local module_links=settings.module_links?split('\n')>-->
<!-- <#else>-->
<!-- <#local module_links=[]>-->
<!-- <#list 0..1 as i>-->
<!-- <#local post=posts[i]>-->
<!-- <#local module_links=module_links+["推荐|${post.title!}|false|${post.thumbnail!}|${post.fullPath!}"]>-->
<!-- </#list>-->
<!-- </#if>-->
<!-- <div class="model model-index">-->
<!-- <div class="card widget swiper">-->
<!-- <div class="swiper-wrapper">${carousel_content}</div>-->
<!-- <div class="swiper-pagination"></div>-->
<!-- <div class="swiper-button-prev"></div>-->
<!-- <div class="swiper-button-next"></div>-->
<!-- </div>-->
<!-- <div class="model model-index-side">-->
<!-- <#list 0..1 as i>-->
<!-- <#if i &lt; module_links?size >-->
<!-- <@model_build module_links[i]/>-->
<!-- </#if>-->
<!-- </#list>-->
<!-- </div>-->
<!-- </div>-->
<!-- <#if module_links?size &gt; 2 && module_links?size&lt;=6>-->
<!-- <div class="model model-attach model-attach-${module_links?size-2}">-->
<!-- <#list 2..5 as i>-->
<!-- <#if i &lt; module_links?size >-->
<!-- <@model_build module_links[i]/>-->
<!-- </#if>-->
<!-- </#list>-->
<!-- </div>-->
<!-- </#if>-->
<!-- <#assign is_carousel=true />-->
<!-- <#elseif carousel_content != ''>-->
<!-- <div class="card widget swiper">-->
<!-- <div class="swiper-wrapper">${carousel_content}</div>-->
<!-- <div class="swiper-pagination"></div>-->
<!-- <div class="swiper-button-prev"></div>-->
<!-- <div class="swiper-button-next"></div>-->
<!-- </div>-->
<!-- <#assign is_carousel=true />-->
<!-- </#if>-->
<!-- </#if>-->

View File

@ -7,9 +7,9 @@
<span>打赏</span> <span>打赏</span>
<div class="donate-list"> <div class="donate-list">
<ol> <ol>
<li th:if="!#strings.isEmpty(theme.config.post.donate_alipay)"><img <li th:if="${!#strings.isEmpty(theme.config.post.donate_alipay)}"><img
th:src="${theme.config.post.donate_alipay}" alt="支付宝捐赠"></li> th:src="${theme.config.post.donate_alipay}" alt="支付宝捐赠"></li>
<li th:if="!#strings.isEmpty(theme.config.post.donate_wechat)"><img <li th:if="${!#strings.isEmpty(theme.config.post.donate_wechat)}"><img
th:src="${theme.config.post.donate_wechat}" alt="微信捐赠"></li> th:src="${theme.config.post.donate_wechat}" alt="微信捐赠"></li>
</ol> </ol>
</div> </div>

View File

@ -128,8 +128,7 @@
</div> </div>
</th:block> </th:block>
<th:block/> <th:block/>
<!--</div>-->
<!--</div>-->
<!--<#elseif thumbnail_mode == "grid">--> <!--<#elseif thumbnail_mode == "grid">-->
<!--<div class="column-main-grid">--> <!--<div class="column-main-grid">-->
<!-- <#list post_index..(posts?size-1) as i>--> <!-- <#list post_index..(posts?size-1) as i>-->
@ -183,81 +182,5 @@
<!-- <a class="card widget brightness ${(content!='')?then('bg-shadow', '')}" ${target} ${imageUrl} ${targetUrl}>${content}<div class="tag">${tag}</div></a>--> <!-- <a class="card widget brightness ${(content!='')?then('bg-shadow', '')}" ${target} ${imageUrl} ${targetUrl}>${content}<div class="tag">${tag}</div></a>-->
<!--</#macro>--> <!--</#macro>-->
<!--<#macro article_list posts>--> <!--<#macro article_list posts>-->
<!-- <#if is_first_index!false>-->
<!-- <#local carousel_content>-->
<!-- <#list posts as post>-->
<!-- <#if post.topPriority!=1>-->
<!-- <#break>-->
<!-- </#if>-->
<!-- <#if !post.metas?? || (post.metas.index_carousel!'false')=='false'>-->
<!-- <#continue>-->
<!-- </#if>-->
<!-- <#local thumbnail = (post.thumbnail?? && post.thumbnail!='')?then(post.thumbnail!, (settings.default_thumbnail?? && settings.default_thumbnail!='')?then(settings.default_thumbnail + settings.default_thumbnail?contains('?')?then("&","?") + "postId=" + post.id?c, ''))>-->
<!-- <#if thumbnail != ''>-->
<!-- <a class="swiper-slide bg-shadow cover-image" style="background-image: url(${thumbnail})" href="${post.fullPath!}">-->
<!-- <div class="swiper-slide-details" data-swiper-parallax="200" data-swiper-parallax-duration="600">-->
<!-- <p class="swiper-slide-details-title">${post.title!}</p>-->
<!-- <ul class="breadcrumb">-->
<!-- <li><@global.timeline datetime=post.createTime/></li>-->
<!-- <li><i class="fa fa-eye"></i>${post.visits?c}</li>-->
<!-- <#if !post.disallowComment!false>-->
<!-- <li><i class="fa fa-comments-o"></i>${post.commentCount?c}</li></#if>-->
<!-- <li><i class="fa fa-thumbs-o-up"></i>${post.likes?c}</li>-->
<!-- <#local heat= (24+post.visits*0.1+post.likes*2+post.commentCount*3) />-->
<!-- <#local heatColor= '#'+(heat < 37)?string('ffa87e',(heat < 120)?string('fb734a','e0081c')) />-->
<!-- <li style="color: ${heatColor}">${heat}℃</li>-->
<!-- </ul>-->
<!-- </div>-->
<!-- </a>-->
<!-- </#if>-->
<!-- </#list>-->
<!-- </#local>-->
<!-- <#if settings.sidebar_column=='module-left' || settings.sidebar_column=='module-right'>-->
<!-- <#if settings.module_links?? && settings.module_links?trim != ''>-->
<!-- <#local module_links=settings.module_links?split('\n')>-->
<!-- <#else>-->
<!-- <#local module_links=[]>-->
<!-- <#list 0..1 as i>-->
<!-- <#local post=posts[i]>-->
<!-- <#local module_links=module_links+["推荐|${post.title!}|false|${post.thumbnail!}|${post.fullPath!}"]>-->
<!-- </#list>-->
<!-- </#if>-->
<!-- <div class="model model-index">-->
<!-- <div class="card widget swiper">-->
<!-- <div class="swiper-wrapper">${carousel_content}</div>-->
<!-- <div class="swiper-pagination"></div>-->
<!-- <div class="swiper-button-prev"></div>-->
<!-- <div class="swiper-button-next"></div>-->
<!-- </div>-->
<!-- <div class="model model-index-side">-->
<!-- <#list 0..1 as i>-->
<!-- <#if i &lt; module_links?size >-->
<!-- <@model_build module_links[i]/>-->
<!-- </#if>-->
<!-- </#list>-->
<!-- </div>-->
<!-- </div>-->
<!-- <#if module_links?size &gt; 2 && module_links?size&lt;=6>-->
<!-- <div class="model model-attach model-attach-${module_links?size-2}">-->
<!-- <#list 2..5 as i>-->
<!-- <#if i &lt; module_links?size >-->
<!-- <@model_build module_links[i]/>-->
<!-- </#if>-->
<!-- </#list>-->
<!-- </div>-->
<!-- </#if>-->
<!-- <#assign is_carousel=true />-->
<!-- <#elseif carousel_content != ''>-->
<!-- <div class="card widget swiper">-->
<!-- <div class="swiper-wrapper">${carousel_content}</div>-->
<!-- <div class="swiper-pagination"></div>-->
<!-- <div class="swiper-button-prev"></div>-->
<!-- <div class="swiper-button-next"></div>-->
<!-- </div>-->
<!-- <#assign is_carousel=true />-->
<!-- </#if>-->
<!-- <#if settings.index_inform?? && settings.index_inform != ''>-->
<!-- <div class="card tips brightness">${settings.index_inform}</div>-->
<!-- </#if>-->
<!-- </#if>-->
<!--</#macro>--> <!--</#macro>-->

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="https://www.thymeleaf.org" <th:block xmlns:th="https://www.thymeleaf.org"
th:include="~{common/layout :: layout (title = ${singlePage.spec.title + ' - ' + site.title}, canonical = ${singlePage.status.permalink}, content = ~{main/article :: article (${singlePage}, 'SinglePage')}, isPost = true)}" th:insert="~{common/layout :: layout (title = ${singlePage.spec.title + ' - ' + site.title}, canonical = ${singlePage.status.permalink}, content = ~{main/article :: article (${singlePage}, 'SinglePage')}, isPost = true)}"
th:with="enableKatex = ${!#strings.isEmpty(singlePage.metadata.annotations.get('enable_katex'))? singlePage.metadata.annotations.get('enable_katex') : theme.config.post.enable_katex}, th:with="enableKatex = ${!#strings.isEmpty(singlePage.metadata.annotations.get('enable_katex'))? singlePage.metadata.annotations.get('enable_katex') : theme.config.post.enable_katex},
enableShare = ${!#strings.isEmpty(singlePage.metadata.annotations.get('enable_share'))? singlePage.metadata.annotations.get('enable_share') : theme.config.post.enable_share}, enableShare = ${!#strings.isEmpty(singlePage.metadata.annotations.get('enable_share'))? singlePage.metadata.annotations.get('enable_share') : theme.config.post.enable_share},
enableCopyright = ${!#strings.isEmpty(singlePage.metadata.annotations.get('enable_copyright'))? singlePage.metadata.annotations.get('enable_copyright') : theme.config.post.enable_copyright}"> enableCopyright = ${!#strings.isEmpty(singlePage.metadata.annotations.get('enable_copyright'))? singlePage.metadata.annotations.get('enable_copyright') : theme.config.post.enable_copyright}">
</html> </th:block>

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="https://www.thymeleaf.org" <th:block xmlns:th="https://www.thymeleaf.org"
th:include="~{common/layout :: layout (title = ${post.spec.title + ' - ' + site.title}, canonical = ${post.status.permalink}, content = ~{main/article :: article (${post}, 'Post')}, isPost = true)}" th:insert="~{common/layout :: layout (title = ${post.spec.title + ' - ' + site.title}, canonical = ${post.status.permalink}, content = ~{main/article :: article (${post}, 'Post')}, isPost = true)}"
th:with="enableKatex = ${!#strings.isEmpty(post.metadata.annotations.get('enable_katex'))? post.metadata.annotations.get('enable_katex') : theme.config.post.enable_katex}, th:with="enableKatex = ${!#strings.isEmpty(post.metadata.annotations.get('enable_katex'))? post.metadata.annotations.get('enable_katex') : theme.config.post.enable_katex},
enableShare = ${!#strings.isEmpty(post.metadata.annotations.get('enable_share'))? post.metadata.annotations.get('enable_share') : theme.config.post.enable_share}, enableShare = ${!#strings.isEmpty(post.metadata.annotations.get('enable_share'))? post.metadata.annotations.get('enable_share') : theme.config.post.enable_share},
enableCopyright = ${!#strings.isEmpty(post.metadata.annotations.get('enable_copyright'))? post.metadata.annotations.get('enable_copyright') : theme.config.post.enable_copyright}"> enableCopyright = ${!#strings.isEmpty(post.metadata.annotations.get('enable_copyright'))? post.metadata.annotations.get('enable_copyright') : theme.config.post.enable_copyright}">
</html> </th:block>

View File

@ -1,6 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="https://www.thymeleaf.org" <th:block xmlns:th="https://www.thymeleaf.org"
th:include="~{common/layout :: layout (title = ${'标签:' + tag.spec.displayName + ' - ' +site.title}, th:insert="~{common/layout :: layout (title = ${'标签:' + tag.spec.displayName + ' - ' +site.title},
canonical = ${tag.status.permalink}, content = ~{::content}, isPost = false)}"> canonical = ${tag.status.permalink}, content = ~{::content}, isPost = false)}">
<th:block th:fragment="content" th:with="isEmpty = ${#lists.isEmpty(posts)}"> <th:block th:fragment="content" th:with="isEmpty = ${#lists.isEmpty(posts)}">
<div th:if="${isEmpty}" class="card card-empty"> <div th:if="${isEmpty}" class="card card-empty">
@ -18,4 +18,4 @@
<th:block th:replace="~{main/pagination :: pagination (${posts}, ${tag.status.permalink})}"/> <th:block th:replace="~{main/pagination :: pagination (${posts}, ${tag.status.permalink})}"/>
</th:block> </th:block>
</th:block> </th:block>
</html> </th:block>

View File

@ -1,7 +1,8 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="https://www.thymeleaf.org" <th:block xmlns:th="https://www.thymeleaf.org"
th:include="~{common/layout :: layout (title = '标签 - ' + ${site.title}, canonical = @{/tags}, content = ~{::content}, isPost = false)}"> th:insert="~{common/layout :: layout (title = '标签 - ' + ${site.title}, canonical = @{/tags}, content = ~{::content}, isPost = false)}">
<th:block th:fragment="content" th:with="isEmpty = ${#lists.isEmpty(tags)}, enableTagsColor = ${theme.config.page_config.enable_tags_tag_color}"> <th:block th:fragment="content"
th:with="isEmpty = ${#lists.isEmpty(tags)}, enableTagsColor = ${theme.config.page_config.enable_tags_tag_color}">
<div th:if="${isEmpty}" class="card card-empty"> <div th:if="${isEmpty}" class="card card-empty">
<i class="fa fa-inbox"></i> <i class="fa fa-inbox"></i>
还没有创建过标签,回<a th:href="${site.url}">主页</a>看看吧 还没有创建过标签,回<a th:href="${site.url}">主页</a>看看吧
@ -22,4 +23,4 @@
</div> </div>
</th:block> </th:block>
</th:block> </th:block>
</html> </th:block>

View File

@ -1,47 +1,23 @@
<#macro categoriesTree categories>
<#list categories as category>
<li>
<a class="level is-marginless" href="${category.fullPath!}">
<span class="level-item">${category.name}</span>
<span class="level-item tag">${postCounts[category.id?c]!}</span>
</a>
<#assign num=num?number-1/>
<#if num?number gt 0 && category.children?? && category.children?size gt 0>
<ul>
<@categoriesTree category.children/>
</ul>
</#if>
</li>
<#if num?number = 0>
<#break>
</#if>
</#list>
</#macro>
<#assign num= settings.categories_num!10 />
<div xmlns:th="https://www.thymeleaf.org" <div xmlns:th="https://www.thymeleaf.org"
th:fragment="widget (hide)" th:fragment="widget (hide)"
th:class="'card widget ' + ${hide}"> th:class="'card widget ' + ${hide}"
<#assign postCounts = {}> th:with="num = ${#strings.isEmpty(theme.config.sidebar.categories_num)? 10 : T(java.lang.Integer).parseInt(theme.config.sidebar.categories_num)},
<@categoryTag method="list"> categories = ${categoryFinder.list(1,num)},
isEmpty = ${#lists.isEmpty(categories)}">
<div class="card-title"> <div class="card-title">
<i class="fa fa-th-large card-title-label"></i><span>分类</span> <i class="fa fa-th-large card-title-label"></i><span>分类</span>
<#if settings.categories_more?? && settings.categories_more== true && categories?size gt num?number> <a th:if="${categories.hasNext}" class="card-more" th:href="@{/categories}">更多<i
<a class="card-more" href="${categories_url!}">更多<i class="fa fa-angle-double-right"></i></a> class="fa fa-angle-double-right"></i></a>
</#if>
</div> </div>
<#list categories as category> <div th:if="${isEmpty}" class="card-empty">暂无分类</div>
<#assign postCounts += {category.id: category.postCount}> <div th:unless="${isEmpty}" class="card-content">
</#list>
</@categoryTag>
<@categoryTag method="tree">
<#if categories?? && categories?size gt 0>
<div class="card-content">
<ul class="menu-list"> <ul class="menu-list">
<@categoriesTree categories/> <li th:each="category : ${categories}">
<a class="level is-marginless" th:href="${category.status.permalink}">
<span class="level-item" th:text="${category.spec.displayName}"></span>
<span class="level-item tag" th:text="${category.status.postCount}"></span>
</a>
</li>
</ul> </ul>
</div> </div>
<#else>
<div class="card-empty">暂无分类</div>
</#if>
</@categoryTag>
</div> </div>

View File

@ -1,7 +1,6 @@
<div xmlns:th="https://www.thymeleaf.org" <div xmlns:th="https://www.thymeleaf.org"
th:fragment="widget (hide)" th:fragment="widget (hide)"
th:class="'card widget profile ' + ${hide}" th:class="'card widget profile ' + ${hide}">
th:with="stats = ${siteStatsFinder.getStats()}, contributor = ${contributorFinder.getContributor(theme.config.sidebar.metadata_name)}">
<div class="card-content"> <div class="card-content">
<nav class="level"> <nav class="level">
<div class="level-item" style="flex-direction: column;"> <div class="level-item" style="flex-direction: column;">

View File

@ -1,32 +0,0 @@
<div xmlns:th="https://www.thymeleaf.org"
th:fragment="widget (hide)"
th:class="'card widget recent-comments ' + ${hide}">
<div class="card-title">
<i class="fa fa-commenting-o card-title-label"></i><span>最新评论</span>
</div>
<@commentTag method="latest" top="${settings.recent_comments_num!5}">
<#if comments.content?size gt 0>
<div class="card-content">
<ul class="widget-comment">
<#list comments.content as comment>
<li class="item">
<div class="user">
<img width="35" height="35" class="avatar" src="${(settings.priority_qq_avatar!false)?then(comment.avatar?replace('^.*(\\w{32}\\?)', 'https://cravatar.cn/avatar/$1', 'r'),comment.avatar!)}"
alt="${comment.author!}">
<div class="info">
<div class="author">${comment.author!}</div>
<span class="date">${comment.createTime?string("yyyy-MM-dd")}</span>
</div>
</div>
<div class="reply">
<a class="link" href="${comment.post.fullPath!}#comment-wrapper">${comment.content!}</a>
</div>
</li>
</#list>
</ul>
</div>
<#else>
<div class="card-empty">暂无评论</div>
</#if>
</@commentTag>
</div>

View File

@ -1,7 +1,7 @@
<div xmlns:th="https://www.thymeleaf.org" <div xmlns:th="https://www.thymeleaf.org"
th:fragment="widget (hide)" th:fragment="widget (hide)"
th:class="'card widget recent-posts ' + ${hide}" th:class="'card widget recent-posts ' + ${hide}"
th:with="num = ${#strings.isEmpty(theme.config.sidebar.recent_posts_num)? 5 : #numbers.sequence(theme.config.sidebar.recent_posts_num,theme.config.sidebar.recent_posts_num)[0]}, posts = ${postFinder.list(1,num)}, isEmpty = ${#lists.isEmpty(posts)}"> th:with="num = ${#strings.isEmpty(theme.config.sidebar.recent_posts_num)? 5 : T(java.lang.Integer).parseInt(theme.config.sidebar.recent_posts_num)}, posts = ${postFinder.list(1,num)}, isEmpty = ${#lists.isEmpty(posts)}">
<div class="card-title"> <div class="card-title">
<i class="fa fa-history card-title-label"></i><span>最新文章</span> <i class="fa fa-history card-title-label"></i><span>最新文章</span>
</div> </div>

View File

@ -1,7 +1,7 @@
<div xmlns:th="https://www.thymeleaf.org" <div xmlns:th="https://www.thymeleaf.org"
th:fragment="widget (hide)" th:fragment="widget (hide)"
th:class="'card widget tagcloud ' + ${hide}" th:class="'card widget tagcloud ' + ${hide}"
th:with="num = ${#strings.isEmpty(theme.config.sidebar.tags_num)? 32 : #numbers.sequence(theme.config.sidebar.tags_num,theme.config.sidebar.tags_num)[0]}, th:with="num = ${#strings.isEmpty(theme.config.sidebar.tags_num)? 32 : T(java.lang.Integer).parseInt(theme.config.sidebar.tags_num)},
tags = ${tagFinder.list(1,num)}, tags = ${tagFinder.list(1,num)},
isEmpty = ${#lists.isEmpty(tags)}, isEmpty = ${#lists.isEmpty(tags)},
enableTagsColor = ${theme.config.sidebar.enable_tag_color}"> enableTagsColor = ${theme.config.sidebar.enable_tag_color}">

View File

@ -1,7 +1,7 @@
<div xmlns:th="https://www.thymeleaf.org" <div xmlns:th="https://www.thymeleaf.org"
th:fragment="widget (hide)" th:fragment="widget (hide)"
th:class="'card widget tags ' + ${hide}" th:class="'card widget tags ' + ${hide}"
th:with="num = ${#strings.isEmpty(theme.config.sidebar.tags_num)? 18 : #numbers.sequence(theme.config.sidebar.tags_num,theme.config.sidebar.tags_num)[0]}, th:with="num = ${#strings.isEmpty(theme.config.sidebar.tags_num)? 18 : T(java.lang.Integer).parseInt(theme.config.sidebar.tags_num)},
tags = ${tagFinder.list(1,num)}, tags = ${tagFinder.list(1,num)},
isEmpty = ${#lists.isEmpty(tags)}, isEmpty = ${#lists.isEmpty(tags)},
enableTagsColor = ${theme.config.sidebar.enable_tag_color}"> enableTagsColor = ${theme.config.sidebar.enable_tag_color}">

View File

@ -6,5 +6,4 @@
</div> </div>
<div class="card-content toc-content"> <div class="card-content toc-content">
</div> </div>
<script th:src="@{/assets/js/btoc.min.js(mew=${theme.spec.version})}"></script>
</div> </div>