Compare commits

...

65 Commits
3.6.0 ... 3.8.4

Author SHA1 Message Date
Jerry
de8e35d0d0 fix: 修復開啟 photofigcaption 後,導致 inlineImg 標籤外掛顯示錯亂的 bug close #667
fix: 修復使用本地搜索時,搜索插件配置為不搜索文章內容會無法使用搜索的 bug close #666
fix: 修復可能導致相關文章鏈接出錯的 bug close #549
improvement: 調整代碼框滾動條顏色 close #651
improvement: 當圖片沒有 figcaption 時,不會添加 figcaption 代碼
2021-09-18 22:10:50 +08:00
Jerry
101cb45b90 fix: Waline 評論系統 設置 avatarCDN 無效的 bug 2021-07-30 01:00:32 +08:00
Jerry
641fb56b22 improvement: 修改配置文件註釋 2021-07-20 23:19:14 +08:00
Jerry
7c859ef66d fix: 修復 footer 在部分瀏覽器沒有顯示在底部的 bug close #616 2021-07-20 23:09:57 +08:00
Jerry
42bc175718 Merge branch 'dev' 2021-07-10 22:32:24 +08:00
Jerry
bbb9beb8f9 Dependencies: update hexo-renderer-pug 2021-07-10 22:29:20 +08:00
Jerry
eca1487a5e fix: 修復 inline mathjax 有滾動條的 bug 2021-07-06 15:52:21 +08:00
Jerry Wong
3f796adc88 Merge pull request #607 from Android-KitKat/fix-flink
fix: 修复友情链接的头像带有灯箱的问题
2021-07-06 00:12:53 +08:00
Android
32b83a0d81 fix: 修复友情链接的头像带有 Medium Zoom 灯箱的问题 2021-07-05 03:14:48 +08:00
Android
ad87304302 fix: 修复友情链接的头像带有 FancyBox 灯箱的问题 2021-07-05 00:23:19 +08:00
Jerry
7b520c62f6 label 3.8.0 2021-07-04 18:40:01 +08:00
Jerry
026a348482 label 3.8.0 2021-07-04 18:34:42 +08:00
Jerry
829a3dbf32 breaking changes: 移除最新評論的評論服務商選擇,默認為第一個評論服務商
feat: 增加 waline avatarCDN 配置(最新評論也會更新)
feat: archives 的 標題 在 menu 配置中獲取
fix: 修復文章頁 mathjax 因字體小導致顯示重疊的 bug close #587
fix: 修復 mathjax 在列表下,導致 列表沒有樣式的 bug  close #586
improvement: 減少卡頓,apple 裝置首頁背景 background-attachment 設為 scroll
2021-06-09 14:33:55 +08:00
Jerry
54c6a509c7 breaking changes: 移除 waline 的 emojiCDN 和 emojiMaps 配置
fix: 修復 升級到 waline 1.x 而出現的 bug
2021-06-05 00:35:23 +08:00
Jerry
c214da4515 breaking changes: 移除 waline 的 emojiCDN 和 emojiMaps 配置
fix: 修復 升級到 waline 1.x 而出現的 bug
2021-05-31 22:23:14 +08:00
Jerry
de4037106b breaking changes: widget 寫法更改/可添加非sticky區域widget
feat: 升級facebook comment js 到 v10
fix: 修復當內容過少時, footer 沒有底部靠攏的bug
improvement: 404頁面不再顯示 rightside
2021-05-21 16:15:25 +08:00
Jerry
f0eaf2d8b0 label 3.7.7 2021-05-11 22:25:04 +08:00
Jerry
9e6958f25b improvement: 适配新版的 waline 夜间模式 2021-05-11 22:17:03 +08:00
Jerry
36527a3b81 fix: 修復標題/博客名有 ‘ 時,pjax 會報錯的bug
improvement: css調整
2021-05-09 00:53:56 +08:00
Jerry
c439930786 fix: 修復標題/博客名有 ‘ 時,pjax 會報錯的bug
improvement: css調整
2021-05-09 00:52:09 +08:00
Jerry
f4e5cef399 label: 3.7.5 2021-05-05 23:05:46 +08:00
Jerry
92121d7bbe label: 3.7.5 2021-05-05 23:03:28 +08:00
Jerry Wong
aced08c860 Merge pull request #559 from cooper1x/patch-2
Update _config.yml
2021-05-05 23:00:48 +08:00
Cooper
4e1cb0b2b5 Update _config.yml
fix:sub-menu二级目录示例写法
2021-05-05 22:27:39 +08:00
Jerry
aa7173fc69 feature: 增加 tags 標簽外掛 - label
improvement: 優化 pjax 下 404 頁面
2021-04-25 22:08:07 +08:00
Jerry
597f0d2019 fix: 修復開啟anchor後,瀏覽器上一頁/下一頁 跳轉會404的bug (文章頁的url hash 在pjax下變成 undefined)
fix: 修復開啟anchor後,文章頁跳轉回主頁,主頁網址的hash添加上文章頁最後一個標題的 bug
improvement: 優化 button tags 標簽外掛
2021-04-23 18:06:51 +08:00
Jerry
c48ce9af8c fix: 修復 lazyload 報 undefined 的 bug close #532 2021-03-30 22:35:40 +08:00
Jerry
531269c60e fix: 當標題有符號'時,disqus 和 disqusjs 無法加載的 bug 2021-03-30 01:36:46 +08:00
Jerry
637da0702b fix: 修復 github-issues 最新評論 獲取的url格式 bug
fix: 當標題有符號'時,disqus 和 disqusjs 無法加載的 bug
2021-03-30 01:31:17 +08:00
Jerry
6057297f44 Breaking Changes: lazyload 優化 (增加高斯模糊過度特效,增加配置 lazyload 範圍,佔位圖應用到全站)
Breaking Changes: site_verification 優化,需自行配置
2021-03-24 21:57:30 +08:00
Jerry
4b381350a1 fix: 修復 github-issues 最新評論 獲取的url格式bug 2021-03-22 16:56:15 +08:00
Jerry
6904850044 Merge branch 'dev' into master 2021-03-19 01:10:22 +08:00
Jerry
65d89334b2 label: 3.7.0
improvement: 一句 API 改爲 https
2021-03-19 01:08:50 +08:00
Jerry
1952046a8a improvement: 主頁分頁會定位到文章區域 close #519
fix: 修復設置highlight_height_limit後,highlight_shrink點擊無效的bug close #520
2021-03-17 17:27:35 +08:00
Jerry
ae09fb89b5 feature: 增加 tags 標簽外挂 inlineImg 2021-03-15 20:44:35 +08:00
Jerry
7bc46c47ed feat: 新增設置代碼行數限制,顯示展開按鈕
improvement: prismjs 可以配置 code_word_wrap
improvement: 搜索 hover 效果與其它目錄一致
improvement: css 優化
fix: 修復prismjs 無法識別的語言 顯示 null 而不是顯示 code 的 bug
fix: 修復默認代碼大小不會隨着字體放大/放小而改變的bug
fix: 修復prismjs 在ios safari 下自動換行的bug
2021-03-14 23:25:58 +08:00
Jerry
2f3094cc0a fix: 百度統計適配pjax #516 2021-03-04 16:22:04 +08:00
Jerry
6cba95298a improvement: 修改目录配置案例 2021-02-24 20:45:13 +08:00
Jerry
a4aec5971d Merge branch 'dev' of https://github.com/jerryc127/hexo-theme-butterfly into dev 2021-02-24 20:43:39 +08:00
Jerry
5ec82ca801 Breaking Change: 更改子目錄的寫法,與父目錄一致 2021-02-24 20:42:26 +08:00
Jerry Wong
92ab3fdc93 Merge pull request #510 from GZTimeWalker/dev
Add the layout of kbd tag
2021-02-24 20:03:59 +08:00
GZTime
245bdfc46f add the layout of kbd tag 2021-02-22 21:08:44 +08:00
Jerry Wong
2dbf4561bc Merge pull request #507 from weilining/dev
Improvement valine visitor
2021-02-22 15:59:15 +08:00
weilining
c25553c192 Improvement valine visitor 2021-02-21 01:28:34 +08:00
Jerry
b77a445180 feat: add gitalk option in config file 2021-02-20 23:15:34 +08:00
Jerry
41e1931a3a feat: gitalk 增加 option 配置
improvement: pug代碼優化
2021-02-20 23:10:28 +08:00
Jerry
b176ff0fa7 feat: 添加waline,valine 和twikoo 提供的文章閲讀數配置 close #502
improvement: 當文章頁cover 和cover 的 default_img都沒有配置時,會去讀取default_top_img的參數
improvement: 在完全沒有配置的情況下,運行時控制臺報null 的問題
2021-02-19 22:14:34 +08:00
Jerry
0cea722da8 remove: 移除 artitalk (如需要,請安裝 hexo-butterfly-artitalk)
remove: 移除 HexoPlusPlus_Talk(如需要,請安裝 hexo-butterfly-hpptalk)
2021-02-13 00:24:55 +08:00
Jerry Wong
f3f0666b26 Merge pull request #495 from ChenYFan/patch-1
【修复】HPP使用最新版本
2021-02-12 14:43:04 +08:00
ChenYFan
0314a980d9 Update _config.yml 2021-02-11 08:41:46 +08:00
Jerry
9e091ba85a Merge branch 'dev' of https://github.com/jerryc127/hexo-theme-butterfly into dev 2021-02-11 01:30:34 +08:00
Jerry
b199022d9b label: 3.7.0-b1 2021-02-11 01:30:20 +08:00
Jerry Wong
3958b486cc Merge pull request #494 from glahajeekn/dev
为 Butterfly 主题新增 HexoPlusPlus_Talk
2021-02-11 01:23:13 +08:00
Jerry
b063554dd2 update
update
2021-02-11 01:19:07 +08:00
Open-super
092e6c5e25 为 Butterfly 添加 HexoPlusPlus_Talk 2021-02-09 21:20:55 +08:00
choosk
1683998280 Update package.json 2021-02-08 14:34:25 +08:00
choosk
3eb7f23997 Update hpptalk.pug 2021-02-08 14:20:58 +08:00
choosk
e85315b256 Update _config.yml 2021-02-08 14:13:57 +08:00
Open-super
7c294e0482 新增HexoPlusPlus的说说 2021-02-08 14:12:09 +08:00
Jerry
4c5abe0cc5 Merge branch 'dev' into master 2021-02-03 15:43:37 +08:00
Jerry
d8cc723134 label:3.6.2 2021-02-03 15:42:58 +08:00
Jerry
4024fc7e22 fix: mathjax 和 katex 没有加载js的bug 2021-02-02 16:37:51 +08:00
Jerry
e8cfc6e083 Merge branch 'dev' into master 2021-02-01 16:36:21 +08:00
Jerry
45b093cda7 label:3.6.1 2021-02-01 16:35:11 +08:00
Jerry
a50a63905d fix: 文章頁有toc的界面出現滾動條
fix: 在layout標簽內的元素,如是position: fixed,其相對定位會更改 #482 #483
2021-02-01 16:01:33 +08:00
88 changed files with 921 additions and 808 deletions

View File

@@ -1,3 +1,9 @@
<div align="right">
Language:
🇺🇸
<a title="Chinese" href="/README_CN.md">🇨🇳</a>
</div>
# hexo-theme-butterfly
![master version](https://img.shields.io/github/package-json/v/jerryc127/hexo-theme-butterfly/master?color=%231ab1ad&label=master)
@@ -6,7 +12,9 @@
![hexo version](https://img.shields.io/badge/hexo-5.0+-0e83c)
![license](https://img.shields.io/github/license/jerryc127/hexo-theme-butterfly?color=FF5531)
Demo: 👍 [Butterfly](https://butterfly.js.org/) || 🤞 [JerryC](https://jerryc.me/)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/theme-butterfly-readme.png)
Demo: 👍 [Butterfly](https://butterfly.js.org/) || 🤞 [MYW](https://immyw.com/)
Docs: 📖 [Butterfly Docs](https://butterfly.js.org/posts/21cfbf15/)
@@ -74,9 +82,9 @@ npm i hexo-theme-butterfly
- [X] Comment (Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo)
- [x] Multiple Comment System Support
- [x] Online Chats (Chatra/Tidio/Daovoice/Gitter/Crisp)
- [x] Web analytics (Baidu Analytics/Google Analytics/Tencent Analytics/CNZZ Analytics)
- [x] Web analytics
- [x] Google AdSense
- [x] Webmaster Verification (google/Bing/Baidu/360/Yandex)
- [x] Webmaster Verification
- [x] Change website colour scheme
- [x] Typewriter Effect: activate_power_mode
- [x] Background effects (Canvas ribbon/canvas_ribbon_piao/canvas_nest)
@@ -91,6 +99,9 @@ npm i hexo-theme-butterfly
## Screenshots
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/butterfly-readme-screenshots-1.jpg)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/butterfly-readme-screenshots-2.jpg)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/butterfly-readme-screenshots-3.jpg)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/butterfly-readme-screenshots-4.jpg)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN/img/theme-butterfly-readme-homepage-1.png)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN/img/theme-butterfly-readme-homepage-2.png)

View File

@@ -1,3 +1,9 @@
<div align="right">
語言:
中文
<a title="English" href="/README.md">英文</a>
</div>
# hexo-theme-butterfly
![master version](https://img.shields.io/github/package-json/v/jerryc127/hexo-theme-butterfly/master?color=%231ab1ad&label=master)
@@ -6,7 +12,9 @@
![hexo version](https://img.shields.io/badge/hexo-5.0+-0e83c)
![license](https://img.shields.io/github/license/jerryc127/hexo-theme-butterfly?color=FF5531)
預覽: 👍 [Butterfly](https://butterfly.js.org/) || 🤞 [JerryC](https://jerryc.me/)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/theme-butterfly-readme.png)
預覽: 👍 [Butterfly](https://butterfly.js.org/) || 🤞 [MYW](https://immyw.com/)
文檔: 📖 [Butterfly Docs](https://butterfly.js.org/posts/21cfbf15/)
@@ -73,7 +81,7 @@ theme: butterfly
- [X] 多種評論系統Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo
- [x] 支持雙評論部署
- [x] 多種在線聊天Chatra/Tidio/Daovoice/Gitter/Crisp
- [x] 多種分析系統(百度分析/谷歌分析/騰訊分析/CNZZ分析
- [x] 多種分析系統
- [x] 谷歌廣告/手動廣告位置
- [x] 各種站長驗證Google/Bing/Baidu/360/Yandex
- [x] 修改網站配色
@@ -90,6 +98,9 @@ theme: butterfly
## 截圖
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/butterfly-readme-screenshots-1.jpg)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/butterfly-readme-screenshots-2.jpg)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/butterfly-readme-screenshots-3.jpg)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/butterfly-readme-screenshots-4.jpg)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN/img/theme-butterfly-readme-homepage-1.png)
![](https://cdn.jsdelivr.net/gh/jerryc127/CDN/img/theme-butterfly-readme-homepage-2.png)

View File

@@ -4,7 +4,7 @@
# format: name: link || icon
# sub-menu
# name || icon:
# name || link || icon
# name: link || icon
menu:
# Home: / || fas fa-home
@@ -12,8 +12,8 @@ menu:
# Tags: /tags/ || fas fa-tags
# Categories: /categories/ || fas fa-folder-open
# List||fas fa-list:
# - Music || /music/ || fas fa-music
# - Movie || /movies/ || fas fa-video
# Music: /music/ || fas fa-music
# Movie: /movies/ || fas fa-video
# Link: /link/ || fas fa-link
# About: /about/ || fas fa-heart
@@ -27,6 +27,7 @@ highlight_theme: light # darker / pale night / light / ocean / mac / mac light
highlight_copy: true # copy button
highlight_lang: true # show the code language
highlight_shrink: false # true: shrink the code blocks / false: expand the code blocks | none: expand code blocks and hide the button
highlight_height_limit: false # unit: px
code_word_wrap: false
# copy settings
@@ -83,7 +84,7 @@ favicon: /img/favicon.png
# Avatar (頭像)
avatar:
img:
img: https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png
effect: false
# Disable all banner image
@@ -273,6 +274,7 @@ comments:
# https://disqus.com/
disqus:
shortname:
apikey: # For newest comments widget
# Alternative Disqus - Render comments with Disqus API
# DisqusJS 評論系統,可以實現在網路審查地區載入 Disqus 評論列表,兼容原版
@@ -304,6 +306,7 @@ gitalk:
distractionFreeMode: false # Facebook-like distraction free mode.
pagerDirection: last # Comment sorting direction, available values are last and first.
createIssueManually: false # Gitalk will create a corresponding github issue for your every single page automatically
option:
# valine
# https://valine.js.org
@@ -321,6 +324,7 @@ valine:
emojiCDN: # emoji CDN
enableQQ: false # enable the Nickname box to automatically get QQ Nickname and QQ Avatar
requiredFields: nick,mail # required fields (nick/mail)
visitor: false
option:
# waline - A simple comment system with backend support fork from Valine
@@ -328,8 +332,9 @@ valine:
waline:
serverURL: # Waline server address url
avatar: monsterid # gravatar style https://zh-tw.gravatar.com/site/implement/images/#default-image
emojiCDN: # emoji CDN
bg: /image/comment_bg.png # waline background
avatarCDN: # Gravatar CDN baseURL
bg: # waline background
visitor: false
option:
# utterances
@@ -356,6 +361,7 @@ facebook_comments:
twikoo:
envId:
region:
visitor: false
option:
# Chat Services
@@ -454,25 +460,11 @@ google_adsense:
# Verification (站長驗證)
# --------------------------------------
# Google Webmaster tools verification setting
# See: https://www.google.com/webmasters/
google_site_verification:
# Bing Webmaster tools verification setting
# See: https://www.bing.com/webmaster/
bing_site_verification:
# Baidu Webmaster tools verification setting
# See: https://ziyuan.baidu.com/site/
baidu_site_verification:
# 360 Webmaster tools verification setting
# see http://zhanzhang.so.com/
qihu_site_verification:
# Yandex Webmaster tools verification setting
# see https://webmaster.yandex.com/
yandex_site_verification:
site_verification:
# - name: google-site-verification
# content: xxxxxx
# - name: baidu-site-verification
# content: xxxxxxx
# Beautify/Effect (美化/效果)
# --------------------------------------
@@ -703,17 +695,6 @@ newest_comments:
limit: 6
storage: 10 # unit: mins, save data to localStorage
avatar: true
# You can only choose one, or neither
valine: false
github_issues:
enable: false
repo:
disqus:
enable: false
forum:
api_key:
twikoo: false
waline: false
# Bottom right button (右下角按鈕)
# --------------------------------------
@@ -765,7 +746,7 @@ fancybox: true
# --------------------------------------
# mermaid
# see https://github.com/knsv/mermaid
# see https://github.com/mermaid-js/mermaid
mermaid:
enable: false
# built-in themes: default/forest/dark/neutral
@@ -788,14 +769,7 @@ note:
# other
# --------------------------------------
# Artitalk
# see https://artitalk.js.org/
artitalk:
appId:
appKey:
option:
# Pjax [Beta]
# Pjax
# It may contain bugs and unstable, give feedback when you find the bugs.
# https://github.com/MoOx/pjax
pjax:
@@ -830,21 +804,23 @@ pangu:
field: site # site/post
# Lazyload (圖片懶加載)
# https://github.com/verlok/lazyload
# https://github.com/verlok/vanilla-lazyload
lazyload:
enable: false
post: /img/loading.gif
field: site # site/post
placeholder:
blur: false
# PWA
# See https://github.com/JLHwung/hexo-offline
# ---------------
# pwa:
# enable: false
# manifest: /image/pwa/manifest.json
# apple_touch_icon: /image/pwa/apple-touch-icon.png
# favicon_32_32: /image/pwa/32.png
# favicon_16_16: /image/pwa/16.png
# mask_icon: /image/pwa/safari-pinned-tab.svg
# manifest: /pwa/manifest.json
# apple_touch_icon: /pwa/apple-touch-icon.png
# favicon_32_32: /pwa/32.png
# favicon_16_16: /pwa/16.png
# mask_icon: /pwa/safari-pinned-tab.svg
# Open graph meta tags
# https://developers.facebook.com/docs/sharing/webmasters/
@@ -899,8 +875,8 @@ CDN:
# math
mathjax: https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
katex: https://cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.css
katex_copytex: https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.js
katex_copytex_css: https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.css
katex_copytex: https://cdn.jsdelivr.net/npm/katex@latest/dist/contrib/copy-tex.min.js
katex_copytex_css: https://cdn.jsdelivr.net/npm/katex@latest/dist/contrib/copy-tex.css
mermaid: https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js
# count
@@ -949,6 +925,4 @@ CDN:
# Prism.js
prismjs_js: https://cdn.jsdelivr.net/npm/prismjs/prism.min.js
prismjs_lineNumber_js: https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js
prismjs_autoloader: https://cdn.jsdelivr.net/npm/prismjs/plugins/autoloader/prism-autoloader.min.js
artitalk: https://cdn.jsdelivr.net/npm/artitalk
prismjs_autoloader: https://cdn.jsdelivr.net/npm/prismjs/plugins/autoloader/prism-autoloader.min.js

View File

@@ -1,28 +0,0 @@
- var top_img = theme.error_404.background || theme.default_top_img
- var bg_img = `background-image: url('${url_for(top_img)}')`
doctype html
html(lang=config.language data-theme=theme.display_mode)
head
include includes/head.pug
body
if theme.preloader
!=partial('includes/loading/loading', {}, {cache: true})
if theme.fireworks && theme.fireworks.enable
canvas.fireworks
if theme.background
#web_bg
#error-wrap
.error-content
.error-img(style=bg_img)
.error-info
h1.error_title= '404'
.error_subtitle= theme.error_404.subtitle
a.button--animated(href=config.root)
i.fas.fa-rocket
= _p('error404.back_button')
include includes/additional-js.pug

17
layout/includes/404.pug Normal file
View File

@@ -0,0 +1,17 @@
- var top_img = theme.error_404.background || theme.default_top_img
- var bg_img = `background-image: url('${url_for(top_img)}')`
#body-wrap.error404
div(style='display: none')
include ./header/index.pug
#error-wrap
.error-content
.error-img(style=bg_img)
.error-info
h1.error_title= '404'
.error_subtitle= theme.error_404.subtitle
a.button--animated(href=config.root)
i.fas.fa-rocket
= _p('error404.back_button')

View File

@@ -1,5 +1,5 @@
- var pageTitle
- if (is_archive()) pageTitle = _p('page.archives')
- if (is_archive()) pageTitle = fragment_cache('findArchivesTitle', function(){return findArchivesTitle(theme.menu);})
- else if (is_tag()) pageTitle = _p('page.tag') + ': ' + page.tag
- else if (is_category()) pageTitle = _p('page.category') + ': ' + page.category
- else if (is_month()) pageTitle += ': ' + page.month + '/' + page.year

View File

@@ -1,6 +1,6 @@
if theme.Open_Graph_meta
- let contentType = is_post() ? 'article' : 'website'
- let metaImage = full_url_for(page.cover || theme.avatar.img)
- let metaImage = (page.cover || theme.avatar.img) ? full_url_for(page.cover || theme.avatar.img) : ''
- let fb_appId = theme.facebook_comments.app_id || ''
- let fb_admins = theme.facebook_comments.user_id || ''

View File

@@ -78,7 +78,8 @@
highlight = JSON.stringify({
plugin: config.highlight.enable ? 'highlighjs' : 'prismjs',
highlightCopy: theme.highlight_copy,
highlightLang: theme.highlight_lang
highlightLang: theme.highlight_lang,
highlightHeightLimit: theme.highlight_height_limit
})
}

View File

@@ -6,14 +6,16 @@
var pageToc = page.toc === true || page.toc === false ? page.toc : theme.toc.enable
var showToc = is_post() && theme.aside.enable && pageToc && (toc(page.content) !== '' || page.encrypt == true )
let titleVal = pageTitle.replace(/'/ig,"\\'")
-
script#config-diff
.
var GLOBAL_CONFIG_SITE = {
isPost: !{is_post()},
isHome: !{is_home()},
isHighlightShrink: !{isHighlightShrink},
isToc: !{showToc},
postUpdate: '!{full_date(page.updated)}'
}
script#config-diff.
var GLOBAL_CONFIG_SITE = {
title: '!{titleVal}',
isPost: !{is_post()},
isHome: !{is_home()},
isHighlightShrink: !{isHighlightShrink},
isToc: !{showToc},
postUpdate: '!{full_date(page.updated)}'
}

View File

@@ -1,14 +1,3 @@
if theme.google_site_verification
meta(name="google-site-verification" content=theme.google_site_verification)
if theme.bing_site_verification
meta(name="msvalidate.01" content=theme.bing_site_verification)
if theme.baidu_site_verification
meta(name="baidu-site-verification" content=theme.baidu_site_verification)
if theme.qihu_site_verification
meta(name="360-site-verification" content=theme.qihu_site_verification)
if theme.yandex_site_verification
meta(name="yandex-verification" content=theme.yandex_site_verification)
if theme.site_verification
each item in theme.site_verification
meta(name=item.name content=item.content)

View File

@@ -1,6 +1,6 @@
if !theme.disable_top_img && page.top_img !== false
if is_post()
- var top_img = page.top_img || page.cover || page.randomcover || theme.default_top_img
- var top_img = page.top_img || page.cover || page.randomcover
else if is_page()
- var top_img = page.top_img || theme.default_top_img
else if is_tag()
@@ -19,7 +19,7 @@ if !theme.disable_top_img && page.top_img !== false
if top_img !== false
- var imgSource = top_img && top_img.indexOf('/') !== -1 ? `background-image: url('${url_for(top_img)}')` : `background: ${top_img}`
- var bg_img = top_img ? imgSource : ''
- var site_title = is_archive() ? _p('page.archives') : page.title || page.tag || page.category || config.title
- var site_title = is_archive() ? fragment_cache('findArchivesTitle', function(){return findArchivesTitle(theme.menu);}) : page.title || page.tag || page.category || config.title
- var isHomeClass = is_home() ? 'full_page' : 'not-home-page'
- is_post() ? isHomeClass = 'post-bg' : isHomeClass
else

View File

@@ -4,7 +4,7 @@ if theme.menu
.menus_items
each value, label in theme.menu
if !Array.isArray(value)
if typeof value !== 'object'
.menus_item
a.site-page(href=url_for(trim(value.split('||')[0])))
if value.split('||')[1]
@@ -18,9 +18,9 @@ if theme.menu
span=' '+ trim(label.split('||')[0])
i.fas.fa-chevron-down.expand(class=sidebarChildHide)
ul.menus_item_child
each i in value
each val,lab in value
li
a.site-page(href=url_for(trim(i.split('||')[1])))
if i.split('||')[2]
i.fa-fw(class=trim(i.split('||')[2]))
span=' '+trim(i.split('||')[0])
a.site-page.child(href=url_for(trim(val.split('||')[0])))
if val.split('||')[1]
i.fa-fw(class=trim(val.split('||')[1]))
span=' '+ lab

View File

@@ -8,7 +8,7 @@ nav#nav
a.site-page.social-icon.search
i.fas.fa-search.fa-fw
span=' '+_p('search')
!=fragment_cache('menus', function(){return partial('includes/header/menu_item')})
!=partial('includes/header/menu_item', {}, {cache: true})
#toggle-menu
a.site-page

View File

@@ -1,3 +1,4 @@
- let comments = theme.comments
#post-info
h1.post-title= page.title || _p('no_title')
if theme.post_edit.enable
@@ -51,15 +52,28 @@
span.post-meta-label= _p('post.min2read') + ':'
span= min2read(page.content, {cn: 350, en: 160}) + _p('post.min2read_unit')
if theme.busuanzi.page_pv
//- for pv and count
mixin pvBlock(parent_id,parent_class,parent_title)
span.post-meta-separator |
span.post-meta-pv-cv
span(class=parent_class id=parent_id data-flag-title=page.title)
i.far.fa-eye.fa-fw.post-meta-icon
span.post-meta-label=_p('post.page_pv') + ':'
span#busuanzi_value_page_pv
if block
block
if !theme.comments.lazyload && page.comments !== false && theme.comments.use && theme.comments.count
- var whichCount = theme.comments.use[0]
if theme.busuanzi.page_pv
+pvBlock('','post-meta-pv-cv','')
span#busuanzi_value_page_pv
else if comments.use && !comments.lazyload
if (comments.use.includes('Valine') && theme.valine.visitor) || (comments.use.includes('Waline') && theme.waline.visitor)
+pvBlock(url_for(page.path),'leancloud_visitors',page.title)
span.leancloud-visitors-count
else if (comments.use.includes('Twikoo') && theme.twikoo.visitor)
+pvBlock('','','')
span#twikoo_visitors
if comments.count && !comments.lazyload && page.comments !== false && comments.use
- var whichCount = comments.use[0]
mixin countBlock
span.post-meta-separator |

View File

@@ -15,28 +15,32 @@ html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside
!=partial('includes/sidebar', {}, {cache: true})
#body-wrap(class=pageType)
include ./header/index.pug
if page.type !== '404'
#body-wrap(class=pageType)
include ./header/index.pug
main#content-inner.layout(class=hideAside)
if body
div!= body
main#content-inner.layout(class=hideAside)
if body
div!= body
else
block content
if theme.aside.enable && page.aside !== false
include widget/index.pug
- var footerBg = theme.footer_bg
if (footerBg)
if (footerBg === true)
- var footer_bg = bg_img
else
- var footer_bg = theme.footer_bg.indexOf('/') !== -1 ? `background-image: url('${url_for(footerBg)}')` : `background: ${footerBg}`
else
block content
if theme.aside.enable && page.aside !== false
include widget/index.pug
- var footer_bg = ''
- var footerBg = theme.footer_bg
if (footerBg)
if (footerBg === true)
- var footer_bg = bg_img
else
- var footer_bg = theme.footer_bg.indexOf('/') !== -1 ? `background-image: url('${url_for(footerBg)}')` : `background: ${footerBg}`
else
- var footer_bg = ''
footer#footer(style=footer_bg)
!=partial('includes/footer', {}, {cache: true})
footer#footer(style=footer_bg)
!=partial('includes/footer', {}, {cache: true})
else
include ./404.pug
include ./rightside.pug
!=partial('includes/third-party/search/index', {}, {cache: true})

View File

@@ -11,10 +11,7 @@ mixin articleSort(posts)
.article-sort-item(class=no_cover)
if article.cover && theme.cover.archives_enable
a.article-sort-item-img(href=url_for(article.path) title=title)
if theme.lazyload.enable
img(data-lazy-src=url_for(article.cover) alt=title onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'`)
else
img(src=url_for(article.cover) alt=title onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'`)
img(src=url_for(article.cover) alt=title onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'`)
.article-sort-item-info
.article-sort-item-time
i.far.fa-calendar-alt

View File

@@ -9,10 +9,7 @@ mixin postUI(posts)
if post_cover && theme.cover.index_enable
.post_cover(class=leftOrRight)
a(href=url_for(link) title=title)
if theme.lazyload.enable
img.post_bg(data-lazy-src=url_for(post_cover) onerror=`this.onerror=null;this.src='`+ url_for(theme.error_img.post_page) + `'` alt=title)
else
img.post_bg(src=url_for(post_cover) onerror=`this.onerror=null;this.src='`+ url_for(theme.error_img.post_page) + `'` alt=title)
img.post_bg(src=url_for(post_cover) onerror=`this.onerror=null;this.src='`+ url_for(theme.error_img.post_page) + `'` alt=title)
.recent-post-info(class=no_cover)
a.article-title(href=url_for(link) title=title)= title
.article-meta-wrap

View File

@@ -1,28 +0,0 @@
- let option = theme.artitalk.option ? JSON.stringify(theme.artitalk.option) : false
if top_img === false
h1.page-title= page.title
#artitalk_main
script.
(()=>{
let setting = {
appId: '!{theme.artitalk.appId}',
appKey: '!{theme.artitalk.appKey}',
}
if (!{Boolean(option)}) {
const otherSetting = !{option}
setting = Object.assign(setting, otherSetting)
}
const init = () => {
new Artitalk(setting)
}
if (typeof Artitalk === 'function') {
init()
} else {
getScript('!{theme.CDN.artitalk}').then(init)
}
})()

View File

@@ -13,11 +13,9 @@
each item in i.link_list
.flink-list-item
a(href=url_for(item.link) title=item.name target="_blank")
if theme.lazyload.enable
img(data-lazy-src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name )
else
.flink-item-icon
img(src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name )
span.flink-item-name= item.name
span.flink-item-desc(title=item.descr)= item.descr
.flink-item-name= item.name
.flink-item-desc(title=item.descr)= item.descr
!= page.content

View File

@@ -6,11 +6,7 @@
escape: false
}
if(!is_post())
nav#pagination
div.pagination
!=paginator(options)
else
if is_post()
- let prev = theme.post_pagination === 1 ? page.prev : page.next
- let next = theme.post_pagination === 1 ? page.next : page.prev
nav#pagination.pagination-post
@@ -19,10 +15,7 @@ else
.prev-post(class=hasPageNext)
- var pagination_cover = prev.cover === false ? prev.randomcover : prev.cover
a(href=url_for(prev.path))
if theme.lazyload.enable
img.prev-cover(data-lazy-src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of previous post')
else
img.prev-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of previous post')
img.prev-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of previous post')
.pagination-info
.label=_p('pagination.prev')
.prev_info=prev.title
@@ -32,10 +25,13 @@ else
- var pagination_cover = next.cover == false ? next.randomcover : next.cover
.next-post(class=hasPagePrev)
a(href=url_for(next.path))
if theme.lazyload.enable
img.next-cover(data-lazy-src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of next post')
else
img.next-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of next post')
img.next-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of next post')
.pagination-info
.label=_p('pagination.next')
.next_info=next.title
.next_info=next.title
else
nav#pagination
.pagination
if is_home()
- options.format = 'page/%d/#content-inner'
!=paginator(options)

View File

@@ -8,9 +8,6 @@
- var clickTo = item.link ? item.link : item.img
li.reward-item
a(href=url_for(clickTo) target='_blank')
if theme.lazyload.enable
img.post-qr-code-img(data-lazy-src=url_for(item.img) alt=item.text)
else
img.post-qr-code-img(src=url_for(item.img) alt=item.text)
img.post-qr-code-img(src=url_for(item.img) alt=item.text)
.post-qr-code-desc=item.text

View File

@@ -1,11 +1,8 @@
#sidebar
#menu-mask
#sidebar-menus
.author-avatar
if theme.lazyload.enable
img.avatar-img(data-lazy-src=url_for(theme.avatar.img) onerror=`onerror=null;src='${theme.error_img.flink}'` alt="avatar")
else
img.avatar-img(src=url_for(theme.avatar.img) onerror=`onerror=null;src='${theme.error_img.flink}'` alt="avatar")
.avatar-img.is-center
img(src=url_for(theme.avatar.img) onerror=`onerror=null;src='${theme.error_img.flink}'` alt="avatar")
.site-data
if site.posts.length
.data-item.is-center
@@ -28,4 +25,4 @@
.headline= _p('aside.categories')
.length-num= site.categories.length
hr
!=fragment_cache('menus', function(){return partial('includes/header/menu_item')})
!=partial('includes/header/menu_item', {}, {cache: true})

View File

@@ -3,10 +3,9 @@ script.
function loadWaline () {
function initWaline () {
let initData = {
el: '#waline-wrap',
el: null,
serverURL: '!{theme.waline.serverURL}',
}
const waline = new Waline(initData)
}

View File

@@ -1,9 +1,11 @@
- let disqusPageTitle = page.title.replace(/'/ig,"\\'")
script.
function loadDisqus () {
var disqus_config = function () {
this.page.url = '!{ page.permalink }'
this.page.identifier = '!{ page.path }'
this.page.title = '!{ page.title }'
this.page.title = '!{ disqusPageTitle }'
};
window.disqusReset = () => {

View File

@@ -1,4 +1,6 @@
- let disqusjsApi = theme.disqusjs.api || 'https://disqus.skk.moe/disqus/'
- let disqusjsPageTitle = page.title.replace(/'/ig,"\\'")
script.
function loadDisqusjs () {
function addDisqusjsCSS () {
@@ -15,7 +17,7 @@ script.
siteName: '!{theme.disqusjs.siteName}',
identifier: '!{ page.path }',
url: '!{ page.permalink }',
title: '!{ page.title }',
title: '!{ disqusjsPageTitle }',
api: '!{disqusjsApi}',
apikey: '!{theme.disqusjs.apikey}',
nocomment: '!{theme.disqusjs.nocomment}',

View File

@@ -7,7 +7,7 @@ script.
if (typeof FB === 'object') FB.XFBML.parse()
else {
let ele = document.createElement('script')
ele.setAttribute('src','https://connect.facebook.net/!{theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v9.0')
ele.setAttribute('src','https://connect.facebook.net/!{theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v10.0')
ele.setAttribute('async', 'true')
ele.setAttribute('defer', 'true')
ele.setAttribute('crossorigin', 'anonymous')

View File

@@ -8,7 +8,7 @@ script.
function loadGitalk () {
function initGitalk () {
var gitalk = new Gitalk({
var gitalk = new Gitalk(Object.assign({
clientID: '!{theme.gitalk.client_id}',
clientSecret: '!{theme.gitalk.client_secret}',
repo: '!{theme.gitalk.repo}',
@@ -21,7 +21,8 @@ script.
pagerDirection: '!{theme.gitalk.pagerDirection}',
createIssueManually: !{theme.gitalk.createIssueManually},
updateCountCallback: commentCount
})
},!{JSON.stringify(theme.gitalk.option)}))
gitalk.render('gitalk-container')
}

View File

@@ -1,21 +1,12 @@
- let option = theme.twikoo.option ? JSON.stringify(theme.twikoo.option) : false
script.
(()=>{
const $countDom = document.getElementById('twikoo-count')
const init = () => {
let initData = {
twikoo.init(Object.assign({
el: '#twikoo-wrap',
envId: '!{theme.twikoo.envId}',
region: '!{theme.twikoo.region}'
}
if (!{Boolean(option)}) {
const otherData = !{option}
initData = Object.assign(initData, otherData)
}
twikoo.init(initData)
}, !{JSON.stringify(theme.twikoo.option)}))
}
const getCount = () => {

View File

@@ -1,4 +1,3 @@
- let option = theme.valine.option ? JSON.stringify(theme.valine.option) : false
- let emojiMaps = '""'
if site.data.valine
- emojiMaps = JSON.stringify(site.data.valine)
@@ -6,7 +5,7 @@ if site.data.valine
script.
function loadValine () {
function initValine () {
let initData = {
const valine = new Valine(Object.assign({
el: '#vcomment',
appId: '#{theme.valine.appId}',
appKey: '#{theme.valine.appKey}',
@@ -21,18 +20,9 @@ script.
emojiMaps: !{emojiMaps},
enableQQ: #{theme.valine.enableQQ},
path: window.location.pathname,
}
if (!{Boolean(theme.valine.requiredFields)}) {
initData.requiredFields= ('!{theme.valine.requiredFields}'.split(','))
}
if (!{Boolean(option)}) {
const otherData = !{option}
initData = Object.assign(initData, otherData)
}
const valine = new Valine(initData)
requiredFields: [!{theme.valine.requiredFields ? JSON.stringify(theme.valine.requiredFields).split(',') : ''}],
visitor: #{theme.valine.visitor}
}, !{JSON.stringify(theme.valine.option)}))
}
if (typeof Valine === 'function') initValine()

View File

@@ -1,26 +1,17 @@
- let option = theme.waline.option ? JSON.stringify(theme.waline.option) : false
- let emojiMaps = '""'
if site.data.waline
- emojiMaps = JSON.stringify(site.data.waline)
- const { serverURL, avatar, avatarCDN, visitor, option } = theme.waline
script.
function loadWaline () {
function initWaline () {
let initData = {
const waline = new Waline(Object.assign({
el: '#waline-wrap',
serverURL: '!{theme.waline.serverURL}',
avatar: '#{theme.waline.avatar}',
serverURL: '!{serverURL}',
avatar: '#{avatar}',
avatarCDN: '!{avatarCDN || "https://sdn.geekzu.org/avatar/"}',
path: location.pathname,
emojiCDN: '#{theme.waline.emojiCDN}',
emojiMaps: !{emojiMaps},
}
if (!{Boolean(option)}) {
const otherData = !{option}
initData = Object.assign(initData, otherData)
}
const waline = new Waline(initData)
visitor: !{visitor},
dark: 'html[data-theme="dark"]'
}, !{JSON.stringify(option)}))
}
if (typeof Waline === 'function') initWaline()

View File

@@ -1,6 +1,6 @@
if theme.mathjax && theme.mathjax.enable
if theme.mathjax.per_page
if is_post() && is_page()
if is_post() || is_page()
include ./mathjax.pug
else
if page.mathjax
@@ -8,7 +8,7 @@ if theme.mathjax && theme.mathjax.enable
if theme.katex && theme.katex.enable
if theme.katex.per_page
if is_post() && is_page()
if is_post() || is_page()
include ./katex.pug
else
if page.katex

View File

@@ -4,7 +4,7 @@ link(rel="stylesheet" type="text/css" href=theme.CDN.katex_copytex_css)
script.
(() => {
document.querySelectorAll('#article-container span.katex-display').forEach(item => {
btf.wrap(item, 'div', '', 'katex-wrap')
btf.wrap(item, 'div', { class: 'katex-wrap'})
})
})()

View File

@@ -1,21 +1,14 @@
//- Mathjax 3
//- http://docs.mathjax.org/en/latest/upgrading/v2.html#changes-in-the-mathjax-api
//- https://github.com/mathjax/MathJax/issues/2209
//- http://docs.mathjax.org/en/latest/options/input/tex.html#the-configuration-block
//- http://docs.mathjax.org/en/latest/web/typeset.html#resetting-automatic-equation-numbering
script.
if (!window.MathJax) {
window.MathJax = {
loader: {
source: {
'[tex]/amsCd': '[tex]/amscd'
}
},
tex: {
inlineMath: [ ['$','$'], ["\\(","\\)"]],
tags: 'ams'
},
chtml: {
scale: 1.2
},
options: {
renderActions: {
findScript: [10, doc => {
@@ -29,13 +22,15 @@ script.
doc.math.push(math)
}
}, ''],
addClass: [200,() => {
document.querySelectorAll('mjx-container:not([display=\'true\']').forEach( node => {
insertScript: [200, () => {
document.querySelectorAll('mjx-container:not\([display]\)').forEach(node => {
const target = node.parentNode
if (!target.classList.contains('has-jax')) {
target.classList.add('mathjax-overflow')
if (target.nodeName.toLowerCase() === 'li') {
target.parentNode.classList.add('has-jax')
} else {
target.classList.add('has-jax')
}
})
});
}, '', false]
}
}

View File

@@ -15,7 +15,7 @@ script.
}
const getComment = () => {
fetch('https://disqus.com/api/3.0/forums/listPosts.json?forum=!{theme.newest_comments.disqus.forum}&related=thread&limit=!{theme.newest_comments.limit}&api_key=!{theme.newest_comments.disqus.api_key}')
fetch('https://disqus.com/api/3.0/forums/listPosts.json?forum=!{forum}&related=thread&limit=!{theme.newest_comments.limit}&api_key=!{apiKey}')
.then(response => response.json())
.then(data => {
const disqusArray = data.response.map(item => {

View File

@@ -15,15 +15,13 @@ script.
}
const findTrueUrl = (array) => {
let url = ''
Promise.all(array.map(item =>
fetch(item.url).then(resp => resp.json()).then(data => {
const urlArray = data.body.match(/(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?/ig)
if (data.user.login === 'utterances-bot') {
url = data.body.match(/https?\:\/\/[^\" ]+/ig).slice(-1)
return url[0]
return urlArray.pop()
} else {
url = data.body.match(/https?\:\/\/[^\" ]+/i)
return url[0]
return urlArray.shift()
}
})
)).then(res => {
@@ -40,7 +38,7 @@ script.
}
const getComment = () => {
fetch('https://api.github.com/repos/!{theme.newest_comments.github_issues.repo}/issues/comments?sort=updated&direction=desc&per_page=!{theme.newest_comments.limit}&page=1',{
fetch('https://api.github.com/repos/!{userRepo}/issues/comments?sort=updated&direction=desc&per_page=!{theme.newest_comments.limit}&page=1',{
"headers": {
Accept: 'application/vnd.github.v3.html+json'
}

View File

@@ -1,12 +1,26 @@
- let config = theme.newest_comments
- let { use } = theme.comments
if config.valine
include ./valine.pug
else if config.waline
include ./waline.pug
else if config.github_issues.enable
include ./github-issues.pug
else if config.disqus.enable
include ./disqus-comment.pug
else if config.twikoo
include ./twikoo-comment.pug
if use
- let forum,apiKey,userRepo
case use[0]
when 'Valine'
include ./valine.pug
when 'Waline'
include ./waline.pug
when 'Twikoo'
include ./twikoo-comment.pug
when 'Disqus'
- forum = theme.disqus.shortname
- apiKey = theme.disqus.apikey
include ./disqus-comment.pug
when 'Disqusjs'
- forum = theme.disqusjs.shortname
- apiKey = theme.disqusjs.apikey
include ./disqus-comment.pug
when 'Gitalk'
- let { repo,owner } = theme.gitalk
- userRepo = owner + '/' + repo
include ./github-issues.pug
when 'Utterances'
- userRepo = theme.utterances.repo
include ./github-issues.pug

View File

@@ -1,4 +1,4 @@
- let default_avatar = theme.waline.avatar
- let { avatar,avatarCDN } = theme.waline
script.
window.addEventListener('load', () => {
@@ -16,10 +16,10 @@ script.
return content
}
const getIcon = (avatar,mail) => {
if (avatar) return avatar
let defaultIcon = '!{ default_avatar ? `?d=${default_avatar}` : ''}'
let iconUrl = `https://gravatar.loli.net/avatar/${mail + defaultIcon}`
const getIcon = (ava,mail) => {
if (ava) return ava
let defaultIcon = '!{ avatar ? `?d=${avatar}` : ''}'
let iconUrl = "!{avatarCDN ? avatarCDN : 'https://gravatar.loli.net/avatar/'}" + mail + defaultIcon
return iconUrl
}
@@ -53,11 +53,10 @@ script.
const getComment = () => {
const loadWaline = () => {
Waline.Widget.RecentComments({
el: '#card-newest-comments .aside-list',
serverURL: '!{theme.waline.serverURL}',
count: !{theme.newest_comments.limit}
}).then(comments => {
const walineArray = comments.map(function (e) {
}).then(res => {
const walineArray = res.comments.map(e => {
return {
'content': changeContent(e.comment),
'avatar': getIcon(e.QQAvatar,e.mail),

View File

@@ -26,41 +26,12 @@ script.
scrollRestoration: false
})
document.addEventListener('pjax:complete', function () {
window.refreshFn()
document.querySelectorAll('script[data-pjax]').forEach(item => {
const newScript = document.createElement('script')
const content = item.text || item.textContent || item.innerHTML || ""
Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value))
newScript.appendChild(document.createTextNode(content))
item.parentNode.replaceChild(newScript, item)
})
GLOBAL_CONFIG.islazyload && window.lazyLoadInstance.update()
typeof chatBtnFn === 'function' && chatBtnFn()
typeof panguInit === 'function' && panguInit()
if (typeof gtag === 'function') {
gtag('config', '!{theme.google_analytics}', {'page_path': window.location.pathname});
}
typeof loadMeting === 'function' && document.getElementsByClassName('aplayer').length && loadMeting()
// Analytics
if (!{theme.tencent_analytics ? true : false}) {
MtaH5.pgv()
}
// prismjs
typeof Prism === 'object' && Prism.highlightAll()
typeof preloader === 'object' && preloader.endLoading()
})
document.addEventListener('pjax:send', function () {
// removeEventListener scroll
window.removeEventListener('scroll', window.tocScrollFn)
window.removeEventListener('scroll', scrollCollect)
typeof preloader === 'object' && preloader.initLoading()
if (window.aplayers) {
@@ -79,6 +50,41 @@ script.
})
document.addEventListener('pjax:complete', function () {
window.refreshFn()
document.querySelectorAll('script[data-pjax]').forEach(item => {
const newScript = document.createElement('script')
const content = item.text || item.textContent || item.innerHTML || ""
Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value))
newScript.appendChild(document.createTextNode(content))
item.parentNode.replaceChild(newScript, item)
})
GLOBAL_CONFIG.islazyload && window.lazyLoadInstance.update()
typeof chatBtnFn === 'function' && chatBtnFn()
typeof panguInit === 'function' && panguInit()
// google analytics
typeof gtag === 'function' && gtag('config', '!{theme.google_analytics}', {'page_path': window.location.pathname});
// baidu analytics
typeof _hmt === 'object' && _hmt.push(['_trackPageview',window.location.pathname]);
typeof loadMeting === 'function' && document.getElementsByClassName('aplayer').length && loadMeting()
// Analytics
if (!{theme.tencent_analytics ? true : false}) {
MtaH5.pgv()
}
// prismjs
typeof Prism === 'object' && Prism.highlightAll()
typeof preloader === 'object' && preloader.endLoading()
})
document.addEventListener('pjax:error', (e) => {
if (e.request.status === 404) {
pjax.loadUrl('/404.html')

View File

@@ -69,7 +69,7 @@ case source
when 3
script.
function subtitleType () {
getScript('http://yijuzhan.com/api/word.php?m=js').then(() => {
getScript('https://yijuzhan.com/api/word.php?m=js').then(() => {
var con = str[0]
if (!{theme.subtitle.effect}) {
var from = '出自 ' + str[1]

View File

@@ -1,10 +1,8 @@
if theme.aside.card_author.enable
.card-widget.card-info
.card-info-avatar.is-center
if theme.lazyload.enable
img.avatar-img(data-lazy-src=url_for(theme.avatar.img) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt="avatar")
else
img.avatar-img(src=url_for(theme.avatar.img) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt="avatar")
.is-center
.avatar-img
img(src=url_for(theme.avatar.img) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt="avatar")
.author-info__name= config.author
.author-info__description!= theme.aside.card_author.description || config.description

View File

@@ -1,5 +1,5 @@
if site.data.widget
each item in site.data.widget
if site.data.widget && site.data.widget.bottom
each item in site.data.widget.bottom
.card-widget(class=item.class_name id=item.id_name style=item.order ? `order: ${item.order}` : '')
.item-headline
i(class=item.icon)

View File

@@ -1,7 +1,7 @@
if theme.newest_comments.enable
.card-widget#card-newest-comments
.item-headline
i.fas.fa-bolt
i.fas.fa-comment-dots
span= _p('aside.card_newest_comments.headline')
.aside-list
span= _p('aside.card_newest_comments.loading_text')

View File

@@ -14,10 +14,7 @@ if theme.aside.card_recent_post.enable
.aside-list-item(class=no_cover)
if post_cover && theme.cover.aside_enable
a.thumbnail(href=url_for(link) title=title)
if theme.lazyload.enable
img(data-lazy-src=url_for(post_cover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title)
else
img(src=url_for(post_cover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title)
img(src=url_for(post_cover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title)
.content
a.title(href=url_for(link) title=title)= title
if theme.aside.card_recent_post.sort === 'updated'

View File

@@ -7,6 +7,6 @@ if theme.aside.card_tags.enable
- let tagLimit = theme.aside.card_tags.limit === 0 ? 0 : theme.aside.card_tags.limit || 40
if theme.aside.card_tags.color
.card-tag-cloud!= cloudTags({source: site.tags, minfontsize: 1.1, maxfontsize: 1.5, limit: tagLimit, unit: 'em'})
.card-tag-cloud!= cloudTags({source: site.tags, minfontsize: 1.15, maxfontsize: 1.45, limit: tagLimit, unit: 'em'})
else
.card-tag-cloud!= tagcloud({min_font: 1.1, max_font: 1.5, amount: tagLimit , color: true, start_color: '#999', end_color: '#99a9bf', unit: 'em'})

View File

@@ -0,0 +1,8 @@
if site.data.widget && site.data.widget.top
each item in site.data.widget.top
.card-widget(class=item.class_name id=item.id_name)
.item-headline
i(class=item.icon)
span=item.name
.item-content
!=item.html

View File

@@ -7,6 +7,7 @@
else
!=partial('includes/widget/card_author', {}, {cache: true})
!=partial('includes/widget/card_announcement', {}, {cache: true})
!=partial('includes/widget/card_top_self', {}, {cache: true})
.sticky_layout
if showToc
include ./card_post_toc.pug
@@ -16,6 +17,8 @@
//- page
!=partial('includes/widget/card_author', {}, {cache: true})
!=partial('includes/widget/card_announcement', {}, {cache: true})
!=partial('includes/widget/card_top_self', {}, {cache: true})
.sticky_layout
!=partial('includes/widget/card_recent_post', {}, {cache: true})
!=partial('includes/widget/card_ad', {}, {cache: true})
@@ -24,4 +27,4 @@
!=partial('includes/widget/card_tags', {}, {cache: true})
!=partial('includes/widget/card_archives', {}, {cache: true})
!=partial('includes/widget/card_webinfo', {}, {cache: true})
!=partial('includes/widget/card_self', {}, {cache: true})
!=partial('includes/widget/card_bottom_self', {}, {cache: true})

View File

@@ -9,8 +9,6 @@ block content
include includes/page/flink.pug
when 'categories'
include includes/page/categories.pug
when 'artitalk'
include includes/page/artitalk.pug
default
include includes/page/default-page.pug

View File

@@ -1,6 +1,6 @@
{
"name": "hexo-theme-butterfly",
"version": "3.6.0",
"version": "3.8.4",
"description": "A Simple and Card UI Design theme for Hexo",
"main": "package.json",
"scripts": {
@@ -20,13 +20,13 @@
},
"bugs": {
"url": "https://github.com/jerryc127/hexo-theme-butterfly/issues",
"email": "btf@immyw.com"
"email": "i@immyw.com"
},
"dependencies": {
"hexo-renderer-stylus": "^2.0.1",
"hexo-renderer-pug": "^1.0.0"
"hexo-renderer-pug": "^2.0.0"
},
"homepage": "https://butterfly.js.org/",
"author": "Jerry <btf@immyw.com>",
"author": "Jerry <i@immyw.com>",
"license": "Apache-2.0"
}

View File

@@ -9,7 +9,10 @@ hexo.extend.generator.register('404', function (locals) {
if (!hexo.theme.config.error_404.enable) return
return {
path: '404.html',
data: locals.posts,
layout: ['404']
layout: ['page'],
data: {
type: '404',
top_img: false
}
}
})

View File

@@ -2,7 +2,7 @@ const logger = require('hexo-log')()
hexo.extend.filter.register('before_generate', () => {
// Get first two digits of the Hexo version number
var hexoVer = hexo.version.replace(/(^.*\..*)\..*/, '$1')
const hexoVer = hexo.version.replace(/(^.*\..*)\..*/, '$1')
if (hexoVer < 5) {
logger.error('Please update Hexo to V5.0.0 or higher!')

View File

@@ -8,9 +8,22 @@
const urlFor = require('hexo-util').url_for.bind(hexo)
function lazyload (htmlContent) {
const bg = hexo.theme.config.lazyload.placeholder ? urlFor(hexo.theme.config.lazyload.placeholder) : 'data:image/gif;base64,R0lGODdhAQABAPAAAMPDwwAAACwAAAAAAQABAAACAkQBADs='
return htmlContent.replace(/(<img.*? src=)/ig, `$1 "${bg}" data-lazy-src=`)
}
hexo.extend.filter.register('after_render:html', function (data) {
const config = hexo.theme.config.lazyload
if (!config.enable) return
if (config.field !== 'site') return
return lazyload.call(this, data)
})
hexo.extend.filter.register('after_post_render', data => {
if (!hexo.theme.config.lazyload.enable) return
const bg = hexo.theme.config.lazyload.post ? urlFor(hexo.theme.config.lazyload.post) : 'data:image/gif;base64,R0lGODdhAQABAPAAAMPDwwAAACwAAAAAAQABAAACAkQBADs='
data.content = data.content.replace(/(<img.*? src=)/ig, `$1 "${bg}" data-lazy-src=`)
const config = hexo.theme.config.lazyload
if (!config.enable) return
if (config.field !== 'post') return
data.content = lazyload.call(this, data.content)
return data
})

View File

@@ -39,7 +39,7 @@ function randomCover () {
return cover
}
} else {
cover = 'https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg'
cover = theme.default_top_img || 'https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg'
return cover
}
}

View File

@@ -6,7 +6,7 @@
'use strict'
hexo.extend.helper.register('inject_head_js', function () {
const { darkmode, aside, change_font_size } = this.theme
const { darkmode, aside, change_font_size, index_img, disable_top_img, pjax} = this.theme
const localStore = `
win.saveToLocal = {
@@ -141,5 +141,21 @@ hexo.extend.helper.register('inject_head_js', function () {
`
}
return `<script>(win=>{${localStore + getScript + darkmodeJs + asideStatus + changFontAside}})(window)</script>`
let detectApple = ''
if (!disable_top_img || index_img !== false) {
detectApple = `
const detectApple = () => {
if (GLOBAL_CONFIG_SITE.isHome && /iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
`
if (pjax.enable) {
detectApple += 'document.addEventListener(\'pjax:complete\', detectApple)'
}
}
return `<script>(win=>{${localStore + getScript + darkmodeJs + asideStatus + changFontAside + detectApple}})(window)</script>`
})

View File

@@ -70,3 +70,22 @@ hexo.extend.helper.register('injectHtml', function (data) {
}
return result
})
hexo.extend.helper.register('findArchivesTitle', function (menu) {
const defaultTitle = this._p('page.archives')
if (!menu) return defaultTitle
const loop = (m) => {
for (const key in m) {
if (typeof m[key] === 'object') {
loop(m[key])
}
if (/\/archives\//.test(m[key])) {
return key
}
}
}
return loop(menu) || defaultTitle
})

View File

@@ -41,17 +41,12 @@ hexo.extend.helper.register('related_posts', function (currentPost, allPosts) {
const limitNum = config.related_post.limit || 6
const dateType = config.related_post.date_type || 'created'
const headlineLang = this._p('post.recommend')
const lazySrc = config.lazyload.enable ? 'data-lazy-src' : 'src'
relatedPosts = relatedPosts.sort(compare('weight'))
if (relatedPosts.length > 0) {
result += '<div class="relatedPosts">'
result +=
'<div class="headline"><i class="fas fa-thumbs-up fa-fw"></i><span>' +
' ' +
headlineLang +
'</span></div>'
result += `<div class="headline"><i class="fas fa-thumbs-up fa-fw"></i><span>${headlineLang}</span></div>`
result += '<div class="relatedPosts-list">'
for (let i = 0; i < Math.min(relatedPosts.length, limitNum); i++) {
@@ -59,34 +54,14 @@ hexo.extend.helper.register('related_posts', function (currentPost, allPosts) {
relatedPosts[i].cover === false
? relatedPosts[i].randomcover
: relatedPosts[i].cover
result +=
'<div><a href="' +
hexoConfig.root +
relatedPosts[i].path +
'" title="' +
relatedPosts[i].title +
'">'
result +=
'<img class="cover" ' +
lazySrc +
'="' +
this.url_for(cover) +
'" alt="cover">'
result += `<div><a href="${this.url_for(relatedPosts[i].path)}" title="${relatedPosts[i].title}">`
result += `<img class="cover" src="${this.url_for(cover)}" alt="cover">`
if (dateType === 'created') {
result +=
'<div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i>' +
' ' +
this.date(relatedPosts[i].created, hexoConfig.date_format) +
'</div>'
result += `<div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> ${this.date(relatedPosts[i].created, hexoConfig.date_format)}</div>`
} else {
result +=
'<div class="content is-center"><div class="date"><i class="fas fa-history fa-fw"></i>' +
' ' +
this.date(relatedPosts[i].updated, hexoConfig.date_format) +
'</div>'
result += `<div class="content is-center"><div class="date"><i class="fas fa-history fa-fw"></i> ${this.date(relatedPosts[i].updated, hexoConfig.date_format)}</div>`
}
result +=
'<div class="title">' + relatedPosts[i].title + '</div>'
result += `<div class="title">${relatedPosts[i].title}</div>`
result += '</div></a></div>'
}

View File

@@ -22,7 +22,7 @@ function btn (args) {
option = option.trim()
return `<a class="btn-beautify button--animated ${option}" href="${urlFor(url)}"
title="${text}">${icon.length > 0 ? `<i class="${icon} fa-fw"></i>` : ''}<span>${text}</span></a>`
title="${text}">${icon.length ? `<i class="${icon}"></i>` : ''}${text.length ? `<span>${text}</span>` : ''}</a>`
}
hexo.extend.tag.register('btn', btn, { ends: false })

17
scripts/tag/inlineImg.js Normal file
View File

@@ -0,0 +1,17 @@
/**
* inlineImg 圖片
* {% inlineImg src height %}
*/
'use strict'
const urlFor = require('hexo-util').url_for.bind(hexo)
function inlineImg (args) {
const img = args[0]
const height = args[1] ? `style="height:${args[1]}"` : ''
return `<img class="inline-img" src="${urlFor(img)}" ${height}/>`
}
hexo.extend.tag.register('inlineImg', inlineImg, { ends: false })

16
scripts/tag/label.js Normal file
View File

@@ -0,0 +1,16 @@
/**
* Butterfly
* label
* {% label text color %}
*/
'use strict'
function addLabel (args, content) {
const text = args[0]
const className = args[1] || 'default'
return `<mark class="hl-label ${className}">${text}</mark> `
}
hexo.extend.tag.register('label', addLabel, { ends: false })

View File

@@ -53,7 +53,7 @@ minWidth2000()
if hexo-config('enter_transitions')
#content-inner,
#footer
animation: main 1s
animation: bottom-top 1s
#page-header
animation: header-effect 1s
@@ -121,15 +121,14 @@ if hexo-config('avatar.effect') == true
100%
transform: translateY(0)
@keyframes main
@keyframes bottom-top
0%
opacity: 0
transform: translateY(50px)
margin-top: 50px
100%
filter: none
opacity: 1
transform: translateY(0)
margin-top: 0
@keyframes titlescale
0%

View File

@@ -19,7 +19,7 @@
--btn-hover-color: $button-hover-color
--btn-color: $button-color
--btn-bg: $button-bg
--text-bg-hover: $text-bg-hover
--text-bg-hover: rgba($text-bg-hover, .7)
--light-grey: $light-grey
--white: $white
--text-highlight-color: $text-highlight-color
@@ -206,6 +206,15 @@ img
&:not([src])
opacity: 0
// lazyload blur
if hexo-config('lazyload.enable') && hexo-config('lazyload.blur') && !hexo-config('lazyload.placeholder')
img
&[data-lazy-src]:not(.loaded)
filter: blur(10px) brightness(1)
&[data-lazy-src].error
filter: none
.img-alt
margin: -.5rem 0 .5rem
color: #858585

View File

@@ -1,4 +1,3 @@
// https://github.com/equinusocio/vsc-material-theme
$highlight_theme = hexo-config('highlight_theme')
$highlighEnable = hexo-config('highlight_settings') && hexo-config('highlight_settings.enable')
$prismjsEnable = hexo-config('prismjs_settings') && hexo-config('prismjs_settings.enable')
@@ -6,6 +5,16 @@ wordWrap = !hexo-config('highlight_settings.line_number') && hexo-config('code_w
@require 'theme'
:root
--hl-color: $highlight-foreground
--hl-bg: $highlight-background
--hltools-bg: $highlight-tools.bg-color
--hltools-color: $highlight-tools.color
--hlnumber-bg: $highlight-gutter.bg-color
--hlnumber-color: $highlight-gutter.color
--hlscrollbar-bg: $highlight-scrollbar
--hlexpand-bg: linear-gradient(180deg, rgba($highlight-background, .6), rgba($highlight-background, .9))
if $highlighEnable
@require 'highlight/index'
@@ -16,8 +25,8 @@ $code-block
overflow: auto
margin: 0 0 1rem
padding: 0
background: $highlight-background
color: $highlight-foreground
background: var(--hl-bg)
color: var(--hl-color)
line-height: $line-height-code-block
if wordWrap
@@ -56,9 +65,6 @@ blockquote
padding: .1rem .2rem
background: $code-background
color: $code-foreground
word-wrap: break-word
word-break: break-word
overflow-wrap: break-word
pre
@extend $code-block
@@ -67,7 +73,7 @@ blockquote
code
padding: 0
background: none
color: $highlight-foreground
color: var(--hl-color)
text-shadow: none
figure.highlight
@@ -88,10 +94,10 @@ blockquote
a
float: right
padding-right: 10px
color: $highlight-foreground
color: var(--hl-color)
&:hover
border-bottom-color: $highlight-foreground
border-bottom-color: var(--hl-color)
.highlight-tools
position: relative
@@ -100,11 +106,11 @@ blockquote
overflow: hidden
min-height: 1.2rem
height: 2.15em
background: $highlight-tools.bg-color
color: $highlight-tools.color
background: var(--hltools-bg)
color: var(--hltools-color)
font-size: $code-font-size
&.closed + table
&.closed ~ *
display: none
.expand
@@ -185,3 +191,38 @@ blockquote
.code-lang
left: 3.8rem !important
if hexo-config('highlight_height_limit')
.code-expand-btn
position: absolute
bottom: 0
z-index: 10
width: 100%
background: var(--hlexpand-bg)
text-align: center
font-size: $code-font-size
cursor: pointer
i
padding: .3rem 0
color: var(--hlnumber-color)
animation: code-expand-key 1.2s infinite
&.expand-done
display: none !important
&:not(.expand-done)
& ~ table,
& ~ pre
overflow: hidden
height: unit(hexo-config('highlight_height_limit'), px)
@keyframes code-expand-key
0%
opacity: .6
50%
opacity: .1
100%
opacity: .6

View File

@@ -1,7 +1,7 @@
figure.highlight
table
&::-webkit-scrollbar-thumb
background: $highlight-scrollbar
background: var(--hlscrollbar-bg)
pre .deletion
color: $highlight-deletion

View File

@@ -9,7 +9,7 @@ if $highlight_theme != false
display: inline-block
padding: 0 .3rem 0 0
min-width: 1.6rem
color: $highlight-gutter.color
color: var(--hlnumber-color)
content: counter(line)
counter-increment: line
text-align: left
@@ -29,8 +29,8 @@ if $highlight_theme != false
.gutter pre
padding-right: .5rem
padding-left: .5rem
background-color: $highlight-gutter.bg-color
color: $highlight-gutter.color
background-color: var(--hlnumber-bg)
color: var(--hlnumber-color)
text-align: right
.code pre

View File

@@ -7,7 +7,7 @@ if $highlight_theme != false
#article-container
pre[class*='language-']
&::-webkit-scrollbar-thumb
background: $highlight-scrollbar
background: var(--hlscrollbar-bg)
&:not(.line-numbers)
padding: 10px 20px

View File

@@ -8,9 +8,16 @@
> code
position: relative
white-space: inherit
line-height: $line-height-code-block
if hexo-config('code_word_wrap')
white-space: pre-wrap
else
white-space: inherit
word-wrap: normal
word-break: normal
overflow-wrap: normal
.line-numbers-rows
position: absolute
top: 0
@@ -29,6 +36,6 @@
&:before
display: block
padding-right: .8em
color: $highlight-gutter.color
color: var(--hlnumber-color)
content: counter(linenumber)
text-align: right

View File

@@ -11,7 +11,7 @@ if $highlight_theme == 'darker' || ($highlight_theme == 'mac')
color: alpha($highlight-foreground, .8),
bg-color: darken($highlight-background, 2)
}
$highlight-scrollbar = darken($highlight-background, 6)
$highlight-scrollbar = lighten($highlight-background, 8)
if $highlighEnable
$highlight-comment = #969896
@@ -37,7 +37,7 @@ if $highlight_theme == 'pale night'
color: $highlight-foreground,
bg-color: darken($highlight-background, 2)
}
$highlight-scrollbar = darken($highlight-background, 6)
$highlight-scrollbar = lighten($highlight-background, 8)
if $highlighEnable
$highlight-comment = #676E95
@@ -63,7 +63,7 @@ if $highlight_theme == 'ocean'
color: $highlight-foreground,
bg-color: darken($highlight-background, 2)
}
$highlight-scrollbar = darken($highlight-background, 5)
$highlight-scrollbar = lighten($highlight-background, 8)
if $highlighEnable
$highlight-comment = rgba(101, 115, 126, .8)

View File

@@ -1,82 +0,0 @@
if hexo-config('error_404.enable')
#error-wrap
position: absolute
top: 50%
right: 0
left: 0
margin: 0 auto
padding: 0 1rem
max-width: 1000px
transform: translate(0, -50%)
.error-content
display: flex
flex-direction: row
justify-content: center
align-items: center
margin: 0 1rem
height: 18rem
border-radius: 8px
background: var(--card-bg)
box-shadow: var(--card-box-shadow)
transition: all .3s
&:hover
box-shadow: var(--card-hover-box-shadow)
+maxWidth768()
flex-direction: column
margin: 0
height: 25rem
.error-img
flex: 1
height: 100%
border-top-left-radius: 8px
border-bottom-left-radius: 8px
background-color: $theme-color
background-position: center
background-size: cover
+maxWidth768()
flex: 1
width: 100%
border-top-right-radius: 8px
border-bottom-left-radius: 0
.error-info
flex: 1
padding: .5rem
text-align: center
font-size: 14px
if $site-name-font
font-family: $site-name-font
+maxWidth768()
flex: 1.1
width: 100%
.error_title
margin-top: -4rem
font-size: 9em
+maxWidth768()
margin-top: -3rem
.error_subtitle
@extend .limit-more-line
margin-top: -3.5rem
word-break: break-word
font-size: 1.6em
-webkit-line-clamp: 2
a
display: inline-block
margin-top: .5rem
padding: .3rem 1.5rem
background: var(--btn-bg)
color: var(--btn-color)
i
padding-right: .3rem

View File

@@ -35,15 +35,6 @@
display: none
.card-info
img
width: 110px
height: 110px
border-radius: 70px
transition: all .5s
&:hover
transform: rotate(360deg)
.author-info
&__name
font-weight: 500
@@ -103,7 +94,7 @@
font-size: 1.2em
span
margin-left: .5rem
margin-left: .3rem
.sticky_layout
+minWidth900()
@@ -115,7 +106,7 @@
.card-tag-cloud
a
display: inline-block
padding: 0 .1rem
padding: 0 .2rem
&:hover
color: $text-hover !important
@@ -331,6 +322,21 @@
&:hover
animation: more-btn-move 1s infinite
.avatar-img
overflow: hidden
margin: 0 auto
width: 110px
height: 110px
border-radius: 70px
img
height: 100%
transition: all .5s
object-fit: cover
&:hover
transform: rotate(360deg)
@keyframes more-btn-move
0%,
100%

View File

@@ -157,12 +157,9 @@
top: 70px
transition: top .5s
// css hack
// all browser in ios and safari in all apple device
_::-webkit-full-page-media,
_:future,
:root #page-header.full_page
background-attachment: scroll !important
.apple
#page-header.full_page
background-attachment: scroll !important
#page
h1.page-title
@@ -303,22 +300,6 @@ _:future,
padding: 4px
transition: transform .3s
& > a
&:after
position: absolute
bottom: 0
left: 0
z-index: -1
width: 0
height: 3px
background-color: lighten($theme-color, 30%)
content: ''
transition: all .3s ease-in-out
&:hover
&:after
width: 100%
.menus_item_child
position: absolute
right: 0
@@ -377,3 +358,19 @@ _:future,
text-shadow: .05rem .05rem .1rem rgba($dark-black, .3)
font-size: .78em
cursor: pointer
&:not(.child)
&:after
position: absolute
bottom: 0
left: 0
z-index: -1
width: 0
height: 3px
background-color: lighten($theme-color, 30%)
content: ''
transition: all .3s ease-in-out
&:hover
&:after
width: 100%

View File

@@ -161,6 +161,20 @@ no-beautify()
iframe
margin: 0 0 1rem
kbd
margin: 0 3px
padding: 3px 5px
border: 1px solid #b4b4b4
border-radius: 3px
background-color: #f8f8f8
box-shadow: 0 1px 3px rgba(0, 0, 0, .25), 0 2px 1px 0 rgba(255, 255, 255, .6) inset
color: #34495e
white-space: nowrap
font-weight: 600
font-size: .9em
font-family: Monaco, 'Ubuntu Mono', monospace
line-height: 1em
if hexo-config('beautify.enable') && hexo-config('beautify.field') == 'site'
beautify()
else if hexo-config('beautify.enable') && hexo-config('beautify.field') == 'post'
@@ -171,6 +185,9 @@ no-beautify()
else
no-beautify()
> :last-child
margin-bottom: 0 !important
#post
.tag_share
.post-meta

View File

@@ -22,22 +22,12 @@
&.open
transform: translate3d(-100%, 0, 0)
& > .author-avatar
padding: 1.3rem 1.5rem 0
text-align: center
img
width: 110px
height: 110px
border-radius: 70px
transition: all .5s
&:hover
transform: rotate(360deg)
& > .avatar-img
margin: 1rem auto
.site-data
display: table
padding: .6rem .5rem 0
padding: 0 .5rem
width: 100%
table-layout: fixed
@@ -65,25 +55,21 @@
@extend .limit-one-line
position: relative
display: block
padding: .3rem 1.5rem
padding: .3rem 1.5rem .3rem 1.1rem
color: var(--font-color)
font-size: 1.15em
cursor: pointer
&:hover
background: var(--text-bg-hover)
i:first-child
width: 25%
width: 15%
text-align: left
span
width: 75%
&:hover
color: $light-blue
.expand
position: absolute
top: .78em
right: .4rem
right: .9rem
transition: transform .3s
&.hide

View File

@@ -1,5 +1,4 @@
#vcomment,
#waline
#vcomment
font-size: 1.1em
.vbtn
@@ -21,6 +20,18 @@
&:after
z-index: 22
#waline-wrap
--waline-font-size: 1.1em
--waline-theme-color: $button-bg
--waline-active-color: $button-hover-color
--waline-avatar-size: 2.75rem
.vuser
transition: all .5s
&:hover
transform: rotate(360deg)
if hexo-config('valine.bg')
#vcomment
textarea
@@ -79,15 +90,11 @@ if hexo-config('waline.bg')
display: none
// mathjax
.mathjax-overflow
mjx-container[display],
.has-jax
overflow-x: auto
overflow-y: hidden
mjx-container[jax='CHTML'][display='true']
overflow-x: auto
overflow-y: hidden
padding-bottom: .3rem
.aplayer
color: $font-black

View File

@@ -27,6 +27,14 @@ if hexo-config('darkmode.enable') || hexo-config('display_mode') == 'dark'
--blockquote-bg: lighten(#121212, 10)
--reward-pop: lighten(#121212, 10)
--toc-link-color: alpha(#FFFFFF, .6)
--hl-color: alpha(#FFFFFF, .7)
--hl-bg: lighten(#121212, 2)
--hltools-bg: lighten(#121212, 3)
--hltools-color: #90a4ae
--hlnumber-bg: lighten(#121212, 2)
--hlnumber-color: alpha(#FFFFFF, .4)
--hlscrollbar-bg: lighten(#121212, 5)
--hlexpand-bg: linear-gradient(180deg, rgba(lighten(#121212, 2), .6), rgba(lighten(#121212, 2), .9))
#web_bg:before,
#footer:before,
@@ -42,7 +50,10 @@ if hexo-config('darkmode.enable') || hexo-config('display_mode') == 'dark'
background: #2c2c2c
pre > code
background: 0
background: lighten(#121212, 2)
figure.highlight
box-shadow: none
.note
code
@@ -51,6 +62,11 @@ if hexo-config('darkmode.enable') || hexo-config('display_mode') == 'dark'
.aplayer
filter: brightness(.8)
kbd
border-color: #696969
background-color: #525252
color: #e2f1ff
//
#page-header
&.nav-fixed > #nav,
@@ -58,33 +74,6 @@ if hexo-config('darkmode.enable') || hexo-config('display_mode') == 'dark'
background: alpha(#121212, .8)
box-shadow: 0 5px 6px -5px rgba(133, 133, 133, 0)
//
#article-container
pre,
.highlight:not(.js-file-line-container)
background-color: lighten(#121212, 2) !important
color: alpha(#FFFFFF, .7) !important
figure.highlight
box-shadow: none
if hexo-config('highlight_settings') && hexo-config('highlight_settings.enable')
table::-webkit-scrollbar-thumb
background: lighten(#121212, 5)
.line:before
color: alpha(#FFFFFF, .7) !important
.hljs
background-color: lighten(#121212, 2) !important
pre[class*='language-']::-webkit-scrollbar-thumb
background: lighten(#121212, 5)
.highlight-tools
background: lighten(#121212, 3) !important
color: #90a4ae !important
#post-comment
#comment-switch
if hexo-config('comments.text')
@@ -102,27 +91,23 @@ if hexo-config('darkmode.enable') || hexo-config('display_mode') == 'dark'
.hide-button,
.btn-beautify,
.mermaid,
.hl-label,
.post-outdate-notice,
.error-img,
#article-container iframe,
img,
.gist,
.ads-wrap
filter: brightness(.8)
img
if hexo-config('lazyload.enable') && hexo-config('lazyload.blur') && !hexo-config('lazyload.placeholder')
filter: blur(0) brightness(.8)
else
filter: brightness(.8)
#aside-content .aside-list > .aside-list-item:not(:last-child)
border-bottom: 1px dashed alpha(#FFFFFF, .1)
//
// hexo-blog-encrypt
#hexo-blog-encrypt
label,
input
color: alpha(#FFFFFF, .7) !important
input
background-color: #121212
// Gitalk
#gitalk-container
filter: brightness(.8)
@@ -130,7 +115,7 @@ if hexo-config('darkmode.enable') || hexo-config('display_mode') == 'dark'
svg
fill: alpha(#FFFFFF, .9) !important
// Disqus and Disqusjs
// Disqusjs
#disqus_thread
#dsqjs
.dsqjs-tab-active,
@@ -154,4 +139,4 @@ if hexo-config('darkmode.enable') || hexo-config('display_mode') == 'dark'
background: #121212
#operare_artitalk .c2
background: #121212
background: #121212

View File

@@ -163,28 +163,25 @@ if hexo-config('readmode')
border-left: .2rem solid var(--gray)
background-color: var(--readmode-light-color)
kbd
border: 1px solid var(--gray)
background-color: transparent
box-shadow: none
color: var(--font-color)
.hide-toggle
border: 1px solid var(--gray) !important
.hide-button,
.btn-beautify
.btn-beautify,
.hl-label
border: 1px solid var(--gray) !important
background: var(--readmode-light-color) !important
color: var(--font-color) !important
.btn-beautify
border: 1px solid var(--gray) !important
.button--animated:before
background: var(--readmode-light-color) !important
.hide-inline,
.hide-block
& >.hide-button
border: 1px solid var(--gray)
& > .button--animated:before
background: var(--readmode-light-color)
.note
border: 2px solid var(--gray)
border-left-color: var(--gray) !important

86
source/css/_page/404.styl Normal file
View File

@@ -0,0 +1,86 @@
if hexo-config('error_404.enable')
.error404
#error-wrap
position: absolute
top: 50%
right: 0
left: 0
margin: 0 auto
padding: 0 1rem
max-width: 1000px
transform: translate(0, -50%)
.error-content
display: flex
flex-direction: row
justify-content: center
align-items: center
margin: 0 1rem
height: 18rem
border-radius: 8px
background: var(--card-bg)
box-shadow: var(--card-box-shadow)
transition: all .3s
&:hover
box-shadow: var(--card-hover-box-shadow)
+maxWidth768()
flex-direction: column
margin: 0
height: 25rem
.error-img
flex: 1
height: 100%
border-top-left-radius: 8px
border-bottom-left-radius: 8px
background-color: $theme-color
background-position: center
background-size: cover
+maxWidth768()
flex: 1
width: 100%
border-top-right-radius: 8px
border-bottom-left-radius: 0
.error-info
flex: 1
padding: .5rem
text-align: center
font-size: 14px
if $site-name-font
font-family: $site-name-font
+maxWidth768()
flex: 1.1
width: 100%
.error_title
margin-top: -4rem
font-size: 9em
+maxWidth768()
margin-top: -3rem
.error_subtitle
@extend .limit-more-line
margin-top: -3.5rem
word-break: break-word
font-size: 1.6em
-webkit-line-clamp: 2
a
display: inline-block
margin-top: .5rem
padding: .3rem 1.5rem
background: var(--btn-bg)
color: var(--btn-color)
i
padding-right: .3rem
& + #rightside
display: none

View File

@@ -1,14 +1,21 @@
#body-wrap
display: flex
flex-direction: column
min-height: 100vh
.layout
display: flex
flex: 1 auto
margin: 0 auto
padding: 2rem 15px
max-width: 1200px
width: 100%
+maxWidth900()
flex-direction: column
+maxWidth768()
padding: 1rem 5px !important
padding: 1rem 5px
+minWidth2000()
max-width: 1500px
@@ -46,7 +53,3 @@
& > div
width: 100% !important
// fix chrome enter animation blur
.layout
filter: blur(0)

View File

@@ -50,20 +50,24 @@
color: var(--font-color)
text-decoration: none
img
.flink-item-icon
float: left
overflow: hidden
margin: 15px 10px
width: 60px
height: 60px
border-radius: 35px
transition: all .3s
img
width: 100%
height: 100%
transition: all .3s
.img-alt
display: none
.flink-item-name
@extend .limit-one-line
display: block
padding: 16px 10px 0 0
height: 40px
font-weight: bold
@@ -71,7 +75,6 @@
.flink-item-desc
@extend .limit-one-line
display: block
padding: 16px 10px 16px 0
height: 50px
font-size: .93em

View File

@@ -1,7 +1,5 @@
#algolia-search
.search-dialog
animation: titlescale .5s
.ais-search-box
margin: 0 auto
max-width: 100%

View File

@@ -7,7 +7,9 @@
margin-left: -15rem
padding: 1rem
width: 30rem
border-radius: 8px
background: var(--search-bg)
animation: titlescale .5s
+maxWidth768()
top: 0
@@ -15,6 +17,7 @@
margin: 0
width: 100%
height: 100%
border-radius: 0
hr
margin: 1rem auto

View File

@@ -1,7 +1,5 @@
#local-search
.search-dialog
animation: titlescale .5s
.local-search-box
margin: 0 auto
max-width: 100%

View File

@@ -11,6 +11,9 @@
color: $btn-color
line-height: 2
i + span
margin-left: .3rem
&:not(.block) + .btn-beautify:not(.block)
margin: 0 .2rem 1rem

View File

@@ -0,0 +1,6 @@
#article-container
.inline-img
display: inline
margin: 0 3px
height: 1.1em
vertical-align: text-bottom

View File

@@ -0,0 +1,11 @@
.hl-label
padding: 2px 4px
border-radius: 3px
color: $btn-color
&.default
background-color: $btn-default-color
for $type in $tagsP-types
&.{$type}
background-color: lookup('$tagsP-' + $type + '-color')

View File

@@ -28,7 +28,7 @@ $title-prefix-icon = $beautifyEnable ? hexo-config('beautify.title-prefix-icon')
$title-prefix-icon-color = $beautifyEnable ? convert(hexo-config('beautify.title-prefix-icon-color')) : $light-red
// Global Variables
$font-size = hexo-config('font.global-font-size') ? convert(hexo-config('font.global-font-size')) : 14px
$code-font-size = hexo-config('font.code-font-size') ? convert(hexo-config('font.code-font-size')) : $font-size
$code-font-size = hexo-config('font.code-font-size') ? convert(hexo-config('font.code-font-size')) : var(--global-font-size)
$font-color = #1F2D3D
$rem = 20px
$text-line-height = 2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -81,123 +81,142 @@ document.addEventListener('DOMContentLoaded', function () {
* 只適用於Hexo默認的代碼渲染
*/
const addHighlightTool = function () {
const isHighlightCopy = GLOBAL_CONFIG.highlight.highlightCopy
const isHighlightLang = GLOBAL_CONFIG.highlight.highlightLang
const highLight = GLOBAL_CONFIG.highlight
if (!highLight) return
const isHighlightCopy = highLight.highlightCopy
const isHighlightLang = highLight.highlightLang
const isHighlightShrink = GLOBAL_CONFIG_SITE.isHighlightShrink
const highlightHeightLimit = highLight.highlightHeightLimit
const isShowTool = isHighlightCopy || isHighlightLang || isHighlightShrink !== undefined
const $figureHighlight = GLOBAL_CONFIG.highlight.plugin === 'highlighjs' ? document.querySelectorAll('figure.highlight') : document.querySelectorAll('pre[class*="language-"]')
const $figureHighlight = highLight.plugin === 'highlighjs' ? document.querySelectorAll('figure.highlight') : document.querySelectorAll('pre[class*="language-"]')
if (isShowTool && $figureHighlight.length) {
const isPrismjs = GLOBAL_CONFIG.highlight.plugin === 'prismjs'
if (!((isShowTool || highlightHeightLimit) && $figureHighlight.length)) return
let highlightShrinkEle = ''
let highlightCopyEle = ''
const highlightShrinkClass = isHighlightShrink === true ? 'closed' : ''
const isPrismjs = highLight.plugin === 'prismjs'
if (isHighlightShrink !== undefined) {
highlightShrinkEle = `<i class="fas fa-angle-down expand ${highlightShrinkClass}"></i>`
}
let highlightShrinkEle = ''
let highlightCopyEle = ''
const highlightShrinkClass = isHighlightShrink === true ? 'closed' : ''
if (isHighlightCopy) {
highlightCopyEle = '<div class="copy-notice"></div><i class="fas fa-paste copy-button"></i>'
}
if (isHighlightShrink !== undefined) {
highlightShrinkEle = `<i class="fas fa-angle-down expand ${highlightShrinkClass}"></i>`
}
const copy = (text, ctx) => {
if (document.queryCommandSupported && document.queryCommandSupported('copy')) {
document.execCommand('copy')
if (GLOBAL_CONFIG.Snackbar !== undefined) {
btf.snackbarShow(GLOBAL_CONFIG.copy.success)
} else {
const prevEle = ctx.previousElementSibling
prevEle.innerText = GLOBAL_CONFIG.copy.success
prevEle.style.opacity = 1
setTimeout(() => { prevEle.style.opacity = 0 }, 700)
}
if (isHighlightCopy) {
highlightCopyEle = '<div class="copy-notice"></div><i class="fas fa-paste copy-button"></i>'
}
const copy = (text, ctx) => {
if (document.queryCommandSupported && document.queryCommandSupported('copy')) {
document.execCommand('copy')
if (GLOBAL_CONFIG.Snackbar !== undefined) {
btf.snackbarShow(GLOBAL_CONFIG.copy.success)
} else {
if (GLOBAL_CONFIG.Snackbar !== undefined) {
btf.snackbarShow(GLOBAL_CONFIG.copy.noSupport)
} else {
ctx.previousElementSibling.innerText = GLOBAL_CONFIG.copy.noSupport
}
}
}
// click events
const highlightCopyFn = (ele) => {
const $buttonParent = ele.parentNode
$buttonParent.classList.add('copy-true')
const selection = window.getSelection()
const range = document.createRange()
if (isPrismjs) range.selectNodeContents($buttonParent.querySelectorAll('pre code')[0])
else range.selectNodeContents($buttonParent.querySelectorAll('table .code pre')[0])
selection.removeAllRanges()
selection.addRange(range)
const text = selection.toString()
copy(text, ele.lastChild)
selection.removeAllRanges()
$buttonParent.classList.remove('copy-true')
}
const highlightShrinkFn = (ele) => {
const $nextEle = [...ele.parentNode.children].slice(1)
ele.firstChild.classList.toggle('closed')
if (btf.isHidden($nextEle[0])) {
$nextEle.forEach(e => { e.style.display = 'block' })
} else {
$nextEle.forEach(e => { e.style.display = 'none' })
}
}
const highlightToolsFn = function (e) {
const $target = e.target.classList
if ($target.contains('expand')) highlightShrinkFn(this)
else if ($target.contains('copy-button')) highlightCopyFn(this)
}
const createEle = () => {
const newEle = document.createElement('div')
newEle.className = `highlight-tools ${highlightShrinkClass}`
newEle.addEventListener('click', highlightToolsFn)
return newEle
}
if (isHighlightLang) {
if (isPrismjs) {
$figureHighlight.forEach(function (item) {
const langName = item.getAttribute('data-language') !== undefined ? item.getAttribute('data-language') : 'Code'
const highlightLangEle = `<div class="code-lang">${langName}</div>`
btf.wrap(item, 'figure', '', 'highlight')
const newEle = createEle()
newEle.innerHTML = highlightShrinkEle + highlightLangEle + highlightCopyEle
item.parentNode.insertBefore(newEle, item)
})
} else {
$figureHighlight.forEach(function (item) {
let langName = item.getAttribute('class').split(' ')[1]
if (langName === 'plain' || langName === undefined) langName = 'Code'
const highlightLangEle = `<div class="code-lang">${langName}</div>`
const newEle = createEle()
newEle.innerHTML = highlightShrinkEle + highlightLangEle + highlightCopyEle
item.insertBefore(newEle, item.firstChild)
})
const prevEle = ctx.previousElementSibling
prevEle.innerText = GLOBAL_CONFIG.copy.success
prevEle.style.opacity = 1
setTimeout(() => { prevEle.style.opacity = 0 }, 700)
}
} else {
if (isPrismjs) {
$figureHighlight.forEach(function (item) {
btf.wrap(item, 'figure', '', 'highlight')
const newEle = createEle()
newEle.innerHTML = highlightShrinkEle + highlightCopyEle
item.parentNode.insertBefore(newEle, item)
})
if (GLOBAL_CONFIG.Snackbar !== undefined) {
btf.snackbarShow(GLOBAL_CONFIG.copy.noSupport)
} else {
$figureHighlight.forEach(function (item) {
const newEle = createEle()
newEle.innerHTML = highlightShrinkEle + highlightCopyEle
item.insertBefore(newEle, item.firstChild)
})
ctx.previousElementSibling.innerText = GLOBAL_CONFIG.copy.noSupport
}
}
}
// click events
const highlightCopyFn = (ele) => {
const $buttonParent = ele.parentNode
$buttonParent.classList.add('copy-true')
const selection = window.getSelection()
const range = document.createRange()
if (isPrismjs) range.selectNodeContents($buttonParent.querySelectorAll('pre code')[0])
else range.selectNodeContents($buttonParent.querySelectorAll('table .code pre')[0])
selection.removeAllRanges()
selection.addRange(range)
const text = selection.toString()
copy(text, ele.lastChild)
selection.removeAllRanges()
$buttonParent.classList.remove('copy-true')
}
const highlightShrinkFn = (ele) => {
const $nextEle = [...ele.parentNode.children].slice(1)
ele.firstChild.classList.toggle('closed')
if (btf.isHidden($nextEle[$nextEle.length - 1])) {
$nextEle.forEach(e => { e.style.display = 'block' })
} else {
$nextEle.forEach(e => { e.style.display = 'none' })
}
}
const highlightToolsFn = function (e) {
const $target = e.target.classList
if ($target.contains('expand')) highlightShrinkFn(this)
else if ($target.contains('copy-button')) highlightCopyFn(this)
}
const expandCode = function () {
this.classList.toggle('expand-done')
}
function createEle (lang, item, service) {
const fragment = document.createDocumentFragment()
if (isShowTool) {
const hlTools = document.createElement('div')
hlTools.className = `highlight-tools ${highlightShrinkClass}`
hlTools.innerHTML = highlightShrinkEle + lang + highlightCopyEle
hlTools.addEventListener('click', highlightToolsFn)
fragment.appendChild(hlTools)
}
if (highlightHeightLimit && item.offsetHeight > highlightHeightLimit + 30) {
const ele = document.createElement('div')
ele.className = 'code-expand-btn'
ele.innerHTML = '<i class="fas fa-angle-double-down"></i>'
ele.addEventListener('click', expandCode)
fragment.appendChild(ele)
}
if (service === 'hl') {
item.insertBefore(fragment, item.firstChild)
} else {
item.parentNode.insertBefore(fragment, item)
}
}
if (isHighlightLang) {
if (isPrismjs) {
$figureHighlight.forEach(function (item) {
const langName = item.getAttribute('data-language') ? item.getAttribute('data-language') : 'Code'
const highlightLangEle = `<div class="code-lang">${langName}</div>`
btf.wrap(item, 'figure', { class: 'highlight' })
createEle(highlightLangEle, item)
})
} else {
$figureHighlight.forEach(function (item) {
let langName = item.getAttribute('class').split(' ')[1]
if (langName === 'plain' || langName === undefined) langName = 'Code'
const highlightLangEle = `<div class="code-lang">${langName}</div>`
createEle(highlightLangEle, item, 'hl')
})
}
} else {
if (isPrismjs) {
$figureHighlight.forEach(function (item) {
btf.wrap(item, 'figure', { class: 'highlight' })
createEle('', item)
})
} else {
$figureHighlight.forEach(function (item) {
createEle('', item, 'hl')
})
}
}
}
/**
@@ -206,10 +225,11 @@ document.addEventListener('DOMContentLoaded', function () {
function addPhotoFigcaption () {
document.querySelectorAll('#article-container img').forEach(function (item) {
const parentEle = item.parentNode
if (!parentEle.parentNode.classList.contains('justified-gallery')) {
const altValue = item.alt
if (altValue && !parentEle.parentNode.classList.contains('justified-gallery')) {
const ele = document.createElement('div')
ele.className = 'img-alt is-center'
ele.textContent = item.getAttribute('alt')
ele.textContent = altValue
parentEle.insertBefore(ele, item.nextSibling)
}
})
@@ -275,7 +295,7 @@ document.addEventListener('DOMContentLoaded', function () {
}
const addMediumZoom = () => {
const zoom = mediumZoom(document.querySelectorAll('#article-container :not(a)>img'))
const zoom = mediumZoom(document.querySelectorAll('#article-container :not(a):not(.flink-item-icon) > img'))
zoom.on('open', e => {
const photoBg = document.documentElement.getAttribute('data-theme') === 'dark' ? '#121212' : '#fff'
zoom.update({
@@ -286,7 +306,7 @@ document.addEventListener('DOMContentLoaded', function () {
const jqLoadAndRun = () => {
const $fancyboxEle = GLOBAL_CONFIG.lightbox === 'fancybox'
? document.querySelectorAll('#article-container :not(a):not(.gallery-group) > img, #article-container > img')
? document.querySelectorAll('#article-container :not(a):not(.gallery-group):not(.flink-item-icon) > img, #article-container > img')
: []
const fbLengthNoZero = $fancyboxEle.length > 0
const $jgEle = document.querySelectorAll('#article-container .justified-gallery')
@@ -313,50 +333,55 @@ document.addEventListener('DOMContentLoaded', function () {
return
}
let initTop = 0
let isChatShow = true
const $header = document.getElementById('page-header')
const isChatBtnHide = typeof chatBtnHide === 'function'
const isChatBtnShow = typeof chatBtnShow === 'function'
window.addEventListener('scroll', btf.throttle(function (e) {
const currentTop = window.scrollY || document.documentElement.scrollTop
const isDown = scrollDirection(currentTop)
if (currentTop > 56) {
if (isDown) {
if ($header.classList.contains('nav-visible')) $header.classList.remove('nav-visible')
if (isChatBtnShow && isChatShow === true) {
chatBtnHide()
isChatShow = false
}
} else {
if (!$header.classList.contains('nav-visible')) $header.classList.add('nav-visible')
if (isChatBtnHide && isChatShow === false) {
chatBtnShow()
isChatShow = true
}
}
$header.classList.add('nav-fixed')
if (window.getComputedStyle($rightside).getPropertyValue('opacity') === '0') {
$rightside.style.cssText = 'opacity: 1; transform: translateX(-38px)'
}
} else {
if (currentTop === 0) {
$header.classList.remove('nav-fixed', 'nav-visible')
}
$rightside.style.cssText = "opacity: ''; transform: ''"
}
if (document.body.scrollHeight <= innerHeight) {
$rightside.style.cssText = 'opacity: 1; transform: translateX(-38px)'
}
}, 200))
// find the scroll direction
function scrollDirection (currentTop) {
const result = currentTop > initTop // true is down & false is up
initTop = currentTop
return result
}
let initTop = 0
let isChatShow = true
const $header = document.getElementById('page-header')
const isChatBtnHide = typeof chatBtnHide === 'function'
const isChatBtnShow = typeof chatBtnShow === 'function'
window.scrollCollect = () => {
return btf.throttle(function (e) {
const currentTop = window.scrollY || document.documentElement.scrollTop
const isDown = scrollDirection(currentTop)
if (currentTop > 56) {
if (isDown) {
if ($header.classList.contains('nav-visible')) $header.classList.remove('nav-visible')
if (isChatBtnShow && isChatShow === true) {
chatBtnHide()
isChatShow = false
}
} else {
if (!$header.classList.contains('nav-visible')) $header.classList.add('nav-visible')
if (isChatBtnHide && isChatShow === false) {
chatBtnShow()
isChatShow = true
}
}
$header.classList.add('nav-fixed')
if (window.getComputedStyle($rightside).getPropertyValue('opacity') === '0') {
$rightside.style.cssText = 'opacity: 1; transform: translateX(-38px)'
}
} else {
if (currentTop === 0) {
$header.classList.remove('nav-fixed', 'nav-visible')
}
$rightside.style.cssText = "opacity: ''; transform: ''"
}
if (document.body.scrollHeight <= innerHeight) {
$rightside.style.cssText = 'opacity: 1; transform: translateX(-38px)'
}
}, 200)()
}
window.addEventListener('scroll', scrollCollect)
}
/**
@@ -369,11 +394,14 @@ document.addEventListener('DOMContentLoaded', function () {
const $article = document.getElementById('article-container')
// main of scroll
window.addEventListener('scroll', btf.throttle(function (e) {
const currentTop = window.scrollY || document.documentElement.scrollTop
scrollPercent(currentTop)
findHeadPosition(currentTop)
}, 100))
window.tocScrollFn = function () {
return btf.throttle(function () {
const currentTop = window.scrollY || document.documentElement.scrollTop
scrollPercent(currentTop)
findHeadPosition(currentTop)
}, 100)()
}
window.addEventListener('scroll', tocScrollFn)
const scrollPercent = function (currentTop) {
const docHeight = $article.clientHeight
@@ -391,7 +419,11 @@ document.addEventListener('DOMContentLoaded', function () {
const updateAnchor = function (anchor) {
if (window.history.replaceState && anchor !== window.location.hash) {
if (!anchor) anchor = location.pathname
window.history.replaceState({}, '', anchor)
const title = GLOBAL_CONFIG_SITE.title
window.history.replaceState({
url: location.href,
title: title
}, title, anchor)
}
}
@@ -661,7 +693,7 @@ document.addEventListener('DOMContentLoaded', function () {
const $table = document.querySelectorAll('#article-container :not(.highlight) > table, #article-container > table')
if ($table.length) {
$table.forEach(item => {
btf.wrap(item, 'div', '', 'table-wrap')
btf.wrap(item, 'div', { class: 'table-wrap' })
})
}
}
@@ -819,7 +851,7 @@ document.addEventListener('DOMContentLoaded', function () {
sidebarFn()
GLOBAL_CONFIG_SITE.isHome && scrollDownInIndex()
GLOBAL_CONFIG.highlight && addHighlightTool()
addHighlightTool()
GLOBAL_CONFIG.isPhotoFigcaption && addPhotoFigcaption()
jqLoadAndRun()
GLOBAL_CONFIG.lightbox === 'mediumZoom' && addMediumZoom()

View File

@@ -47,9 +47,10 @@ window.addEventListener('load', () => {
.then(str => new window.DOMParser().parseFromString(str, 'text/xml'))
.then(data => {
const datas = [...data.querySelectorAll('entry')].map(function (item) {
const content = item.querySelector('content')
return {
title: item.querySelector('title').textContent,
content: item.querySelector('content').textContent,
content: content ? content.textContent : '',
url: item.querySelector('url').textContent
}
})

View File

@@ -207,18 +207,18 @@ const btf = {
*
* @param {*} selector
* @param {*} eleType the type of create element
* @param {*} id id
* @param {*} cn class name
* @param {*} options object key: value
*/
wrap: function (selector, eleType, id = '', cn = '') {
wrap: (selector, eleType, options) => {
const creatEle = document.createElement(eleType)
if (id) creatEle.id = id
if (cn) creatEle.className = cn
for (const [key, value] of Object.entries(options)) {
creatEle.setAttribute(key, value)
}
selector.parentNode.insertBefore(creatEle, selector)
creatEle.appendChild(selector)
},
unwrap: function (el) {
unwrap: el => {
const elParentNode = el.parentNode
if (elParentNode !== document.body) {
elParentNode.parentNode.insertBefore(el, elParentNode)
@@ -226,7 +226,7 @@ const btf = {
}
},
isJqueryLoad: (fn) => {
isJqueryLoad: fn => {
if (typeof jQuery === 'undefined') {
getScript(GLOBAL_CONFIG.source.jQuery).then(fn)
} else {
@@ -234,9 +234,9 @@ const btf = {
}
},
isHidden: (ele) => ele.offsetHeight === 0 && ele.offsetWidth === 0,
isHidden: ele => ele.offsetHeight === 0 && ele.offsetWidth === 0,
getEleTop: (ele) => {
getEleTop: ele => {
let actualTop = ele.offsetTop
let current = ele.offsetParent