Compare commits

...

296 Commits

236 changed files with 9607 additions and 7037 deletions

View File

@@ -1,52 +0,0 @@
<!--
IMPORTANT: Please follow the template to create a new issue.
重要:請依照該模板來提交。
If you upgrade from the old version, and an error occurs when running, please copy the new content in the config to the butterfly.yml
如果你是由舊版本升級到新版運行時出現報錯請首先把config裏新的內容複製到舊的butterfly設置去
If you are a problem when visit the website, please open your browser 'developer tools (shortcut F12)' and check the console if there is an error, include your website address in the feedback
如果你是線上訪問出現問題請檢查瀏覽器開發人員工具快捷鍵F12的console是否有報錯反饋時附上你的網站
-->
## I want to create a new issue <!-- 我想要建立一個新的issue -->
<!-- Check all with "x" especially FAQ & Documentation!! (使用 "x" 選擇) -->
<!-- 請確認是否都已經翻閱過如下的資料, 尤其是安裝文檔!! -->
- [] Yes, I have read [Hexo Docs page](https://hexo.io/docs/), especially [Templates](https://hexo.io/docs/templates.html), [Variables](https://hexo.io/docs/variables.html), [Helpers](https://hexo.io/docs/helpers.html) and [Troubleshooting](https://hexo.io/docs/troubleshooting.html).
- [] Yes, I have read [Hexo-theme-butterfly Documentation](https://jerryc.me/posts/21cfbf15/).
- [] And yes, I already searched for current [issues](https://github.com/jerryc127/hexo-theme-butterfly/issues?utf8=%E2%9C%93&q=is%3Aissue) and this did not help me.
## Butterfly Information
<!-- Butterfly的版本 -->
<!-- 檢視主題的package.json -->
**Butterfly Version:**
<!-- Windows/macOS/Linux/Android/iOS -->
**Platform:**
<!-- Chrome/Safari/FireFox/.. -->
**Browser:**
## Expected behavior <!-- (預期行為) -->
## Actual behavior <!-- (實際行為) -->
<!-- Please give me the screenshots to locate the issue -->
<!-- 請儘量提供截圖來定位問題 -->
## Steps to reproduce the behavior <!-- (重現步驟) -->
## Feature Request
<!-- If you have any ideas of theme-butterfly, please write down here and we can have a discussion. -->
<!-- 如果你有任何關於Butterfly的功能方面的想法可以在這個部分裡寫下來我們一起討論 -->
---
<!--
Love hexo-theme-butterfly? Please consider starring the repo to support it!
喜歡 hexo-theme-butterfly嗎 考慮一下給它點個star來支援它吧
-->

63
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,63 @@
name: Bug report
description: Create a report to help us improve
title: '[Bug]: '
body:
- type: markdown
attributes:
value: |
重要:請依照該模板來提交
Please follow the template to create a new issue
- type: input
id: butterfly-ver
attributes:
label: 使用的 Butterfly 版本? | What version of Butterfly are you use?
description: 檢視主題的 package.json | Check the theme's package.json
validations:
required: true
- type: dropdown
id: browser
attributes:
label: 使用的瀏覽器? || What browse are you using?
options:
- Chrome
- Edge
- Safari
- Opera
- Other
validations:
required: true
- type: dropdown
id: platform
attributes:
label: 使用的系統? || What operating system are you using?
options:
- Windows
- macOS
- Linux
- Android
- iOS
- Other
validations:
required: true
- type: textarea
id: description
attributes:
label: 問題描述 | Describe the bug
description: 請描述你的問題現象 | A clear and concise description of what the bug is.
placeholder: 請儘量提供截圖來定位問題 | If applicable, add screenshots to help explain your problem
value:
validations:
required: true
- type: input
id: website
attributes:
label: 出現問題網站 | Website
description: 請提供下可復現網站地址 | Please supply a website url which can reproduce problem.
placeholder:
validations:
required: true

22
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,22 @@
blank_issues_enabled: false
contact_links:
- name: Questions about Butterfly
url: https://github.com/jerryc127/hexo-theme-butterfly/discussions
about: 一些使用問題請到 Discussion 詢問。 Please ask questions in Discussion.
- name: Butterfly Q&A
url: https://butterfly.js.org/posts/98d20436/
about: Butterfly Q&A
- name: Telegram
url: https://t.me/bu2fly
about: 'Official Telegram Group'
- name: QQ 1群
url: https://jq.qq.com/?_wv=1027&k=KU9105XR
about: '群號 1070540070不要兩個Q群都添加'
- name: QQ 2群
url: https://jq.qq.com/?_wv=1027&k=r1nK0DQz
about: '群號 978221020不要兩個Q群都添加'

View File

@@ -0,0 +1,14 @@
name: Feature request
description: Suggest an idea for this project
title: '[Feature]: '
body:
- type: textarea
id: feature-request
attributes:
label: 想要的功能 | What feature do you want?
description: 請描述你需要的新功能 | A clear and concise description of what the feature is.
placeholder:
value:
validations:
require: true

3
.github/stale.yml vendored
View File

@@ -8,10 +8,9 @@ exemptLabels:
- security - security
- bug - bug
- enhancement - enhancement
- Solved
- documentation - documentation
# Label to use when marking an issue as stale # Label to use when marking an issue as stale
staleLabel: wontfix staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable # Comment to post when marking an issue as stale. Set to `false` to disable
markComment: > markComment: >
This issue has been automatically marked as stale because it has not had This issue has been automatically marked as stale because it has not had

19
.github/workflows/publish.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: npm publish
on:
release:
types: [created]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# Setup .npmrc file to publish to npm
- uses: actions/setup-node@v1
with:
node-version: '12.x'
registry-url: 'https://registry.npmjs.org'
- run: npm install
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

204
LICENSE
View File

@@ -1,8 +1,202 @@
MIT License
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

101
README.md
View File

@@ -1,15 +1,30 @@
<div align="right">
Language:
🇺🇸
<a title="Chinese" href="/README_CN.md">🇨🇳</a>
</div>
# hexo-theme-butterfly # hexo-theme-butterfly
<a href="https://github.com/jerryc127/hexo-theme-butterfly/releases"><img alt="Version" src="https://img.shields.io/badge/release-3.0.0-blue"/></a> ![master version](https://img.shields.io/github/package-json/v/jerryc127/hexo-theme-butterfly/master?color=%231ab1ad&label=master)
<a href="https://jerryc.me"><img alt="Author" src="https://img.shields.io/badge/author-JerryC-blur"/></a> ![master version](https://img.shields.io/github/package-json/v/jerryc127/hexo-theme-butterfly/dev?label=dev)
<a href="https://hexo.io"><img alt="Hexo" src="https://img.shields.io/badge/hexo-4.0+-0e83c"/></a> ![https://img.shields.io/npm/v/hexo-theme-butterfly?color=%09%23bf00ff](https://img.shields.io/npm/v/hexo-theme-butterfly?color=%09%23bf00ff)
<a href="https://nodejs.org/"><img alt="node.js" src="https://img.shields.io/badge/node.js-8.0+-blur"/></a> ![hexo version](https://img.shields.io/badge/hexo-5.3.0+-0e83c)
![license](https://img.shields.io/github/license/jerryc127/hexo-theme-butterfly?color=FF5531)
Demo: 👍 [Butterfly](https://demo.jerryc.me/) || 🤞 [JerryC](https://jerryc.me/) ![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/theme-butterfly-readme.png)
Demo: 👍 [Butterfly](https://butterfly.js.org/) || 🤞 [CrazyWong](https://crazywong.com/)
Docs: 📖 [Butterfly Docs](https://butterfly.js.org/posts/21cfbf15/)
Based on [hexo-theme-melody](https://github.com/Molunerfinn/hexo-theme-melody) theme. Based on [hexo-theme-melody](https://github.com/Molunerfinn/hexo-theme-melody) theme.
## Installation ## 💻 Installation
### GIT
> If you are in Mainland China, you can download in [Gitee](https://gitee.com/immyw/hexo-theme-butterfly.git)
Stable branch [recommend]: Stable branch [recommend]:
@@ -23,7 +38,17 @@ Dev branch:
git clone -b dev https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly git clone -b dev https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly
``` ```
## Configuration ### NPM
> It supports Hexo 5.0.0 or later
In Hexo site root directory
```powershell
npm i hexo-theme-butterfly
```
## ⚙ Configuration
Set theme in the hexo work folder's root config file `_config.yml`: Set theme in the hexo work folder's root config file `_config.yml`:
@@ -33,22 +58,56 @@ git clone -b dev https://github.com/jerryc127/hexo-theme-butterfly.git themes/bu
> npm install hexo-renderer-pug hexo-renderer-stylus > npm install hexo-renderer-pug hexo-renderer-stylus
## Documentation ## 🎉 Features
Find in [Butterfly Docs](https://demo.jerryc.me/posts/21cfbf15/). it supports `zh-TW` and `zh-CN` - [x] Card UI Design
- [X] Support sub-menu
- [x] Two Column designs
- [x] Responsive Web Design
- [x] Dark Mode
- [x] Pjax
- [x] Read Mode
- [x] Conversion between Traditional and Simplified Chinese
- [X] TOC catalog is available for both computers and mobile phones
- [X] Color themes (darker/pale night/light/ocean/mac/mac light), support custom colors
- [X] Code Blocks (Display code language/close or expand Code Blocks/Copy Button/word wrap)
- [X] Disable copy/Add a Copyright Notice to the Copied Text
- [X] Search (Algolia SearchZ/Local Search)
- [x] Mathjax and Katex
- [x] Built-in 404 page
- [x] WordCount
- [x] Related articles
- [x] Displays outdated notice for a post
- [x] Share (AddThis/Sharejs/Addtoany)
- [X] Comment (Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo/Giscus/Remark42)
- [x] Multiple Comment System Support
- [x] Online Chats (Chatra/Tidio/Daovoice/Gitter/Crisp)
- [x] Web analytics
- [x] Google AdSense
- [x] Webmaster Verification
- [x] Change website colour scheme
- [x] Typewriter Effect: activate_power_mode
- [x] Background effects (Canvas ribbon/canvas_ribbon_piao/canvas_nest)
- [x] Mouse click effects (Fireworks/Heart/Text)
- [x] Preloader/Loading Animation
- [x] Busuanzi visitor counter
- [x] Medium Zoom/Fancybox
- [x] Mermaid
- [x] Justified Gallery
- [x] Lazyload images
- [x] Instantpage/Pangu/Snackbar notification toast/PWA......
You can also join the Chat Group. ## ✨ Contributors
[💬 Join QQ Group [recommend]](https://jq.qq.com/?_wv=1027&k=5KI3Jqb) <a href="https://github.com/jerryc127/hexo-theme-butterfly/graphs/contributors">
<img src="https://contrib.rocks/image?repo=jerryc127/hexo-theme-butterfly" />
</a>
[💬 Join Telegram Group](https://t.me/hexo_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)
## Screenshots ![](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)
![image](https://user-images.githubusercontent.com/16351105/58887365-1272f780-8718-11e9-9329-3292c6ba20d4.png) ![](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)
![](https://user-images.githubusercontent.com/16351105/58887457-3cc4b500-8718-11e9-9417-2bdea603c92e.png)
![](https://user-images.githubusercontent.com/16351105/69338594-7d03f980-0c9e-11ea-8b64-7f165e6508e2.png)

View File

@@ -1,50 +1,113 @@
<div align="right">
語言:
中文
<a title="English" href="/README.md">英文</a>
</div>
# hexo-theme-butterfly # hexo-theme-butterfly
<a href="https://github.com/jerryc127/hexo-theme-butterfly/releases"><img alt="Version" src="https://img.shields.io/badge/release-3.0.0-blue"/></a> ![master version](https://img.shields.io/github/package-json/v/jerryc127/hexo-theme-butterfly/master?color=%231ab1ad&label=master)
<a href="https://jerryc.me"><img alt="Author" src="https://img.shields.io/badge/author-JerryC-blur"/></a> ![master version](https://img.shields.io/github/package-json/v/jerryc127/hexo-theme-butterfly/dev?label=dev)
<a href="https://hexo.io"><img alt="Hexo" src="https://img.shields.io/badge/hexo-4.0+-0e83c"/></a> ![https://img.shields.io/npm/v/hexo-theme-butterfly?color=%09%23bf00ff](https://img.shields.io/npm/v/hexo-theme-butterfly?color=%09%23bf00ff)
<a href="https://nodejs.org/"><img alt="node.js" src="https://img.shields.io/badge/node.js-8.0+-blur"/></a> ![hexo version](https://img.shields.io/badge/hexo-5.3.0+-0e83c)
![license](https://img.shields.io/github/license/jerryc127/hexo-theme-butterfly?color=FF5531)
Demo: 👍 [Butterfly](https://demo.jerryc.me/) || 🤞 [JerryC](https://jerryc.me/) ![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/theme-butterfly-readme.png)
預覽: 👍 [Butterfly](https://butterfly.js.org/) || 🤞 [CrazyWong](https://crazywong.com/)
文檔: 📖 [Butterfly Docs](https://butterfly.js.org/posts/21cfbf15/)
一款基於[hexo-theme-melody](https://github.com/Molunerfinn/hexo-theme-melody)修改的主題 一款基於[hexo-theme-melody](https://github.com/Molunerfinn/hexo-theme-melody)修改的主題
## 安裝 ## 💻 安裝
在你的博客根目錄裡安裝穩定版【推薦】 ### Git 安裝
``` > 本倉庫同時上傳到 [Gitee](https://gitee.com/immyw/hexo-theme-butterfly.git),如果你訪問 Github 緩慢,可從 Gitee 中下載。
在博客根目錄裡安裝穩定版【推薦】
```powershell
git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly
``` ```
如果想要安裝比較新的dev分支可以 如果想要安裝比較新的dev分支可以
``` ```powershell
git clone -b dev https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly git clone -b dev https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly
``` ```
## 應用主題 ### npm 安裝
> 此方法只支持Hexo 5.0.0以上版本
在博客根目錄裡
```powershell
npm i hexo-theme-butterfly
```
## ⚙ 應用主題
修改hexo配置文件`_config.yml`,把主題改為`Butterfly` 修改hexo配置文件`_config.yml`,把主題改為`Butterfly`
``` ```
theme: butterfly theme: butterfly
``` ```
>如果你沒有pug以及stylus的渲染器請下載安裝 npm install hexo-renderer-pug hexo-renderer-stylus --save or yarn add hexo-renderer-pug hexo-renderer-stylus >如果你沒有pug以及stylus的渲染器請下載安裝 npm install hexo-renderer-pug hexo-renderer-stylus --save
## 文檔 ## 🎉 特色
可查看[Butterfly Docs](https://demo.jerryc.me/posts/21cfbf15/) - [x] 卡片化設計
- [X] 支持二級目錄
- [x] 雙欄設計
- [x] 響應式主題
- [x] 夜間模式
- [x] Pjax
- [x] 文章閲讀模式
- [x] 簡體和繁體轉換
- [X] 電腦和手機都可查看TOC目錄
- [X] 內置多種代碼配色darker/pale night/light/ocean/mac/mac light可自定義代碼配色
- [X] 代碼塊顯示代碼語言/關閉或展開代碼塊/代碼複製/代碼自動換行
- [X] 可關閉文字複製/可開啟內容複製增加版權信息)
- [X] 兩種搜索Algolia搜索和本地搜索
- [x] Mathjax 和 Katex
- [x] 內置404頁面
- [x] 顯示字數統計
- [x] 顯示相關文章
- [x] 過期文章提醒
- [x] 多種分享系統AddThis/Sharejs/Addtoany
- [X] 多種評論系統Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo/Giscus/Remark42
- [x] 支持雙評論部署
- [x] 多種在線聊天Chatra/Tidio/Daovoice/Gitter/Crisp
- [x] 多種分析系統
- [x] 谷歌廣告/手動廣告位置
- [x] 各種站長驗證Google/Bing/Baidu/360/Yandex
- [x] 修改網站配色
- [x] 打字特效 activate_power_mode
- [x] 多種背景特效(靜止彩帶/動態彩帶/Canvas Nest
- [x] 多種鼠標點擊特效(煙花/文字/愛心)
- [x] 內置一種 Preloader 加載動畫
- [x] 不蒜子訪問統計
- [x] 兩種大圖模式Medium Zoom/Fancybox
- [x] Mermaid 圖表顯示
- [x] 照片牆
- [x] 圖片懶加載
- [x] Instantpage/Pangu/Snackbar彈窗/PWA......
你也可以加入群組 ## ✨ 贡献者
[ 💬 QQ群 [推薦]](https://jq.qq.com/?_wv=1027&k=5KI3Jqb) <a href="https://github.com/jerryc127/hexo-theme-butterfly/graphs/contributors">
<img src="https://contrib.rocks/image?repo=jerryc127/hexo-theme-butterfly" />
</a>
[ 💬 Telegram群](https://t.me/hexo_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)
![image](https://user-images.githubusercontent.com/16351105/58887365-1272f780-8718-11e9-9329-3292c6ba20d4.png) ![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/butterfly-readme-screenshots-3.jpg)
![image](https://user-images.githubusercontent.com/16351105/58887457-3cc4b500-8718-11e9-9417-2bdea603c92e.png) ![](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://user-images.githubusercontent.com/16351105/69338594-7d03f980-0c9e-11ea-8b64-7f165e6508e2.png) ![](https://cdn.jsdelivr.net/gh/jerryc127/CDN/img/theme-butterfly-readme-homepage-2.png)

View File

@@ -1,45 +1,45 @@
# Main menu navigation (導航目錄) # Main menu navigation (導航目錄)
# see https://butterfly.js.org/posts/4aa8abbe/#導航菜單
# -------------------------------------- # --------------------------------------
# format: name: link || icon
# sub-menu
# name || icon:
# name || link || icon
menu: menu:
Home: / || fas fa-home # Home: / || fas fa-home
Archives: /archives/ || fas fa-archive # Archives: /archives/ || fas fa-archive
Tags: /tags/ || fas fa-tags # Tags: /tags/ || fas fa-tags
Categories: /categories/ || fas fa-folder-open # Categories: /categories/ || fas fa-folder-open
List||fas fa-list: # List||fas fa-list:
- Music || /music/ || fas fa-music # Music: /music/ || fas fa-music
- Movie || /movies/ || fas fa-video # Movie: /movies/ || fas fa-video
Link: /link/ || fas fa-link # Link: /link/ || fas fa-link
About: /about/ || fas fa-heart # About: /about/ || fas fa-heart
# Code Blocks (代碼相關) # Code Blocks (代碼相關)
# -------------------------------------- # --------------------------------------
highlight_theme: light # default / darker / pale night / light / ocean / mac / false highlight_theme: light # darker / pale night / light / ocean / mac / mac light / false
highlight_copy: true # copy button highlight_copy: true # copy button
highlight_lang: true # show the code language 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_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 code_word_wrap: false
# copy settings # copy settings
# copyright: Add the copyright information after copied content (複製的內容後面加上版權信息) # copyright: Add the copyright information after copied content (複製的內容後面加上版權信息)
copy: copy:
enable: true enable: true
copyright: false copyright:
enable: false
limit_count: 50
# social settings (社交圖標設置) # social settings (社交圖標設置)
# formal: # formal:
# icon: link || the description # icon: link || the description
social: social:
fab fa-github: https://github.com/xxxxx || Github # fab fa-github: https://github.com/xxxxx || Github
fas fa-envelope: mailto:xxxxxx@gmail.com || Email # fas fa-envelope: mailto:xxxxxx@gmail.com || Email
# search (搜索) # search (搜索)
# see https://butterfly.js.org/posts/ceeb73f/#搜索系統
# -------------------------------------- # --------------------------------------
# Algolia search # Algolia search
@@ -48,17 +48,11 @@ algolia_search:
hits: hits:
per_page: 6 per_page: 6
labels:
input_placeholder: Search for Posts
hits_empty: "We didn't find any results for the search: ${query}" # if there are no result
hits_stats: '${hits} results found in ${time} ms'
# Local search # Local search
local_search: local_search:
enable: false enable: false
labels: preload: false
input_placeholder: Search for Posts CDN:
hits_empty: "We didn't find any results for the search: ${query}" # if there are no result
# Math (數學) # Math (數學)
# -------------------------------------- # --------------------------------------
@@ -86,32 +80,38 @@ favicon: /img/favicon.png
# Avatar (頭像) # Avatar (頭像)
avatar: avatar:
img: /img/avatar.png img: https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png
effect: false effect: false
# the banner image of home page # Disable all banner image
disable_top_img: false
# The banner image of home page
index_img: index_img:
# if the banner of page not setting,it will show the top_img # If the banner of page not setting, it will show the top_img
default_top_img: https://i.loli.net/2020/05/01/IuWi8QbHvzjlOPw.jpg default_top_img:
# the banner image of archive page # The banner image of archive page
archive_img: archive_img:
# the banner image of tag page # If the banner of tag page not setting, it will show the top_img
# tag page, look like https://xxxxxxxxx.com/tags/butterfly # note: tag page, not tags page (子標籤頁面的 top_img)
tag_img: tag_img:
# the banner image of category page # The banner image of tag page
# category page, look like https://xxxxxxxxx.com/categories/butterfly # format:
# - tag name: xxxxx
tag_per_img:
# If the banner of category page not setting, it will show the top_img
# note: category page, not categories page (子分類頁面的 top_img)
category_img: category_img:
# If you are using hexo-douban, you can configure it (如果你有使用 hexo-douban,可配置這個) # The banner image of category page
# douban: # format:
# meta: false # - category name: xxxxx
# movies_img: category_per_img:
# books_img:
# games_img:
cover: cover:
# display the cover or not (是否顯示文章封面) # display the cover or not (是否顯示文章封面)
@@ -122,8 +122,8 @@ cover:
# left/right/both # left/right/both
position: both position: both
# When cover is not set, the default cover is displayed (當沒有設置cover時默認的封面顯示) # When cover is not set, the default cover is displayed (當沒有設置cover時默認的封面顯示)
default_cover: default_cover:
- https://i.loli.net/2020/05/01/gkihqEjXxJ5UZ1C.jpg # - https://i.loli.net/2020/05/01/gkihqEjXxJ5UZ1C.jpg
# Replace Broken Images (替換無法顯示的圖片) # Replace Broken Images (替換無法顯示的圖片)
error_img: error_img:
@@ -139,14 +139,19 @@ error_404:
post_meta: post_meta:
page: # Home Page page: # Home Page
date_type: created # created or updated or both 主頁文章日期是創建日或者更新日或都顯示 date_type: created # created or updated or both 主頁文章日期是創建日或者更新日或都顯示
date_format: date # date/relative 顯示日期還是相對日期
categories: true # true or false 主頁是否顯示分類 categories: true # true or false 主頁是否顯示分類
tags: false # true or false 主頁是否顯示標籤 tags: false # true or false 主頁是否顯示標籤
label: true # true or false 顯示描述性文字
post: post:
date_type: both # created or updated or both 文章頁日期是創建日或者更新日或都顯示 date_type: both # created or updated or both 文章頁日期是創建日或者更新日或都顯示
date_format: date # date/relative 顯示日期還是相對日期
categories: true # true or false 文章頁是否顯示分類 categories: true # true or false 文章頁是否顯示分類
tags: true # true or false 文章頁是否顯示標籤 tags: true # true or false 文章頁是否顯示標籤
label: true # true or false 顯示描述性文字
# wordcount (字數統計) # wordcount (字數統計)
# see https://butterfly.js.org/posts/ceeb73f/#字數統計
wordcount: wordcount:
enable: false enable: false
post_wordcount: true post_wordcount: true
@@ -155,24 +160,32 @@ wordcount:
# Display the article introduction on homepage # Display the article introduction on homepage
# 1: description # 1: description
# 2: both (if the description exists, it will show description. or show the auto_excerpt) # 2: both (if the description exists, it will show description, or show the auto_excerpt)
# 3: auto_excerpt (default) # 3: auto_excerpt (default)
# false: do not show the article introduction
index_post_content: index_post_content:
method: 3 method: 3
length: 500 # if you set method to 2 or 3, the length need to config length: 500 # if you set method to 2 or 3, the length need to config
# anchor
# when you scroll in post, the URL will update according to header id.
anchor: false
# Post # Post
# -------------------------------------- # --------------------------------------
# toc (目錄) # toc (目錄)
toc: toc:
enable: true post: true
page: false
number: true number: true
auto_open: true # auto open the sidebar expand: false
style_simple: false # for post
post_copyright: post_copyright:
enable: true enable: true
decode: false decode: false
author_href:
license: CC BY-NC-SA 4.0 license: CC BY-NC-SA 4.0
license_url: https://creativecommons.org/licenses/by-nc-sa/4.0/ license_url: https://creativecommons.org/licenses/by-nc-sa/4.0/
@@ -180,12 +193,20 @@ post_copyright:
reward: reward:
enable: false enable: false
QR_code: QR_code:
- img: /img/wechat.jpg # - img: /img/wechat.jpg
link: # link:
text: wechat # text: wechat
- img: /img/alipay.jpg # - img: /img/alipay.jpg
link: # link:
text: alipay # text: alipay
# Post edit
# Easily browse and edit blog source code online.
post_edit:
enable: false
# url: https://github.com/user-name/repo-name/edit/branch-name/subdirectory-name/
# For example: https://github.com/jerryc127/butterfly.js.org/edit/main/source/
url:
# Related Articles # Related Articles
related_post: related_post:
@@ -196,9 +217,21 @@ related_post:
# figcaption (圖片描述文字) # figcaption (圖片描述文字)
photofigcaption: false photofigcaption: false
# anchor # post_pagination (分頁)
# when you scroll in post, the URL will update according to header id. # value: 1 || 2 || false
anchor: false # 1: The 'next post' will link to old post
# 2: The 'next post' will link to new post
# false: disable pagination
post_pagination: 1
# Displays outdated notice for a post (文章過期提醒)
noticeOutdate:
enable: false
style: flat # style: simple/flat
limit_day: 500 # When will it be shown
position: top # position: top/bottom
message_prev: It has been
message_next: days since the last update, the content of the article may be outdated.
# Share System (分享功能) # Share System (分享功能)
# -------------------------------------- # --------------------------------------
@@ -219,84 +252,73 @@ sharejs:
# https://www.addtoany.com/ # https://www.addtoany.com/
addtoany: addtoany:
enable: false enable: false
item: item: facebook,twitter,wechat,sina_weibo,facebook_messenger,email,copy_link
- facebook
- twitter
- wechat
- sina_weibo
- facebook_messenger
- email
- copy_link
# Comments System # Comments System
# -------------------------------------- # --------------------------------------
comments:
# Up to two comments system, the first will be shown as default
# Choose: Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo/Giscus/Remark42
use: # Valine,Disqus
text: true # Display the comment name next to the button
# lazyload: The comment system will be load when comment element enters the browser's viewport.
# If you set it to true, the comment count will be invalid
lazyload: false
count: false # Display comment count in post's top_img
card_post_count: false # Display comment count in Home Page
# disqus # disqus
# https://disqus.com/ # https://disqus.com/
disqus: disqus:
enable: false
shortname: shortname:
count: false # dispaly comment count in top_img apikey: # For newest comments widget
# Alternative Disqus - Render comments with Disqus API # Alternative Disqus - Render comments with Disqus API
# DisqusJS評論系統可以實現在網路審查地區載入 Disqus 評論列表,兼容原版 # DisqusJS 評論系統,可以實現在網路審查地區載入 Disqus 評論列表,兼容原版
# https://github.com/SukkaW/DisqusJS # https://github.com/SukkaW/DisqusJS
disqusjs: disqusjs:
enable: false
shortname: shortname:
siteName:
apikey: apikey:
api: option:
nocomment: # display when a blog post or an article has no comment attached
admin:
adminLabel:
count: false # dispaly comment count in top_img
# livere(來必力) # livere (來必力)
# https://www.livere.com/ # https://www.livere.com/
livere: livere:
enable: false
uid: uid:
# gitalk # gitalk
# https://github.com/gitalk/gitalk # https://github.com/gitalk/gitalk
gitalk: gitalk:
enable: false
client_id: client_id:
client_secret: client_secret:
repo: repo:
owner: owner:
admin: admin:
language: en # en, zh-CN, zh-TW, es-ES, fr, ru option:
perPage: 10 # Pagination size, with maximum 100.
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
count: false # dispaly comment count in top_img
# valine # valine
# https://valine.js.org # https://valine.js.org
valine: valine:
enable: false # if you want use valine,please set this value is true
appId: # leancloud application app id appId: # leancloud application app id
appKey: # leancloud application app key appKey: # leancloud application app key
pageSize: 10 # comment list page size
avatar: monsterid # gravatar style https://valine.js.org/#/avatar avatar: monsterid # gravatar style https://valine.js.org/#/avatar
lang: en # i18n: zh-CN/zh-TW/en/ja
placeholder: Please leave your footprints # valine comment input placeholder(like: Please leave your footprints )
guest_info: nick,mail,link #valine comment header info (nick/mail/link)
recordIP: false # Record reviewer IP
serverURLs: # This configuration is suitable for domestic custom domain name users, overseas version will be automatically detected (no need to manually fill in) serverURLs: # This configuration is suitable for domestic custom domain name users, overseas version will be automatically detected (no need to manually fill in)
bg: # valine background bg: # valine background
emojiCDN: # emoji CDN visitor: false
enableQQ: false # enable the Nickname box to automatically get QQ Nickname and QQ Avatar option:
requiredFields: nick,mail # required fields (nick/mail)
count: false # dispaly comment count in top_img # waline - A simple comment system with backend support fork from Valine
# https://waline.js.org/
waline:
serverURL: # Waline server address url
bg: # waline background
pageview: false
option:
# utterances # utterances
# https://utteranc.es/ # https://utteranc.es/
utterances: utterances:
enable: false
repo: repo:
# Issue Mapping: pathname/url/title/og:title # Issue Mapping: pathname/url/title/og:title
issue_term: pathname issue_term: pathname
@@ -307,13 +329,37 @@ utterances:
# Facebook Comments Plugin # Facebook Comments Plugin
# https://developers.facebook.com/docs/plugins/comments/ # https://developers.facebook.com/docs/plugins/comments/
facebook_comments: facebook_comments:
enable: false
app_id: app_id:
user_id: # optional user_id: # optional
pageSize: 10 # The number of comments to show pageSize: 10 # The number of comments to show
order_by: social # social/time/reverse_time order_by: social # social/time/reverse_time
lang: en_US # Language en_US/zh_CN/zh_TW and so on lang: en_US # Language en_US/zh_CN/zh_TW and so on
count: false
# Twikoo
# https://github.com/imaegoo/twikoo
twikoo:
envId:
region:
visitor: false
option:
# Giscus
# https://giscus.app/
giscus:
repo:
repo_id:
category_id:
theme:
light: light
dark: dark
option:
# Remark42
# https://remark42.com/docs/configuration/frontend/
remark42:
host: # Your Host URL
siteId: # Your Site ID
option:
# Chat Services # Chat Services
# -------------------------------------- # --------------------------------------
@@ -349,32 +395,43 @@ gitter:
enable: false enable: false
room: room:
# crisp
# https://crisp.chat/en/
crisp:
enable: false
website_id:
# Footer Settings # Footer Settings
# -------------------------------------- # --------------------------------------
footer:
since: 2020 owner:
enable: true
footer_custom_text: since: 2020
custom_text:
footer_copyright: true copyright: true # Copyright of theme and framework
ICP:
enable: false
url:
text:
icon: /img/icp.png
# Analysis # Analysis
# -------------------------------------- # --------------------------------------
# Baidu Analytics # Baidu Analytics
# https://tongji.baidu.com/web/welcome/login
baidu_analytics: baidu_analytics:
# Google Analytics # Google Analytics
# https://analytics.google.com/analytics/web/
google_analytics: google_analytics:
# Tencent Analytics ID # CNZZ Analytics
tencent_analytics: # https://www.umeng.com/
cnzz_analytics:
# Cloudflare Analytics
# https://www.cloudflare.com/zh-tw/web-analytics/
cloudflare_analytics:
# Microsoft Clarity
# https://clarity.microsoft.com/
microsoft_clarity:
# Advertisement # Advertisement
# -------------------------------------- # --------------------------------------
@@ -382,6 +439,7 @@ tencent_analytics:
# Google Adsense (谷歌廣告) # Google Adsense (谷歌廣告)
google_adsense: google_adsense:
enable: false enable: false
auto_ads: true
js: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js js: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
client: client:
enable_page_level_ads: true enable_page_level_ads: true
@@ -395,21 +453,11 @@ google_adsense:
# Verification (站長驗證) # Verification (站長驗證)
# -------------------------------------- # --------------------------------------
# Google Webmaster tools verification setting site_verification:
# See: https://www.google.com/webmasters/ # - name: google-site-verification
google_site_verification: # content: xxxxxx
# - name: baidu-site-verification
# Bing Webmaster tools verification setting # content: xxxxxxx
# 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:
# Beautify/Effect (美化/效果) # Beautify/Effect (美化/效果)
# -------------------------------------- # --------------------------------------
@@ -431,10 +479,13 @@ qihu_site_verification:
# toc_color: "#00c4b6" # toc_color: "#00c4b6"
# blockquote_padding_color: "#49b1f5" # blockquote_padding_color: "#49b1f5"
# blockquote_background_color: "#49b1f5" # blockquote_background_color: "#49b1f5"
# scrollbar_color: "#49b1f5"
# meta_theme_color_light: "ffffff"
# meta_theme_color_dark: "#0d0d0d"
# The top_img settings of home page # The top_img settings of home page
# default: top img - full screen, site info - middle (默認top_img全屏site_info在中間) # default: top img - full screen, site info - middle (默認top_img全屏site_info在中間)
# The positon of site info, eg: 300px/300em/300rem/10% (主頁標題距離頂部距離) # The position of site info, eg: 300px/300em/300rem/10% (主頁標題距離頂部距離)
index_site_info_top: index_site_info_top:
# The height of top_img, eg: 300px/300em/300rem (主頁top_img高度) # The height of top_img, eg: 300px/300em/300rem (主頁top_img高度)
index_top_img_height: index_top_img_height:
@@ -447,17 +498,18 @@ tag_ui: # 留空或 index
# Website Background (設置網站背景) # Website Background (設置網站背景)
# can set it to color or image (可設置圖片 或者 顔色) # can set it to color or image (可設置圖片 或者 顔色)
# The formal of color: '#49B202'
# The formal of image: url(http://xxxxxx.com/xxx.jpg) # The formal of image: url(http://xxxxxx.com/xxx.jpg)
# White color will be shown as default
background: background:
# Show the footer background image (same as top_img) # Footer Background
footer_bg: false footer_bg: false
# the position of bottom right button/default unit: px (右下角按鈕距離底部的距離/默認單位為px) # the position of bottom right button/default unit: px (右下角按鈕距離底部的距離/默認單位為px)
rightside-bottom: rightside-bottom:
# Enter transitions (開啓網頁進入效果)
enter_transitions: true
# Background effects (背景特效) # Background effects (背景特效)
# -------------------------------------- # --------------------------------------
@@ -471,8 +523,8 @@ canvas_ribbon:
click_to_change: false click_to_change: false
mobile: false mobile: false
# Dynamic ribbon (動態彩帶) # Fluttering Ribbon (動態彩帶)
canvas_ribbon_piao: canvas_fluttering_ribbon:
enable: false enable: false
mobile: false mobile: false
@@ -492,23 +544,29 @@ activate_power_mode:
enable: false enable: false
colorful: true # open particle animation (冒光特效) colorful: true # open particle animation (冒光特效)
shake: true # open shake (抖動特效) shake: true # open shake (抖動特效)
mobile: false
# Mouse click effects: fireworks (鼠標點擊效果: 煙火特效) # Mouse click effects: fireworks (鼠標點擊效果: 煙火特效)
fireworks: fireworks:
enable: false enable: false
zIndex: 9999 # -1 or 9999 zIndex: 9999 # -1 or 9999
mobile: false
# Mouse click effects: Heart symbol (鼠標點擊效果: 愛心) # Mouse click effects: Heart symbol (鼠標點擊效果: 愛心)
click_heart: false click_heart:
enable: false
mobile: false
# Mouse click effects: words (鼠標點擊效果: 文字) # Mouse click effects: words (鼠標點擊效果: 文字)
ClickShowText: ClickShowText:
enable: false enable: false
text: text:
- I # - I
- LOVE # - LOVE
- YOU # - YOU
fontSize: 15px fontSize: 15px
random: false
mobile: false
# Default display mode (網站默認的顯示模式) # Default display mode (網站默認的顯示模式)
# light (default) / dark # light (default) / dark
@@ -518,49 +576,45 @@ display_mode: light
beautify: beautify:
enable: false enable: false
field: post # site/post field: post # site/post
title-prefix-icon: '\f0c1' title-prefix-icon: # '\f0c1'
title-prefix-icon-color: '#F47466' title-prefix-icon-color: # '#F47466'
# Global font settings # Global font settings
# Don't modify the following settings unless you know how they work (非必要不要修改) # Don't modify the following settings unless you know how they work (非必要不要修改)
font: font:
global-font-size:
code-font-size:
font-family: font-family:
code-font: code-font-family:
# Font settings for the site title and site subtitle # Font settings for the site title and site subtitle
# 左上角網站名字 主頁居中網站名字 # 左上角網站名字 主頁居中網站名字
blog_title_font: blog_title_font:
font_link: https://fonts.googleapis.com/css?family=Titillium+Web&display=swap font_link:
font-family: Titillium Web, 'PingFang SC', 'Hiragino Sans GB', Microsoft YaHei', sans-serif font-family:
# The setting of divider icon (水平分隔線圖標設置) # The setting of divider icon (水平分隔線圖標設置)
hr_icon: hr_icon:
enable: true enable: true
icon: # the unicode value of Font Awesome icon icon: # the unicode value of Font Awesome icon, such as '\3423'
icon-top: icon-top:
# the subtitle on homepage (主頁subtitle) # the subtitle on homepage (主頁subtitle)
subtitle: subtitle:
enable: true enable: false
# Typewriter Effect (打字效果) # Typewriter Effect (打字效果)
effect: true effect: true
# loop (循環打字) # loop (循環打字)
loop: true loop: true
# source調用第三方服務 # source 調用第三方服務
# source: false 關閉調用 # source: false 關閉調用
# source: 1 調用搏天api的隨機語錄(簡體) https://api.btstu.cn/ # source: 1 調用一言網的一句話(簡體) https://hitokoto.cn/
# source: 2 調用一言網的一句話(簡體) https://hitokoto.cn/ # source: 2 調用一句網(簡體) http://yijuzhan.com/
# source: 3 調用一句網(簡體) http://yijuzhan.com/ # source: 3 調用今日詩詞(簡體) https://www.jinrishici.com/
# source: 4 調用今日詩詞(簡體) https://www.jinrishici.com/
# subtitle 會先顯示 source , 再顯示 sub 的內容 # subtitle 會先顯示 source , 再顯示 sub 的內容
source: false source: false
# 如果有英文逗號' , ',請使用轉義字元 &#44; # 如果關閉打字效果subtitle 只會顯示 sub 的第一行文字
# 如果有英文雙引號' " ',請使用轉義字元 &quot;
# 開頭不允許轉義字元,如需要,請把整個句子用雙引號包住
# 如果關閉打字效果subtitle只會顯示sub的第一行文字
sub: sub:
- 今日事&#44;今日畢
- Never put off till tomorrow what you can do today
# Loading Animation (加載動畫) # Loading Animation (加載動畫)
preloader: false preloader: false
@@ -570,32 +624,52 @@ preloader: false
aside: aside:
enable: true enable: true
hide: false
button: true
mobile: true # display on mobile mobile: true # display on mobile
position: right # left or right position: right # left or right
display:
archive: true
tag: true
category: true
card_author: card_author:
enable: true enable: true
description: description:
button:
enable: true
icon: fab fa-github
text: Follow Me
link: https://github.com/xxxxxx
card_announcement: card_announcement:
enable: true enable: true
content: This is my Blog content: This is my Blog
card_recent_post: card_recent_post:
enable: true enable: true
limit: 5 # if set 0 will show all limit: 5 # if set 0 will show all
sort: date # date or updated
sort_order: # Don't modify the setting unless you know how it works
card_categories: card_categories:
enable: true enable: true
limit: 8 # if set 0 will show all limit: 8 # if set 0 will show all
expand: none # none/true/false expand: none # none/true/false
sort_order: # Don't modify the setting unless you know how it works
card_tags: card_tags:
enable: true enable: true
limit: 40 # if set 0 will show all limit: 40 # if set 0 will show all
color: false color: false
sort_order: # Don't modify the setting unless you know how it works
card_archives: card_archives:
enable: true enable: true
type: monthly # yearly or monthly type: monthly # yearly or monthly
format: MMMM YYYY # eg: YYYY年MM月 format: MMMM YYYY # eg: YYYY年MM月
order: -1 # Sort of order. 1, asc for ascending; -1, desc for descending order: -1 # Sort of order. 1, asc for ascending; -1, desc for descending
limit: 8 # if set 0 will show all limit: 8 # if set 0 will show all
card_webinfo: true sort_order: # Don't modify the setting unless you know how it works
card_webinfo:
enable: true
post_count: true
last_push_date: true
sort_order: # Don't modify the setting unless you know how it works
# busuanzi count for PV / UV in site # busuanzi count for PV / UV in site
# 訪問人數 # 訪問人數
@@ -610,12 +684,20 @@ runtimeshow:
enable: false enable: false
publish_date: publish_date:
# Aside widget - Newest Comments
newest_comments:
enable: false
sort_order: # Don't modify the setting unless you know how it works
limit: 6
storage: 10 # unit: mins, save data to localStorage
avatar: true
# Bottom right button (右下角按鈕) # Bottom right button (右下角按鈕)
# -------------------------------------- # --------------------------------------
# Conversion between Traditional and Simplified Chinese (簡繁轉換) # Conversion between Traditional and Simplified Chinese (簡繁轉換)
translate: translate:
enable: true enable: false
# The text of a button # The text of a button
default: default:
# the language of website (1 - Traditional Chinese/ 2 - Simplified Chinese # the language of website (1 - Traditional Chinese/ 2 - Simplified Chinese
@@ -641,6 +723,14 @@ darkmode:
# autoChangeMode: false # autoChangeMode: false
autoChangeMode: false autoChangeMode: false
# Don't modify the following settings unless you know how they work (非必要請不要修改 )
# Choose: readmode,translate,darkmode,hideAside,toc,chat,comment
# Don't repeat 不要重複
rightside_item_order:
enable: false
hide: # readmode,translate,darkmode,hideAside
show: # toc,chat,comment
# Lightbox (圖片大圖查看模式) # Lightbox (圖片大圖查看模式)
# -------------------------------------- # --------------------------------------
# You can only choose one, or neither (只能選擇一個 或者 兩個都不選) # You can only choose one, or neither (只能選擇一個 或者 兩個都不選)
@@ -657,11 +747,13 @@ fancybox: true
# -------------------------------------- # --------------------------------------
# mermaid # mermaid
# see https://github.com/knsv/mermaid # see https://github.com/mermaid-js/mermaid
mermaid: mermaid:
enable: false enable: false
# built-in themes: default/forest/dark/neutral # built-in themes: default/forest/dark/neutral
theme: default theme:
light: default
dark: dark
# Note (Bootstrap Callout) # Note (Bootstrap Callout)
note: note:
@@ -680,6 +772,20 @@ note:
# other # other
# -------------------------------------- # --------------------------------------
# Pjax
# It may contain bugs and unstable, give feedback when you find the bugs.
# https://github.com/MoOx/pjax
pjax:
enable: false
exclude:
# - xxxx
# - xxxx
# Inject the css and script (aplayer/meting)
aplayerInject:
enable: false
per_page: true
# Snackbar (Toast Notification 彈窗) # Snackbar (Toast Notification 彈窗)
# https://github.com/polonel/SnackBar # https://github.com/polonel/SnackBar
# position 彈窗位置 # position 彈窗位置
@@ -688,14 +794,11 @@ snackbar:
enable: false enable: false
position: bottom-left position: bottom-left
bg_light: '#49b1f5' # The background color of Toast Notification in light mode bg_light: '#49b1f5' # The background color of Toast Notification in light mode
bg_dark: '#121212' # The background color of Toast Notification in dark mode bg_dark: '#1f1f1f' # The background color of Toast Notification in dark mode
# Baidu Push (百度推送)
baidu_push: false
# https://instant.page/ # https://instant.page/
# prefetch (預加載) # prefetch (預加載)
instantpage: true instantpage: false
# https://github.com/vinta/pangu.js # https://github.com/vinta/pangu.js
# Insert a space between Chinese character and English character (中英文之間添加空格) # Insert a space between Chinese character and English character (中英文之間添加空格)
@@ -704,32 +807,30 @@ pangu:
field: site # site/post field: site # site/post
# Lazyload (圖片懶加載) # Lazyload (圖片懶加載)
# https://github.com/verlok/lazyload # https://github.com/verlok/vanilla-lazyload
lazyload: lazyload:
enable: true enable: false
post: /img/loading.gif field: site # site/post
placeholder:
blur: false
# PWA # PWA
# See https://github.com/JLHwung/hexo-offline # See https://github.com/JLHwung/hexo-offline
# --------------- # ---------------
# pwa: # pwa:
# enable: false # enable: false
# manifest: /image/pwa/manifest.json # manifest: /pwa/manifest.json
# theme_color: "#fff" # apple_touch_icon: /pwa/apple-touch-icon.png
# apple_touch_icon: /image/pwa/apple-touch-icon.png # favicon_32_32: /pwa/32.png
# favicon_32_32: /image/pwa/32.png # favicon_16_16: /pwa/16.png
# favicon_16_16: /image/pwa/16.png # mask_icon: /pwa/safari-pinned-tab.svg
# mask_icon: /image/pwa/safari-pinned-tab.svg
# Disable Baidu transformation on mobile devices (禁止百度轉碼)
disable_baidu_transformation: true
# Open graph meta tags # Open graph meta tags
# https://developers.facebook.com/docs/sharing/webmasters/ # https://developers.facebook.com/docs/sharing/webmasters/
Open_Graph_meta: true Open_Graph_meta: true
# Caches the contents in a fragment, speed up the generation (開啟hexo自帶的緩存,加快生成速度) # Add the vendor prefixes to ensure compatibility
fragment_cache: true css_prefix: true
# Inject # Inject
# Insert the code to head (before '</head>' tag) and the bottom (before '</body>' tag) # Insert the code to head (before '</head>' tag) and the bottom (before '</body>' tag)
@@ -744,79 +845,70 @@ inject:
# Don't modify the following settings unless you know how they work # Don't modify the following settings unless you know how they work
# 非必要請不要修改 # 非必要請不要修改
CDN: CDN:
# main # The CDN provider of internal scripts (主題內部 js 的 cdn 配置)
main_css: /css/index.css # option: local/jsdelivr/unpkg/cdnjs/custom
jquery: https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js # Dev version can only choose. ( dev版的主題只能設置為 local )
main: /js/main.js internal_provider: local
utils: /js/utils.js
# comments # The CDN provider of third party scripts (第三方 js 的 cdn 配置)
blueimp_md5: https://cdn.jsdelivr.net/npm/blueimp-md5/js/md5.min.js # option: local/jsdelivr/unpkg/cdnjs/custom
gitalk: https://cdn.jsdelivr.net/npm/gitalk@latest/dist/gitalk.min.js # when set it to local, you need to install hexo-butterfly-extjs
gitalk_css: https://cdn.jsdelivr.net/npm/gitalk/dist/gitalk.min.css third_party_provider: jsdelivr
valine: https://cdn.jsdelivr.net/npm/valine/dist/Valine.min.js
disqusjs: https://cdn.jsdelivr.net/npm/disqusjs@1/dist/disqus.js
disqusjs_css: https://cdn.jsdelivr.net/npm/disqusjs@1/dist/disqusjs.css
utterances: https://utteranc.es/client.js
# share # Add version number to CDN, true or false
addtoany: https://static.addtoany.com/menu/page.js version: false
sharejs: https://cdn.jsdelivr.net/npm/social-share.js/dist/js/social-share.min.js
sharejs_css: https://cdn.jsdelivr.net/npm/social-share.js/dist/css/share.min.css
# search # Custom format
local_search: /js/search/local-search.js # For example: https://cdn.staticfile.org/${cdnjs_name}/${version}/${min_cdnjs_file}
algolia_js: /js/search/algolia.js custom_format:
algolia_search: https://cdn.jsdelivr.net/npm/instantsearch.js@2.10.5/dist/instantsearch.min.js
algolia_search_css: https://cdn.jsdelivr.net/npm/instantsearch.js@2.10.5/dist/instantsearch.min.css
# math option:
mathjax: https://cdn.jsdelivr.net/npm/mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML # main_css:
katex: https://cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.css # main:
katex_copytex: https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.js # utils:
katex_copytex_css: https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.css # translate:
mermaid: https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js # local_search:
# algolia_js:
# count # algolia_search_v4:
busuanzi: //busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js # instantsearch_v4:
# pjax:
# background effect # gitalk:
canvas_ribbon: /js/third-party/canvas-ribbon.js # gitalk_css:
canvas_ribbon_piao: /js/third-party/piao.js # blueimp_md5:
canvas_nest: /js/third-party/canvas-nest.js # valine:
# disqusjs:
lazyload: https://cdn.jsdelivr.net/npm/vanilla-lazyload/dist/lazyload.iife.min.js # disqusjs_css:
instantpage: https://cdn.jsdelivr.net/npm/instant.page/instantpage.min.js # twikoo:
typed: https://cdn.jsdelivr.net/npm/typed.js # waline_js:
pangu: https://cdn.jsdelivr.net/npm/pangu/dist/browser/pangu.min.js # waline_css:
# sharejs:
# photo # sharejs_css:
fancybox_css: https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.css # mathjax:
fancybox: https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.js # katex:
medium_zoom: https://cdn.jsdelivr.net/npm/medium-zoom/dist/medium-zoom.min.js # katex_copytex:
# mermaid:
# snackbar # canvas_ribbon:
snackbar_css: https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.css # canvas_fluttering_ribbon:
snackbar: https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.js # canvas_nest:
# lazyload:
# effect # instantpage:
anime: https://cdn.jsdelivr.net/npm/animejs@latest/anime.min.js # typed:
activate_power_mode: /js/third-party/activate-power-mode.js # pangu:
fireworks: /js/third-party/fireworks.js # fancybox_css_v4:
click_heart: /js/third-party/click_heart.js # fancybox_v4:
ClickShowText: /js/third-party/ClickShowText.js # medium_zoom:
# snackbar_css:
# fontawesome # snackbar:
fontawesome: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css # activate_power_mode:
# fireworks:
# Conversion between Traditional and Simplified Chinese # click_heart:
translate: /js/tw_cn.js # ClickShowText:
# fontawesomeV6:
# justifiedGallery # flickr_justified_gallery_js:
justifiedGallery_js: https://cdn.jsdelivr.net/npm/justifiedGallery/dist/js/jquery.justifiedGallery.min.js # flickr_justified_gallery_css:
justifiedGallery_css: https://cdn.jsdelivr.net/npm/justifiedGallery/dist/css/justifiedGallery.min.css # aplayer_css:
# aplayer_js:
# aplayer # meting_js:
aplayer_css: https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css # prismjs_js:
aplayer_js: https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js # prismjs_lineNumber_js:
meting_js: https://cdn.jsdelivr.net/npm/meting@1.2.0/dist/Meting.min.js # prismjs_autoloader:

View File

@@ -1,9 +1,5 @@
sidebar:
catalog: Catalog
have_read: You've read
footer: footer:
driven: Driven framework: Framework
theme: Theme theme: Theme
copy: copy:
@@ -17,6 +13,8 @@ page:
category: Category category: Category
archives: Archives archives: Archives
card_post_count: comments
sticky: Sticky sticky: Sticky
no_title: No title no_title: No title
@@ -24,7 +22,8 @@ post:
created: Created created: Created
updated: Updated updated: Updated
wordcount: Word count wordcount: Word count
min2read: 'Reading time: %s min' min2read: Reading time
min2read_unit: min
page_pv: Post View page_pv: Post View
comments: Comments comments: Comments
copyright: copyright:
@@ -33,18 +32,19 @@ post:
copyright_notice: Copyright Notice copyright_notice: Copyright Notice
copyright_content: 'All articles in this blog are licensed under <a href="%s">%s</a> unless stating additionally.' copyright_content: 'All articles in this blog are licensed under <a href="%s">%s</a> unless stating additionally.'
recommend: Related Articles recommend: Related Articles
edit: Edited on
search: Search search:
algolia_search: title: Search
input_placeholder: Search for Posts load_data: Loading the Database
hits_empty: "We didn't find any results for the search: ${query}." algolia_search:
hits_stats: '${hits} results found in ${time} ms' input_placeholder: Search for Posts
hits_empty: "We didn't find any results for the search: ${query}."
hits_stats: '${hits} results found in ${time} ms'
local_search: local_search:
label: Local search input_placeholder: Search for Posts
input_placeholder: Search for Posts hits_empty: "We didn't find any results for the search: ${query}"
hits_empty: "We didn't find any results for the search: ${query}"
powered_by: Powered by
pagination: pagination:
prev: Previous Post prev: Previous Post
@@ -61,33 +61,48 @@ aside:
card_tags: Tags card_tags: Tags
card_archives: Archives card_archives: Archives
card_recent_post: Recent Post card_recent_post: Recent Post
card_bookmark: Bookmark
card_webinfo: card_webinfo:
headline: Info headline: Info
article_name: Article article_name: Article
runtime_name: Run time runtime:
name: Run time
unit: days
last_push_date:
name: Last Push
site_wordcount: Total Count site_wordcount: Total Count
site_uv_name: UV site_uv_name: UV
site_pv_name: PV site_pv_name: PV
more_button: More more_button: More
card_newest_comments:
headline: Newest Comments
loading_text: loading...
error: Unable to get the data, please make sure the settings are correct.
zero: No Comment
image: image
link: link
code: code
card_toc: Catalog
date_suffix:
just: Just
min: minutes ago
hour: hours ago
day: days ago
month: months ago
donate: Donate donate: Donate
share: Share share: Share
bookmark:
title: Bookmark
rightside: rightside:
readmode_title: Read Mode readmode_title: Read Mode
font_plus_title: Increase Font Size translate_title: Toggle Between Traditional Chinese And Simplified Chinese
font_minus_title: Decrease Font Size night_mode_title: Toggle Between Light And Dark Mode
translate_title: Switch Between Traditional Chinese And Simplified Chinese
night_mode_title: Switch Between Light And Dark Mode
back_to_top: Back To Top back_to_top: Back To Top
toc: Table Of Contents toc: Table Of Contents
scroll_to_comment: Scroll To Comments scroll_to_comment: Scroll To Comments
setting: Setting setting: Setting
aside: Toggle between single-column and double-column
runtime_unit: days chat: Chat
copy_copyright: copy_copyright:
author: Author author: Author
@@ -96,9 +111,6 @@ copy_copyright:
info: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source. info: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
Snackbar: Snackbar:
bookmark:
message_prev: Press
message_next: to bookmark this page
chs_to_cht: Traditional Chinese Activated Manually chs_to_cht: Traditional Chinese Activated Manually
cht_to_chs: Simplified Chinese Activated Manually cht_to_chs: Simplified Chinese Activated Manually
day_to_night: Dark Mode Activated Manually day_to_night: Dark Mode Activated Manually
@@ -106,6 +118,4 @@ Snackbar:
loading: Loading... loading: Loading...
error404: error404: Page not found
error_title: Page not found
back_button: Go back home

View File

@@ -1,9 +1,5 @@
sidebar:
catalog: Catalog
have_read: You've read
footer: footer:
driven: Driven framework: Framework
theme: Theme theme: Theme
copy: copy:
@@ -17,6 +13,8 @@ page:
category: Category category: Category
archives: Archives archives: Archives
card_post_count: comments
sticky: Sticky sticky: Sticky
no_title: No title no_title: No title
@@ -24,7 +22,8 @@ post:
created: Created created: Created
updated: Updated updated: Updated
wordcount: Word count wordcount: Word count
min2read: 'Reading time: %s min' min2read: Reading time
min2read_unit: min
page_pv: Post View page_pv: Post View
comments: Comments comments: Comments
copyright: copyright:
@@ -33,18 +32,19 @@ post:
copyright_notice: Copyright Notice copyright_notice: Copyright Notice
copyright_content: 'All articles in this blog are licensed under <a href="%s">%s</a> unless stating additionally.' copyright_content: 'All articles in this blog are licensed under <a href="%s">%s</a> unless stating additionally.'
recommend: Related Articles recommend: Related Articles
edit: Edited on
search: Search search:
algolia_search: title: Search
input_placeholder: Search for Posts load_data: Loading the Database
hits_empty: "We didn't find any results for the search: ${query}." algolia_search:
hits_stats: '${hits} results found in ${time} ms' input_placeholder: Search for Posts
hits_empty: "We didn't find any results for the search: ${query}."
hits_stats: '${hits} results found in ${time} ms'
local_search: local_search:
label: Local search input_placeholder: Search for Posts
input_placeholder: Search for Posts hits_empty: "We didn't find any results for the search: ${query}"
hits_empty: "We didn't find any results for the search: ${query}"
powered_by: Powered by
pagination: pagination:
prev: Previous Post prev: Previous Post
@@ -61,33 +61,48 @@ aside:
card_tags: Tags card_tags: Tags
card_archives: Archives card_archives: Archives
card_recent_post: Recent Post card_recent_post: Recent Post
card_bookmark: Bookmark
card_webinfo: card_webinfo:
headline: Info headline: Info
article_name: Article article_name: Article
runtime_name: Run time runtime:
name: Run time
unit: days
last_push_date:
name: Last Push
site_wordcount: Total Count site_wordcount: Total Count
site_uv_name: UV site_uv_name: UV
site_pv_name: PV site_pv_name: PV
more_button: More more_button: More
card_newest_comments:
headline: Newest Comments
loading_text: loading...
error: Unable to get the data, please make sure the settings are correct.
zero: No Comment
image: image
link: link
code: code
card_toc: Catalog
date_suffix:
just: Just
min: minutes ago
hour: hours ago
day: days ago
month: months ago
donate: Donate donate: Donate
share: Share share: Share
bookmark:
title: Bookmark
rightside: rightside:
readmode_title: Read Mode readmode_title: Read Mode
font_plus_title: Increase Font Size
font_minus_title: Decrease Font Size
translate_title: Switch Between Traditional Chinese And Simplified Chinese translate_title: Switch Between Traditional Chinese And Simplified Chinese
night_mode_title: Switch Between Light And Dark Mode night_mode_title: Switch Between Light And Dark Mode
back_to_top: Back To Top back_to_top: Back To Top
toc: Table Of Contents toc: Table Of Contents
scroll_to_comment: Scroll To Comments scroll_to_comment: Scroll To Comments
setting: Setting setting: Setting
aside: Toggle between single-column and double-column
runtime_unit: days chat: Chat
copy_copyright: copy_copyright:
author: Author author: Author
@@ -96,9 +111,6 @@ copy_copyright:
info: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source. info: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
Snackbar: Snackbar:
bookmark:
message_prev: Press
message_next: to bookmark this page
chs_to_cht: Traditional Chinese Activated Manually chs_to_cht: Traditional Chinese Activated Manually
cht_to_chs: Simplified Chinese Activated Manually cht_to_chs: Simplified Chinese Activated Manually
day_to_night: Dark Mode Activated Manually day_to_night: Dark Mode Activated Manually
@@ -106,6 +118,4 @@ Snackbar:
loading: Loading... loading: Loading...
error404: error404: Page not found
error_title: Page not found
back_button: Go back home

View File

@@ -1,9 +1,5 @@
sidebar:
catalog: 目录
have_read: 你已经读了
footer: footer:
driven: 驱动 framework: 框架
theme: 主题 theme: 主题
copy: copy:
@@ -17,6 +13,8 @@ page:
category: 分类 category: 分类
archives: 归档 archives: 归档
card_post_count: 条评论
sticky: 置顶 sticky: 置顶
no_title: 无题 no_title: 无题
@@ -24,7 +22,8 @@ post:
created: 发表于 created: 发表于
updated: 更新于 updated: 更新于
wordcount: 字数总计 wordcount: 字数总计
min2read: '阅读时长: %s 分钟' min2read: 阅读时长
min2read_unit: 分钟
page_pv: 阅读量 page_pv: 阅读量
comments: 评论数 comments: 评论数
copyright: copyright:
@@ -34,19 +33,19 @@ post:
copyright_content: '本博客所有文章除特别声明外,均采用 copyright_content: '本博客所有文章除特别声明外,均采用
<a href="%s" target="_blank">%s</a> 许可协议。转载请注明来自 <a href="%s" target="_blank">%s</a>' <a href="%s" target="_blank">%s</a> 许可协议。转载请注明来自 <a href="%s" target="_blank">%s</a>'
recommend: 相关推荐 recommend: 相关推荐
edit: 编辑
search: 搜索 search:
algolia_search: title: 搜索
input_placeholder: 搜索文章 load_data: 数据库加载中
hits_empty: '找不到您查询的内容:${query}' algolia_search:
hits_stats: '找到 ${hits} 条结果,用时 ${time} 毫秒' input_placeholder: 搜索文章
hits_empty: '找不到您查询的内容:${query}'
hits_stats: '找到 ${hits} 条结果,用时 ${time} 毫秒'
local_search: local_search:
label: 本地搜索 input_placeholder: 搜索文章
input_placeholder: 搜索文章 hits_empty: '找不到您查询的内容:${query}'
hits_empty: '找不到您查询的内容:${query}'
powered: '提供支持'
by:
pagination: pagination:
prev: 上一篇 prev: 上一篇
@@ -63,33 +62,48 @@ aside:
card_tags: 标签 card_tags: 标签
card_archives: 归档 card_archives: 归档
card_recent_post: 最新文章 card_recent_post: 最新文章
card_bookmark: 加入书签
card_webinfo: card_webinfo:
headline: 网站资讯 headline: 网站资讯
article_name: 文章数目 article_name: 文章数目
runtime_name: 已运行时间 runtime:
name: 已运行时间
unit:
last_push_date:
name: 最后更新时间
site_wordcount: 本站总字数 site_wordcount: 本站总字数
site_uv_name: 本站访客数 site_uv_name: 本站访客数
site_pv_name: 本站总访问量 site_pv_name: 本站总访问量
more_button: 查看更多 more_button: 查看更多
card_newest_comments:
headline: 最新评论
loading_text: 正在加载中...
error: 无法获取评论,请确认相关配置是否正确
zero: 没有评论
image: 图片
link: 链接
code: 代码
card_toc: 目录
date_suffix:
just: 刚刚
min: 分钟前
hour: 小时前
day: 天前
month: 个月前
donate: 打赏 donate: 打赏
share: 分享 share: 分享
bookmark:
title: 添加书签
rightside: rightside:
readmode_title: 阅读模式 readmode_title: 阅读模式
font_plus_title: 放大字体
font_minus_title: 缩小字体
translate_title: 简繁转换 translate_title: 简繁转换
night_mode_title: 浅色和深色模式转换 night_mode_title: 浅色和深色模式转换
back_to_top: 回到顶部 back_to_top: 回到顶部
toc: 目录 toc: 目录
scroll_to_comment: 直达评论 scroll_to_comment: 直达评论
setting: 设置 setting: 设置
aside: 单栏和双栏切换
runtime_unit: chat:
copy_copyright: copy_copyright:
author: 作者 author: 作者
@@ -98,17 +112,11 @@ copy_copyright:
info: 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 info: 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Snackbar: Snackbar:
bookmark:
message_prev:
message_next: 键将本页加入书签
chs_to_cht: 你已切换为繁体 chs_to_cht: 你已切换为繁体
cht_to_chs: 你已切换为简体 cht_to_chs: 你已切换为简体
day_to_night: 你已切换为深色模式 day_to_night: 你已切换为深色模式
night_to_day: 你已切换为浅色模式 night_to_day: 你已切换为浅色模式
error_title: 页面没有找到
loading: 加载中... loading: 加载中...
error404: error404: 页面没有找到
error_title: 页面没有找到
back_button: 回到主页

View File

@@ -1,10 +1,6 @@
sidebar:
catalog: 目錄
have_read: 你已經讀了
footer: footer:
driven: Power by framework: 框架
theme: Theme theme: 主題
copy: copy:
success: 複製成功 success: 複製成功
@@ -17,6 +13,8 @@ page:
category: 分類 category: 分類
archives: 歸檔 archives: 歸檔
card_post_count: 條評論
sticky: 置頂 sticky: 置頂
no_title: 無題 no_title: 無題
@@ -24,7 +22,8 @@ post:
created: 發表於 created: 發表於
updated: 更新於 updated: 更新於
wordcount: 字數總計 wordcount: 字數總計
min2read: '閱讀時長: %s 分鐘' min2read: 閱讀時長
min2read_unit: 分鐘
page_pv: 閱讀量 page_pv: 閱讀量
comments: 評論數 comments: 評論數
copyright: copyright:
@@ -34,19 +33,19 @@ post:
copyright_content: '本部落格所有文章除特別聲明外,均採用 copyright_content: '本部落格所有文章除特別聲明外,均採用
<a href="%s" target="_blank">%s</a> 許可協議。轉載請註明來自 <a href="%s" target="_blank">%s</a>' <a href="%s" target="_blank">%s</a> 許可協議。轉載請註明來自 <a href="%s" target="_blank">%s</a>'
recommend: 相關推薦 recommend: 相關推薦
edit: 編輯
search: 搜尋 search:
algolia_search: title: 搜尋
input_placeholder: 搜尋文章 load_data: 資料庫載入中
hits_empty: '找不到您查詢的內容:${query}' algolia_search:
hits_stats: '找到 ${hits} 條結果,用時 ${time} 毫秒' input_placeholder: 搜尋文章
hits_empty: '找不到您查詢的內容:${query}'
hits_stats: '找到 ${hits} 條結果,用時 ${time} 毫秒'
local_search: local_search:
label: 本地搜尋 input_placeholder: 搜尋文章
input_placeholder: 搜尋文章 hits_empty: '找不到您查詢的內容:${query}'
hits_empty: '找不到您查詢的內容:${query}'
powered: '提供支援'
by:
pagination: pagination:
prev: 上一篇 prev: 上一篇
@@ -63,33 +62,48 @@ aside:
card_tags: 標籤 card_tags: 標籤
card_archives: 歸檔 card_archives: 歸檔
card_recent_post: 最新文章 card_recent_post: 最新文章
card_bookmark: 加入書籤
card_webinfo: card_webinfo:
headline: 網站資訊 headline: 網站資訊
article_name: 文章數目 article_name: 文章數目
runtime_name: 已執行時間 runtime:
name: 已執行時間
unit:
last_push_date:
name: 最後更新時間
site_wordcount: 本站總字數 site_wordcount: 本站總字數
site_uv_name: 本站訪客數 site_uv_name: 本站訪客數
site_pv_name: 本站總訪問量 site_pv_name: 本站總訪問量
more_button: 檢視更多 more_button: 檢視更多
card_newest_comments:
headline: 最新評論
loading_text: 正在載入中...
error: 無法獲取評論,請確認相關配置是否正確
zero: 沒有評論
image: 圖片
link: 連結
code: 程式碼
card_toc: 目錄
date_suffix:
just: 剛剛
min: 分鐘前
hour: 小時前
day: 天前
month: 個月前
donate: 打賞 donate: 打賞
share: 分享 share: 分享
bookmark:
title: 新增書籤
rightside: rightside:
readmode_title: 閱讀模式 readmode_title: 閱讀模式
font_plus_title: 放大字型
font_minus_title: 縮小字型
translate_title: 簡繁轉換 translate_title: 簡繁轉換
night_mode_title: 淺色和深色模式轉換 night_mode_title: 淺色和深色模式轉換
back_to_top: 回到頂部 back_to_top: 回到頂部
toc: 目錄 toc: 目錄
scroll_to_comment: 直達評論 scroll_to_comment: 直達評論
setting: 設定 setting: 設定
aside: 單欄和雙欄切換
runtime_unit: chat:
copy_copyright: copy_copyright:
author: 作者 author: 作者
@@ -98,9 +112,6 @@ copy_copyright:
info: 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 info: 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
Snackbar: Snackbar:
bookmark:
message_prev:
message_next: 鍵將本頁加入書籤
chs_to_cht: 你已切換為繁體 chs_to_cht: 你已切換為繁體
cht_to_chs: 你已切換為簡體 cht_to_chs: 你已切換為簡體
day_to_night: 你已切換為深色模式 day_to_night: 你已切換為深色模式
@@ -108,6 +119,4 @@ Snackbar:
loading: 載入中... loading: 載入中...
error404: error404: 頁面沒有找到
error_title: 頁面沒有找到
back_button: 回到主頁

View File

@@ -1,30 +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:theme.fragment_cache})
if theme.fireworks && theme.fireworks.enable
canvas.fireworks
if theme.background
- var is_photo = theme.background.startsWith('url') ? 'photo':'color'
#web_bg(data-type=is_photo)
#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=url_for(config.root))
i.fas.fa-rocket
= _p('error404.back_button')
!=partial('includes/search/index', {}, {cache:theme.fragment_cache})
include includes/additional-js.pug

View File

@@ -3,6 +3,7 @@ extends includes/layout.pug
block content block content
include ./includes/mixins/article-sort.pug include ./includes/mixins/article-sort.pug
#archive #archive
.article-sort-title= _p('page.articles') + ' - ' + site.posts.length - const archiveLength = findArchiveLength(fragment_cache)
.article-sort-title= _p('page.articles') + ' - ' + archiveLength
+articleSort(page.posts) +articleSort(page.posts)
include includes/pagination.pug include includes/pagination.pug

View File

@@ -3,12 +3,12 @@ extends includes/layout.pug
block content block content
if theme.category_ui == 'index' if theme.category_ui == 'index'
include ./includes/mixins/post-ui.pug include ./includes/mixins/post-ui.pug
#recent-posts.recent-posts.category_ui #recent-posts.recent-posts.category_ui
+postUI +postUI
include includes/pagination.pug include includes/pagination.pug
else else
include ./includes/mixins/article-sort.pug include ./includes/mixins/article-sort.pug
#category #category
.article-sort-title= _p('page.category') + ' - ' + page.category .article-sort-title= _p('page.category') + ' - ' + page.category
+articleSort(page.posts) +articleSort(page.posts)
include includes/pagination.pug include includes/pagination.pug

View File

@@ -1,23 +0,0 @@
#page
.flink#article-container
if site.data.link
each i in site.data.link
if i.class_name
h2!= i.class_name
if i.class_desc
.flink-desc!=i.class_desc
.flink-list
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-src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name )
else
img(src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name )
.flink-item-name= item.name
.flink-item-desc= item.descr
!= page.content
if page.comments !== false
include includes/comments/index.pug

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

@@ -0,0 +1,12 @@
- var top_img_404 = theme.error_404.background || theme.default_top_img
#body-wrap.error404
include ./header/index.pug
#error-wrap
.error-content
.error-img
img(src=url_for(top_img_404) alt='Page not found')
.error-info
h1.error_title= '404'
.error_subtitle= theme.error_404.subtitle || _p('error404')

View File

@@ -1,76 +1,72 @@
script(src=url_for(theme.CDN.jquery)) div
script(src=url_for(theme.CDN.utils)) script(src=url_for(theme.asset.utils))
script(src=url_for(theme.CDN.main)) script(src=url_for(theme.asset.main))
if theme.translate && theme.translate.enable if theme.translate.enable
script(src=url_for(theme.CDN.translate)) script(src=url_for(theme.asset.translate))
if theme.medium_zoom if theme.medium_zoom
script(src=url_for(theme.CDN.medium_zoom)) script(src=url_for(theme.asset.medium_zoom))
else if theme.fancybox
script(src=url_for(theme.asset.fancybox_v4))
if theme.fancybox if theme.instantpage
script(src=url_for(theme.CDN.fancybox)) script(src=url_for(theme.asset.instantpage), type='module')
include ./math/index.pug if theme.lazyload.enable
script(src=url_for(theme.asset.lazyload))
if theme.fireworks && theme.fireworks.enable if theme.snackbar.enable
script(src=url_for(theme.CDN.anime)) script(src=url_for(theme.asset.snackbar))
script(src=url_for(theme.CDN.fireworks))
if (theme.snackbar && theme.snackbar.enable) if theme.pangu.enable
script(src=url_for(theme.CDN.snackbar)) != partial("includes/third-party/pangu.pug", {}, { cache: true })
if (theme.canvas_ribbon && theme.canvas_ribbon.enable) //- search
include ./third-party/canvas-ribbon.pug if theme.algolia_search.enable
script(src=url_for(theme.asset.algolia_search_v4))
script(src=url_for(theme.asset.instantsearch_v4))
script(src=url_for(theme.asset.algolia_js))
else if theme.local_search.enable
script(src=url_for(theme.asset.local_search))
if (theme.canvas_ribbon_piao && theme.canvas_ribbon_piao.enable) if theme.preloader
include ./third-party/canvas-ribbon-piao.pug != partial("includes/loading/loading-js", {}, { cache: true })
if (theme.canvas_nest && theme.canvas_nest.enable) .js-pjax
include ./third-party/canvas-nest.pug if needLoadCountJs
!= partial("includes/third-party/card-post-count/index", {}, { cache: true })
if theme.activate_power_mode.enable if loadSubJs
script(src=url_for(theme.CDN.activate_power_mode)) include ./third-party/subtitle.pug
script.
POWERMODE.colorful = #{theme.activate_power_mode.colorful};
POWERMODE.shake = #{theme.activate_power_mode.shake};
document.body.addEventListener('input', POWERMODE);
if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv include ./third-party/math/index.pug
script(async src=url_for(theme.CDN.busuanzi))
if theme.instantpage if commentsJsLoad
script(src=url_for(theme.CDN.instantpage) type="module" defer) include ./third-party/comments/js.pug
if theme.lazyload.enable != partial("includes/third-party/prismjs", {}, { cache: true })
script(src=url_for(theme.CDN.lazyload) async)
//- 鼠標特效 if theme.aside.enable && theme.newest_comments.enable
if theme.click_heart if theme.pjax.enable
script(src=url_for(theme.CDN.click_heart)) != partial("includes/third-party/newest-comments/index", {}, { cache: true })
else if (!is_post() && page.aside !== false)
!= partial("includes/third-party/newest-comments/index", {}, { cache: true })
if theme.ClickShowText && theme.ClickShowText.enable != fragment_cache('injectBottom', function(){return injectHtml(theme.inject.bottom)})
script(src=url_for(theme.CDN.ClickShowText))
if theme.pangu && theme.pangu.enable != partial("includes/third-party/effect", {}, { cache: true })
include ./third-party/pangu.pug
//- search != partial("includes/third-party/chat/index", {}, { cache: true })
if theme.algolia_search && theme.algolia_search.enable
script(src=url_for(theme.CDN.algolia_js))
else if theme.local_search && theme.local_search.enable
script(src=url_for(theme.CDN.local_search))
//- mermaid if theme.aplayerInject && theme.aplayerInject.enable
if theme.mermaid.enable if theme.pjax.enable || theme.aplayerInject.per_page
include ./math/mermaid.pug include ./third-party/aplayer.pug
else if page.aplayer
include ./third-party/aplayer.pug
if is_home() if theme.pjax.enable
include ./head/subtitle.pug != partial("includes/third-party/pjax", {}, { cache: true })
!=fragment_cache('injectBottom', function(){return injectHtml(theme.inject.bottom)}) if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv
script(async data-pjax src='//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js')
if theme.preloader
!=partial('includes/loading/loading-js', {}, {cache:theme.fragment_cache})
!=partial('includes/chat/index', {}, {cache:theme.fragment_cache})

View File

@@ -1,28 +0,0 @@
//- https://sidecar.gitter.im/
script.
var isChatBtn = !{theme.chat_btn}
if (isChatBtn) {
((window.gitter = {}).chat = {}).options = {
room: '#{theme.gitter.room}',
activationElement: '#chat_btn'
};
} else {
((window.gitter = {}).chat = {}).options = {
room: '#{theme.gitter.room}',
};
if (!{theme.chat_hide_show}) {
var gitterBtn = document.getElementsByClassName('gitter-open-chat-button')
function chatBtnHide () {
gitterBtn[0].style.display= 'none'
}
function chatBtnShow () {
gitterBtn[0].style.display= 'block'
}
}
}
script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer)

View File

@@ -1,39 +0,0 @@
script(src=`//code.tidio.co/${theme.tidio.public_key}.js` async)
if theme.chat_btn
script.
(function() {
function onTidioChatApiReady() {
window.tidioChatApi.hide();
window.tidioChatApi.on("close", function() {
window.tidioChatApi.hide();
});
}
if (window.tidioChatApi) {
window.tidioChatApi.on("ready", onTidioChatApiReady);
} else {
document.addEventListener("tidioChat-ready", onTidioChatApiReady);
}
document.getElementById("chat_btn").addEventListener("click", function(){
window.tidioChatApi.show();
window.tidioChatApi.open();
});
})();
else if theme.chat_hide_show
script.
function chatBtnHide () {
if (window.tidioChatApi) {
window.tidioChatApi.hide();
//- document.getElementById('tidio-chat').style.display= 'none'
}
}
function chatBtnShow () {
if (window.tidioChatApi) {
window.tidioChatApi.show();
//- document.getElementById('tidio-chat').style.display= 'block'
}
}

View File

@@ -1,24 +0,0 @@
#disqus_thread
script.
var disqus_config = function () {
this.page.url = '!{ page.permalink }';
this.page.identifier = '!{ page.path }';
this.page.title = '!{ page.title }';
};
(function() {
var d = document, s = d.createElement('script');
s.src = 'https://!{theme.disqus.shortname}.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
if is_post() && theme.disqus.count
script.
function getDisqusCount() {
var d = document, s = d.createElement('script');
s.src = 'https://!{theme.disqus.shortname}.disqus.com/count.js';
s.id = 'dsq-count-scr';
(d.head || d.body).appendChild(s);
}
window.addEventListener('load', getDisqusCount, false);

View File

@@ -1,25 +0,0 @@
#disqus_thread
script(src=url_for(theme.CDN.disqusjs))
script.
var dsqjs = new DisqusJS({
shortname: '!{theme.disqusjs.shortname}',
siteName: '!{theme.disqusjs.siteName}',
identifier: '!{ page.path }',
url: '!{ page.permalink }',
title: '!{ page.title }',
api: '!{theme.disqusjs.api}',
apikey: '!{theme.disqusjs.apikey}',
nocomment: '!{theme.disqusjs.nocomment}',
admin: '!{theme.disqusjs.admin}',
adminLabel: '!{theme.disqusjs.adminLabel}'
});
if is_post() && theme.disqusjs.count
script.
function getDisqusCount() {
var d = document, s = d.createElement('script');
s.src = 'https://!{theme.disqusjs.shortname}.disqus.com/count.js';
s.id = 'dsq-count-scr';
(d.head || d.body).appendChild(s);
}
window.addEventListener('load', getDisqusCount, false);

View File

@@ -1,12 +0,0 @@
#fb-root
script(async defer crossorigin="anonymous" src=`https://connect.facebook.net/${theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v6.0`)
.fb-comments(data-colorscheme = theme.display_mode === 'dark' ? 'dark' : 'light'
data-href=urlNoIndex()
data-numposts= theme.facebook_comments.pageSize || 10
data-order-by= theme.facebook_comments.order_by || 'social'
data-width="100%")
if theme.darkmode.enable
script.
var themeNow = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'
document.getElementsByClassName('fb-comments')[0].setAttribute('data-colorscheme',themeNow)

View File

@@ -1,27 +0,0 @@
#gitalk-container
script.
var gitalk = new Gitalk({
clientID: '!{theme.gitalk.client_id}',
clientSecret: '!{theme.gitalk.client_secret}',
repo: '!{theme.gitalk.repo}',
owner: '!{theme.gitalk.owner}',
admin: ['!{theme.gitalk.admin}'],
id: md5(decodeURI(location.pathname)),
language: '!{theme.gitalk.language}',
perPage: !{theme.gitalk.perPage},
distractionFreeMode: !{theme.gitalk.distractionFreeMode},
pagerDirection: '!{theme.gitalk.pagerDirection}',
createIssueManually: !{theme.gitalk.createIssueManually},
updateCountCallback: commentCount
})
gitalk.render('gitalk-container')
function commentCount(n){
try {
document.getElementsByClassName('gitalk-comment-count')[0].innerHTML= n
} catch (e) {
return false
}
}

View File

@@ -1,29 +0,0 @@
- var d = theme.disqus && theme.disqus.enable
- var dj = theme.disqusjs && theme.disqusjs.enable
- var l = theme.livere && theme.livere.enable
- var gt = theme.gitalk && theme.gitalk.enable
- var v = theme.valine && theme.valine.enable
- var u = theme.utterances && theme.utterances.enable
- var fb = theme.facebook_comments && theme.facebook_comments.enable
- var isComment = d || dj || l || gt || v || u || fb
if isComment
hr
#post-comment
.comment_headling
i.fas.fa-comments.fa-fw
span= ' ' + _p('comment')
if d
include ./disqus.pug
else if dj
include ./disqusjs.pug
else if l
include ./livere.pug
else if gt
include ./gitalk.pug
else if v
include ./valine.pug
else if u
include ./utterances.pug
else if fb
include ./facebook_comments.pug

View File

@@ -1,10 +0,0 @@
#lv-container(data-id="city" data-uid=theme.livere.uid)
script.
(function(d, s) {
var j, e = d.getElementsByTagName(s)[0];
if (typeof LivereTower === 'function') { return; }
j = d.createElement(s);
j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
j.async = true;
e.parentNode.insertBefore(j, e);
})(document, 'script');

View File

@@ -1,21 +0,0 @@
script#utterances_comment(src=theme.CDN.utterances
repo=theme.utterances.repo
issue-term=theme.utterances.issue_term
theme= theme.display_mode === 'dark' ? theme.utterances.dark_theme : theme.utterances.light_theme
crossorigin="anonymous"
async)
if theme.darkmode.enable
script.
var themeNow = document.documentElement.getAttribute('data-theme') === 'dark' ? '#{theme.utterances.dark_theme}' : '#{theme.utterances.light_theme}'
document.getElementById('utterances_comment').setAttribute('theme',themeNow)
function utterancesTheme () {
var theme = document.documentElement.getAttribute('data-theme') === 'dark' ? '#{theme.utterances.dark_theme}' : '#{theme.utterances.light_theme}'
const message = {
type: 'set-theme',
theme: theme
};
const iframe = document.querySelector('.utterances-frame');
iframe.contentWindow.postMessage(message, 'https://utteranc.es');
}

View File

@@ -1,35 +0,0 @@
- let emojiMaps = '""'
if site.data.valine
- emojiMaps = JSON.stringify(site.data.valine)
#vcomment.vcomment
script(src=url_for(theme.CDN.valine))
script.
var requestSetting = function (from,set) {
var from = from
var setting = set.split(',').filter(function(item){
return from.indexOf(item) > -1
});
setting = setting.length == 0 ? from :setting;
return setting
}
var guestInfo = requestSetting(['nick','mail','link'],'#{ theme.valine.guest_info }')
var requiredFields = requestSetting(['nick','mail'],'#{ theme.valine.requiredFields }')
window.valine = new Valine({
el:'#vcomment',
appId: '#{theme.valine.appId}',
appKey: '#{theme.valine.appKey}',
placeholder: '#{theme.valine.placeholder}',
avatar: '#{theme.valine.avatar}',
meta: guestInfo,
pageSize: '#{theme.valine.pageSize}',
lang: '#{theme.valine.lang}',
recordIP: #{theme.valine.recordIP},
serverURLs: '#{theme.valine.serverURLs}',
emojiCDN: '#{theme.valine.emojiCDN}',
emojiMaps: !{emojiMaps},
enableQQ: #{theme.valine.enableQQ},
requiredFields: requiredFields
});

View File

@@ -1,24 +1,17 @@
#footer-wrap #footer-wrap
- var now = new Date() if theme.footer.owner.enable
- var nowYear = now.getFullYear() - var now = new Date()
if theme.since && theme.since != nowYear - var nowYear = now.getFullYear()
.copyright!= `&copy;${theme.since} - ${nowYear} By ${config.author}` if theme.footer.owner.since && theme.footer.owner.since != nowYear
else .copyright!= `&copy;${theme.footer.owner.since} - ${nowYear} By ${config.author}`
.copyright!= `&copy;${nowYear} By ${config.author}` else
if theme.footer_copyright .copyright!= `&copy;${nowYear} By ${config.author}`
if theme.footer.copyright
.framework-info .framework-info
span= _p('footer.driven') + ' ' span= _p('footer.framework') + ' '
a(href='https://hexo.io') a(href='https://hexo.io')= 'Hexo'
span Hexo
span.footer-separator | span.footer-separator |
span= _p('footer.theme') + ' ' span= _p('footer.theme') + ' '
a(href='https://github.com/jerryc127/hexo-theme-butterfly') a(href='https://github.com/jerryc127/hexo-theme-butterfly')= 'Butterfly'
span Butterfly if theme.footer.custom_text
if theme.footer_custom_text .footer_custom_text!=`${theme.footer.custom_text}`
.footer_custom_text!=`${theme.footer_custom_text}`
if theme.ICP.enable
.icp
a(href=theme.ICP.url)
if theme.ICP.icon
img.icp-icon(src=url_for(theme.ICP.icon))
span=theme.ICP.text

View File

@@ -1,100 +1,76 @@
- var pageTitle - var pageTitle
- if (is_archive()) pageTitle = _p('page.archives') - is_archive() ? page.title = findArchivesTitle(page, theme.menu, date) : ''
- else if (is_tag()) pageTitle = _p('page.tag') + ': ' + page.tag - if (is_tag()) pageTitle = _p('page.tag') + ': ' + page.tag
- else if (is_category()) pageTitle = _p('page.category') + ': ' + page.category - else if (is_category()) pageTitle = _p('page.category') + ': ' + page.category
- else if (is_month()) pageTitle += ': ' + page.month + '/' + page.year - else if (is_current('/404.html', [strict])) pageTitle = _p('error404')
- else if (is_year()) pageTitle += ': ' + page.year
- else if (is_current('/404.html', [strict])) pageTitle = _p('error404.error_title')
- else pageTitle = page.title || config.title || '' - else pageTitle = page.title || config.title || ''
- var isSubtitle = config.subtitle ? ' - ' + config.subtitle : '' - var isSubtitle = config.subtitle ? ' - ' + config.subtitle : ''
- var tabTitle = is_home() || !pageTitle ? config.title + isSubtitle : pageTitle + ' | ' + config.title - var tabTitle = is_home() || !pageTitle ? config.title + isSubtitle : pageTitle + ' | ' + config.title
- var pageDescription = page_description()
- var pageKeywords - var pageKeywords
- if (page.keywords) pageKeywords = Array.isArray(page.keywords) ? (page.keywords).join(',') : ([]).join(',') || page.keywords - if (page.keywords) pageKeywords = Array.isArray(page.keywords) ? (page.keywords).join(',') : ([]).join(',') || page.keywords
- else if (page.tags && page.tags.length) pageKeywords = page.tags.data.map(function(tag) {return tag.name;}).join(',') - else if (page.tags && page.tags.length) pageKeywords = page.tags.data.map(function(tag) {return tag.name;}).join(',')
- else pageKeywords = Array.isArray(config.keywords) ? (config.keywords).join(','): ([]).join(',') || config.keywords - else pageKeywords = Array.isArray(config.keywords) ? (config.keywords).join(','): ([]).join(',') || config.keywords
- var pageAuthor = config.email ? config.author + ',' + config.email : config.author - var pageAuthor = config.email ? config.author + ',' + config.email : config.author
- var pageCopyright = config.copyright || config.author - var pageCopyright = config.copyright || config.author
- var themeColorLight = theme.theme_color && theme.theme_color.enable && theme.theme_color.meta_theme_color_light || '#ffffff'
- var themeColorDark = theme.theme_color && theme.theme_color.enable && theme.theme_color.meta_theme_color_dark || '#0d0d0d'
- var themeColor = theme.display_mode === 'dark' ? themeColorDark : themeColorLight
meta(charset='UTF-8') meta(charset='UTF-8')
meta(http-equiv="X-UA-Compatible" content="IE=edge") meta(http-equiv="X-UA-Compatible" content="IE=edge")
meta(name="viewport" content="width=device-width,initial-scale=1") meta(name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no")
title= tabTitle title= tabTitle
meta(name="description" content!=pageDescription)
if pageKeywords if pageKeywords
meta(name="keywords" content=pageKeywords) meta(name="keywords" content=pageKeywords)
meta(name="author" content=pageAuthor) meta(name="author" content=pageAuthor)
meta(name="copyright" content=pageCopyright) meta(name="copyright" content=pageCopyright)
meta(name ="format-detection" content="telephone=no") meta(name ="format-detection" content="telephone=no")
!=favicon_tag(theme.favicon || config.favicon) meta(name="theme-color" content=themeColor)
link(rel="canonical" href=urlNoIndex())
if theme.disable_baidu_transformation
meta(http-equiv="Cache-Control" content="no-transform")
meta(http-equiv="Cache-Control" content="no-siteapp")
if theme.douban
if theme.douban.meta && (is_current('/movies/', [strict]) || is_current('/books/', [strict]) || is_current('/games/', [strict]))
meta(name="referrer" content="no-referrer")
//- 預解析
!=partial('includes/head/preconnect', {}, {cache:theme.fragment_cache})
//- 網站驗證
!=partial('includes/head/site_verification', {}, {cache:theme.fragment_cache})
//- Open_Graph //- Open_Graph
include ./head/Open_Graph.pug include ./head/Open_Graph.pug
!=favicon_tag(theme.favicon || config.favicon)
link(rel="canonical" href=urlNoIndex())
//- 預解析
!=partial('includes/head/preconnect', {}, {cache: true})
//- 網站驗證
!=partial('includes/head/site_verification', {}, {cache: true})
//- PWA //- PWA
if (theme.pwa && theme.pwa.enable) if (theme.pwa && theme.pwa.enable)
!=partial('includes/head/pwa', {}, {cache:theme.fragment_cache}) !=partial('includes/head/pwa', {}, {cache: true})
if theme.darkmode.enable
!=partial('includes/head/darkmode', {}, {cache:theme.fragment_cache})
//- main css //- main css
link(rel='stylesheet', href=url_for(theme.CDN.main_css)) link(rel='stylesheet', href=url_for(theme.asset.main_css))
link(rel='stylesheet', href=url_for(theme.CDN.fontawesome)) link(rel='stylesheet', href=url_for(theme.asset.fontawesomeV6) media="print" onload="this.media='all'")
if theme.fancybox
link(rel='stylesheet', href=url_for(theme.CDN.fancybox_css))
if (theme.snackbar && theme.snackbar.enable) if (theme.snackbar && theme.snackbar.enable)
link(rel='stylesheet', href=url_for(theme.CDN.snackbar_css)) link(rel='stylesheet', href=url_for(theme.asset.snackbar_css) media="print" onload="this.media='all'")
if is_post() if theme.fancybox
if(page.prev) link(rel='stylesheet' href=url_for(theme.asset.fancybox_css_v4) media="print" onload="this.media='all'")
link(rel="prev" title=page.prev.title href=url_for(page.prev.permalink) )
if(page.next)
link(rel="next" title=page.next.title href=url_for(page.next.permalink) )
if theme.algolia_search.enable
link(rel="stylesheet" type="text/css" href=url_for(theme.CDN.algolia_search_css))
script(src=url_for(theme.CDN.algolia_search) defer)
//- comment css
include ./head/comment.pug
//- google_adsense //- google_adsense
!=partial('includes/head/google_adsense', {}, {cache:theme.fragment_cache}) !=partial('includes/head/google_adsense', {}, {cache: true})
//- analytics //- analytics
!=partial('includes/head/analytics', {}, {cache:theme.fragment_cache}) !=partial('includes/head/analytics', {}, {cache: true})
//- font //- font
if theme.blog_title_font.font_link if theme.blog_title_font && theme.blog_title_font.font_link
link(rel='stylesheet' href=url_for(theme.blog_title_font.font_link)) link(rel='stylesheet' href=url_for(theme.blog_title_font.font_link) media="print" onload="this.media='all'")
//- global config //- global config
!=partial('includes/head/config', {}, {cache:theme.fragment_cache}) !=partial('includes/head/config', {}, {cache: true})
include ./head/config_site.pug include ./head/config_site.pug
include ./head/noscript.pug include ./head/noscript.pug
!=fragment_cache('injectHead', function(){return injectHtml(theme.inject.head)}) !=fragment_cache('injectHeadJs', function(){return inject_head_js()})
if page.aplayer !=fragment_cache('injectHead', function(){return injectHtml(theme.inject.head)})
include ./head/aplayer.pug

View File

@@ -1,12 +1,11 @@
- var contentType = is_post() ? 'article' : 'website'
if theme.Open_Graph_meta if theme.Open_Graph_meta
meta(property="og:type" content=contentType) - let contentType = is_post() ? 'article' : 'website'
meta(property="og:title" content=pageTitle) - let metaImage = (page.cover || theme.avatar.img) ? full_url_for(page.cover || theme.avatar.img) : ''
meta(property="og:url" content=urlNoIndex()) - let fb_appId = theme.facebook_comments.app_id || ''
meta(property="og:site_name" content=config.title) - let fb_admins = theme.facebook_comments.user_id || ''
meta(property="og:description" content!=pageDescription)
meta(property="og:image" content=full_url_for(page.cover || theme.avatar.img)) != open_graph({type: contentType, image: metaImage, fb_admins: fb_admins, fb_app_id: fb_appId})
meta(property="article:published_time" content=date_xml(page.date))
meta(property="article:modified_time" content=date_xml(page.updated)) else
meta(name="twitter:card" content="summary") meta(name="description" content=page_description())

View File

@@ -9,14 +9,23 @@ if theme.baidu_analytics
})(); })();
if theme.google_analytics if theme.google_analytics
script(async src=`https://www.googletagmanager.com/gtag/js?id=${theme.google_analytics}`)
script. script.
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ window.dataLayer = window.dataLayer || [];
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), function gtag(){dataLayer.push(arguments);}
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) gtag('js', new Date());
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); gtag('config', '!{theme.google_analytics}');
ga('create', '!{theme.google_analytics}', 'auto'); if theme.cnzz_analytics
ga('send', 'pageview'); script(async data-pjax src=`https://s4.cnzz.com/z_stat.php?id=${theme.cnzz_analytics}&web_id=${theme.cnzz_analytics}`)
if theme.tencent_analytics if theme.cloudflare_analytics
script(src=`https://tajs.qq.com/stats?sId=${theme.tencent_analytics}` charset="UTF-8") script(defer data-pjax src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon=`{"token": "${theme.cloudflare_analytics}"}`)
if theme.microsoft_clarity
script.
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
})(window, document, "clarity", "script", "!{theme.microsoft_clarity}");

View File

@@ -1,3 +0,0 @@
link(rel='stylesheet' href=url_for(theme.CDN.aplayer_css))
script(src=url_for(theme.CDN.aplayer_js))
script(src=url_for(theme.CDN.meting_js))

View File

@@ -1,14 +0,0 @@
if (theme.facebook_comments.enable && page.comments !== false && !is_tag() && !is_category() && !is_archive() && !is_home())
if theme.facebook_comments.app_id
meta(property="fb:app_id" content=theme.facebook_comments.app_id )
if theme.facebook_comments.user_id
meta(property="fb:admins" content=theme.facebook_comments.user_id)
if (theme.disqusjs && theme.disqusjs.enable && page.comments !== false && !is_tag() && !is_category() && !is_archive() && !is_home())
link(rel="stylesheet" type="text/css" href=url_for(theme.CDN.disqusjs_css))
if (theme.gitalk && theme.gitalk.enable && page.comments !== false && !is_tag() && !is_category() && !is_archive() && !is_home())
link(rel="stylesheet" type="text/css" href=url_for(theme.CDN.gitalk_css))
script(src=url_for(theme.CDN.gitalk))
script(src=url_for(theme.CDN.blueimp_md5))

View File

@@ -1,6 +1,6 @@
- -
var algolia = 'undefined'; let algolia = 'undefined';
var env = process.env; let env = process.env;
if (theme.algolia_search.enable) { if (theme.algolia_search.enable) {
algolia = JSON.stringify({ algolia = JSON.stringify({
appId: env.ALGOLIA_APP_ID || config.algolia.appId || config.algolia.applicationID, appId: env.ALGOLIA_APP_ID || config.algolia.appId || config.algolia.applicationID,
@@ -9,24 +9,26 @@
hits: theme.algolia_search.hits, hits: theme.algolia_search.hits,
// search languages // search languages
languages: { languages: {
input_placeholder: _p("algolia_search.input_placeholder"), input_placeholder: _p("search.algolia_search.input_placeholder"),
hits_empty: _p("algolia_search.hits_empty"), hits_empty: _p("search.algolia_search.hits_empty"),
hits_stats: _p("algolia_search.hits_stats") hits_stats: _p("search.algolia_search.hits_stats"),
}
})
}
var localSearch = 'undefined';
if (theme.local_search && theme.local_search.enable) {
localSearch = JSON.stringify({
path: config.search.path,
languages: {
// search languages
hits_empty: _p("local_search.hits_empty")
} }
}) })
} }
var translate = 'undefined';
let localSearch = 'undefined';
if (theme.local_search && theme.local_search.enable) {
localSearch = JSON.stringify({
path: theme.local_search.CDN ? theme.local_search.CDN : config.root + config.search.path,
preload: theme.local_search.preload,
languages: {
// search languages
hits_empty: _p("search.local_search.hits_empty"),
}
})
}
let translate = 'undefined';
if (theme.translate && theme.translate.enable){ if (theme.translate && theme.translate.enable){
translate = JSON.stringify({ translate = JSON.stringify({
defaultEncoding: theme.translate.defaultEncoding, defaultEncoding: theme.translate.defaultEncoding,
@@ -36,75 +38,87 @@
}) })
} }
var copyright = 'undefined' ; let copyright = 'undefined';
if (theme.copy.enable && theme.copy.copyright){ if (theme.copy.enable && theme.copy.copyright.enable){
copyright = JSON.stringify({ copyright = JSON.stringify({
limitCount: theme.copy.copyright.limit_count,
languages: { languages: {
author: _p("copy_copyright.author") + ': ' + config.author, author: _p("copy_copyright.author") + ': ' + config.author,
link: _p("copy_copyright.link") + ': ', link: _p("copy_copyright.link") + ': ',
source: _p("copy_copyright.source") + ': ' + config.title, source: _p("copy_copyright.source") + ': ' + config.title,
info: _p("copy_copyright.info") info: _p("copy_copyright.info")
} }
}) })
} }
var ClickShowText = 'undefined'; let Snackbar = 'undefined';
if (theme.ClickShowText && theme.ClickShowText.enable) { if (theme.snackbar && theme.snackbar.enable) {
ClickShowText = JSON.stringify({ Snackbar = JSON.stringify({
text: theme.ClickShowText.text.join(","), chs_to_cht: _p("Snackbar.chs_to_cht"),
fontSize: theme.ClickShowText.fontSize cht_to_chs: _p("Snackbar.cht_to_chs"),
day_to_night: _p("Snackbar.day_to_night"),
night_to_day: _p("Snackbar.night_to_day"),
bgLight: theme.snackbar.bg_light,
bgDark: theme.snackbar.bg_dark,
position: theme.snackbar.position,
}) })
} }
let noticeOutdate = 'undefined';
var Snackbar = 'undefined'; if (theme.noticeOutdate && theme.noticeOutdate.enable) {
if (theme.snackbar && theme.snackbar.enable) { noticeOutdate = JSON.stringify({
Snackbar = JSON.stringify({ limitDay: theme.noticeOutdate.limit_day,
bookmark: { position: theme.noticeOutdate.position,
message_prev: _p("Snackbar.bookmark.message_prev"), messagePrev: theme.noticeOutdate.message_prev,
message_next: _p("Snackbar.bookmark.message_next") messageNext: theme.noticeOutdate.message_next,
}, })
chs_to_cht: _p("Snackbar.chs_to_cht"), }
cht_to_chs: _p("Snackbar.cht_to_chs"),
day_to_night: _p("Snackbar.day_to_night"), let highlight = 'undefined';
night_to_day: _p("Snackbar.night_to_day"), if ((config.highlight && config.highlight.enable) || (config.prismjs && config.prismjs.enable)) {
bgLight: theme.snackbar.bg_light, highlight = JSON.stringify({
bgDark: theme.snackbar.bg_dark, plugin: config.highlight.enable ? 'highlighjs' : 'prismjs',
position: theme.snackbar.position, highlightCopy: theme.highlight_copy,
highlightLang: theme.highlight_lang,
highlightHeightLimit: theme.highlight_height_limit
}) })
} }
script. script.
var GLOBAL_CONFIG = { const GLOBAL_CONFIG = {
root: '!{config.root}', root: '!{config.root}',
algolia: !{algolia}, algolia: !{algolia},
localSearch: !{localSearch}, localSearch: !{localSearch},
translate: !{translate}, translate: !{translate},
noticeOutdate: !{noticeOutdate},
highlight: !{highlight},
copy: { copy: {
success: '!{_p("copy.success")}', success: '!{_p("copy.success")}',
error: '!{_p("copy.error")}', error: '!{_p("copy.error")}',
noSupport: '!{_p("copy.noSupport")}' noSupport: '!{_p("copy.noSupport")}'
}, },
bookmark: { relativeDate: {
message_prev: '!{_p("Snackbar.bookmark.message_prev")}', homepage: !{theme.post_meta.page.date_format === 'relative'},
message_next: '!{_p("Snackbar.bookmark.message_next")}' post: !{theme.post_meta.post.date_format === 'relative'}
},
runtime: '!{theme.runtimeshow.enable ? _p("aside.card_webinfo.runtime.unit") : ""}',
date_suffix: {
just: '!{_p("date_suffix.just")}',
min: '!{_p("date_suffix.min")}',
hour: '!{_p("date_suffix.hour")}',
day: '!{_p("date_suffix.day")}',
month: '!{_p("date_suffix.month")}'
}, },
runtime_unit: '!{_p("runtime_unit")}',
runtime: !{theme.runtimeshow.enable},
copyright: !{copyright}, copyright: !{copyright},
ClickShowText: !{ClickShowText}, lightbox: '!{ theme.medium_zoom ? "mediumZoom" : (theme.fancybox ? "fancybox" : "null" )}',
medium_zoom: !{theme.medium_zoom},
fancybox: !{theme.fancybox},
Snackbar: !{Snackbar}, Snackbar: !{Snackbar},
justifiedGallery: { source: {
js: '!{theme.CDN.justifiedGallery_js}', justifiedGallery: {
css: '!{theme.CDN.justifiedGallery_css}' js: '!{url_for(theme.asset.flickr_justified_gallery_js)}',
css: '!{url_for(theme.asset.flickr_justified_gallery_css)}'
}
}, },
baiduPush: !{theme.baidu_push},
highlightCopy: !{theme.highlight_copy},
highlightLang: !{theme.highlight_lang},
isPhotoFigcaption: !{theme.photofigcaption}, isPhotoFigcaption: !{theme.photofigcaption},
islazyload: !{theme.lazyload.enable}, islazyload: !{theme.lazyload.enable},
isanchor: !{theme.anchor} isAnchor: !{theme.anchor}
} }

View File

@@ -1,17 +1,30 @@
- -
const titleVal = pageTitle.replace(/'/ig,"\\'")
let isHighlightShrink let isHighlightShrink
if (theme.highlight_shrink == 'none') isHighlightShrink = 'undefined' if (theme.highlight_shrink == 'none') isHighlightShrink = 'undefined'
else if (page.highlight_shrink !== undefined) isHighlightShrink = page.highlight_shrink else if (page.highlight_shrink === true || page.highlight_shrink === false) isHighlightShrink = page.highlight_shrink
else isHighlightShrink = theme.highlight_shrink else isHighlightShrink = theme.highlight_shrink
const pageToc = page.toc !== undefined ? page.toc : theme.toc.enable var showToc = false
const showToc = is_post() && pageToc && (toc(page.content) !== '' || page.encrypt == true ) if (theme.aside.enable && page.aside !== false) {
let tocEnable = false
if (is_post()) {
if (theme.toc.post) tocEnable = true
} else if (is_page()) {
if (theme.toc.page) tocEnable = true
}
const pageToc = page.toc === true || page.toc === false ? page.toc : tocEnable
showToc = pageToc && (toc(page.content) !== '' || page.encrypt == true )
}
- -
script. script#config-diff.
var GLOBAL_CONFIG_SITE = { var GLOBAL_CONFIG_SITE = {
title: '!{titleVal}',
isPost: !{is_post()}, isPost: !{is_post()},
isHome: !{is_home()}, isHome: !{is_home()},
isHighlightShrink: !{isHighlightShrink}, isHighlightShrink: !{isHighlightShrink},
isSidebar: !{showToc} isToc: !{showToc},
} postUpdate: '!{full_date(page.updated)}'
}

View File

@@ -1,56 +0,0 @@
script.
var activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#000')
}
}
var activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#fff')
}
}
var getCookies = function (name) {
const value = `; ${document.cookie}`
const parts = value.split(`; ${name}=`)
if (parts.length === 2) return parts.pop().split(';').shift()
}
var autoChangeMode = '#{theme.darkmode.autoChangeMode}'
var t = getCookies('theme')
if (autoChangeMode === '1') {
var isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
var isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches
var isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches
var hasNoSupport = !isDarkMode && !isLightMode && !isNotSpecified
if (t === undefined) {
if (isLightMode) activateLightMode()
else if (isDarkMode) activateDarkMode()
else if (isNotSpecified || hasNoSupport) {
console.log('You specified no preference for a color scheme or your browser does not support it. I Schedule dark mode during night time.')
var now = new Date()
var hour = now.getHours()
var isNight = hour <= 6 || hour >= 18
isNight ? activateDarkMode() : activateLightMode()
}
window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) {
if (Cookies.get('theme') === undefined) {
e.matches ? activateDarkMode() : activateLightMode()
}
})
} else if (t === 'light') activateLightMode()
else activateDarkMode()
} else if (autoChangeMode === '2') {
now = new Date()
hour = now.getHours()
isNight = hour <= 6 || hour >= 18
if (t === undefined) isNight ? activateDarkMode() : activateLightMode()
else if (t === 'light') activateLightMode()
else activateDarkMode()
} else {
if (t === 'dark') activateDarkMode()
else if (t === 'light') activateLightMode()
}

View File

@@ -1,7 +1,9 @@
if (theme.google_adsense && theme.google_adsense.enable) if (theme.google_adsense && theme.google_adsense.enable)
script(async src=theme.google_adsense.js) script(async src=theme.google_adsense.js)
script.
(adsbygoogle = window.adsbygoogle || []).push({ if theme.google_adsense.auto_ads
google_ad_client: '!{theme.google_adsense.client}', script.
enable_page_level_ads: '!{theme.google_adsense.enable_page_level_ads}' (adsbygoogle = window.adsbygoogle || []).push({
}); google_ad_client: '!{theme.google_adsense.client}',
enable_page_level_ads: '!{theme.google_adsense.enable_page_level_ads}'
});

View File

@@ -1,9 +1,14 @@
noscript. noscript.
<style> <style type="text/css">
#nav { #nav {
opacity: 1 opacity: 1
} }
.justified-gallery img{ .justified-gallery img {
opacity: 1 opacity: 1
} }
#recent-posts time,
#post-meta time {
display: inline !important
}
</style> </style>

View File

@@ -1,19 +1,22 @@
link(rel="preconnect" href="//cdn.jsdelivr.net") link(rel="preconnect" href="//cdn.jsdelivr.net")
if theme.google_analytics if theme.google_analytics
link(rel="preconnect" href="//www.google-analytics.com" crossorigin) link(rel="preconnect" href="//www.google-analytics.com" crossorigin='')
if theme.baidu_analytics if theme.baidu_analytics
link(rel="preconnect" href="//hm.baidu.com") link(rel="preconnect" href="//hm.baidu.com")
if theme.tencent_analytics if theme.cnzz_analytics
link(rel="preconnect" href="//ta.qq.com") link(rel="preconnect" href="//s4.cnzz.com")
if theme.blog_title_font.font_link && theme.blog_title_font.font_link.indexOf('//fonts.googleapis.com') != -1 if theme.cloudflare_analytics
link(rel="preconnect" href="//fonts.googleapis.com" crossorigin) link(rel="preconnect" href="//static.cloudflareinsights.com")
if theme.microsoft_clarity
link(rel="preconnect" href="//www.clarity.ms")
if theme.blog_title_font && theme.blog_title_font.font_link && theme.blog_title_font.font_link.indexOf('//fonts.googleapis.com') != -1
link(rel="preconnect" href="//fonts.googleapis.com" crossorigin='')
if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv
link(rel="preconnect" href="//busuanzi.ibruce.info") link(rel="preconnect" href="//busuanzi.ibruce.info")
if theme.baidu_push
link(rel="preconnect" href="//zz.bdstatic.com")

View File

@@ -1,13 +1,11 @@
link(rel="manifest" href=theme.pwa.manifest) link(rel="manifest" href=url_for(theme.pwa.manifest))
if(theme.pwa.theme_color)
meta(name="theme-color" content=theme.pwa.theme_color)
if(theme.pwa.theme_color) if(theme.pwa.theme_color)
meta(name="msapplication-TileColor" content=theme.pwa.theme_color) meta(name="msapplication-TileColor" content=theme.pwa.theme_color)
if(theme.pwa.apple_touch_icon) if(theme.pwa.apple_touch_icon)
link(rel="apple-touch-icon" sizes="180x180" href=theme.pwa.apple_touch_icon) link(rel="apple-touch-icon" sizes="180x180" href=url_for(theme.pwa.apple_touch_icon))
if(theme.pwa.favicon_32_32) if(theme.pwa.favicon_32_32)
link(rel="icon" type="image/png" sizes="32x32" href=theme.pwa.favicon_32_32) link(rel="icon" type="image/png" sizes="32x32" href=url_for(theme.pwa.favicon_32_32))
if(theme.pwa.favicon_16_16) if(theme.pwa.favicon_16_16)
link(rel="icon" type="image/png" sizes="16x16" href=theme.pwa.favicon_16_16) link(rel="icon" type="image/png" sizes="16x16" href=url_for(theme.pwa.favicon_16_16))
if(theme.pwa.mask_icon) if(theme.pwa.mask_icon)
link(rel="mask-icon" href=theme.pwa.mask_icon color="#5bbad5") link(rel="mask-icon" href=url_for(theme.pwa.mask_icon) color="#5bbad5")

View File

@@ -1,11 +1,3 @@
if theme.google_site_verification if theme.site_verification
meta(name="google-site-verification" content=theme.google_site_verification) each item in theme.site_verification
meta(name=item.name content=item.content)
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)

View File

@@ -1,130 +0,0 @@
if theme.subtitle.enable
- var source = theme.subtitle.source
- var subtitleEffect = theme.subtitle.effect
if subtitleEffect
script(src=url_for(theme.CDN.typed))
if source == '1'
script.
var subtitleType = function () {
var subtitleEffect = !{ subtitleEffect }
fetch('https://api.btstu.cn/yan/api.php?charset=utf-8&encode=json',)
.then(function (res) {
return res.json()
})
.then(function (data) {
if (subtitleEffect) {
var sub = "!{theme.subtitle.sub}".length == 0 ? new Array() : "!{theme.subtitle.sub}".split(',')
var both = sub.unshift(data.text)
var typed = new Typed('#subtitle', {
strings: sub,
startDelay: 300,
typeSpeed: 150,
loop: !{theme.subtitle.loop},
backSpeed: 50,
})
} else {
document.getElementById('subtitle').innerHTML = data.text
}
})
.catch(function (err) {
console.error(err)
})
}
window.addEventListener('load', subtitleType)
else if source == '2'
script.
var subtitleType = function () {
var subtitleEffect = !{ subtitleEffect }
fetch('https://v1.hitokoto.cn')
.then(function (res) {
return res.json()
})
.then(function (data) {
if (subtitleEffect) {
var from = '出自 ' + data.from
var sub = "!{theme.subtitle.sub}".length == 0 ? new Array() : "!{theme.subtitle.sub}".split(',')
var both = sub.unshift(data.hitokoto, from)
var typed = new Typed('#subtitle', {
strings: sub,
startDelay: 300,
typeSpeed: 150,
loop: !{theme.subtitle.loop},
backSpeed: 50,
})
} else {
document.getElementById('subtitle').innerHTML = data.hitokoto
}
})
.catch(function (err) {
console.error(err)
})
}
window.addEventListener('load', subtitleType)
else if source == '3'
script.
var subtitleType = function () {
loadScript('http://yijuzhan.com/api/word.php?m=js', function () {
var subtitleEffect = !{ subtitleEffect }
var con = str[0]
if (subtitleEffect) {
var from = '出自 ' + str[1]
var sub = "!{theme.subtitle.sub}".length == 0 ? new Array() : "!{theme.subtitle.sub}".split(',')
var both = sub.unshift(con, from)
var typed = new Typed('#subtitle', {
strings: sub,
startDelay: 300,
typeSpeed: 150,
loop: !{theme.subtitle.loop},
backSpeed: 50,
})
} else {
document.getElementById('subtitle').innerHTML = con
}
})
}
window.addEventListener('load', subtitleType)
else if source == '4'
script.
var subtitleType = function () {
loadScript('https://sdk.jinrishici.com/v2/browser/jinrishici.js',function () {
var subtitleEffect = !{ subtitleEffect }
jinrishici.load(function (result) {
if (subtitleEffect) {
var sub = "!{theme.subtitle.sub}".length == 0 ? new Array() : "!{theme.subtitle.sub}".split(',')
var content = result.data.content
var both = sub.unshift(content)
var typed = new Typed('#subtitle', {
strings: sub,
startDelay: 300,
typeSpeed: 150,
loop: !{theme.subtitle.loop},
backSpeed: 50,
})
} else {
document.getElementById('subtitle').innerHTML = result.data.content
}
})
}
)
}
window.addEventListener('load', subtitleType)
else
script.
var subtitleEffect = !{subtitleEffect}
if (subtitleEffect) {
var typed = new Typed("#subtitle", {
strings: "!{theme.subtitle.sub}".split(","),
startDelay: 300,
typeSpeed: 150,
loop: !{theme.subtitle.loop},
backSpeed: 50
})
} else {
document.getElementById("subtitle").innerHTML = '!{theme.subtitle.sub[0]}'
}

View File

@@ -1,43 +1,50 @@
if is_home() if !theme.disable_top_img && page.top_img !== false
- var top_img = theme.index_img || theme.default_top_img if is_post()
else if is_post() - var top_img = page.top_img || page.cover || page.randomcover
- var top_img = page.top_img || page.cover || page.randomcover || theme.default_top_img else if is_page()
else if is_archive() - var top_img = page.top_img || theme.default_top_img
- var top_img = theme.archive_img || theme.default_top_img else if is_tag()
else if is_tag() - var top_img = theme.tag_per_img && theme.tag_per_img[page.tag]
- var top_img = theme.tag_img || theme.default_top_img - top_img = top_img ? top_img : (theme.tag_img !== false ? theme.tag_img || theme.default_top_img : false)
else if is_category() else if is_category()
- var top_img = theme.category_img || theme.default_top_img - var top_img = theme.category_per_img && theme.category_per_img[page.category]
- top_img = top_img ? top_img : (theme.category_img !== false ? theme.category_img || theme.default_top_img : false)
else if is_home()
- var top_img = theme.index_img !== false ? theme.index_img || theme.default_top_img : false
else if is_archive()
- var top_img = theme.archive_img !== false ? theme.archive_img || theme.default_top_img : false
else
- var top_img = page.top_img || theme.default_top_img
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 = page.title || page.tag || page.category || config.title
- var isHomeClass = is_home() ? 'full_page' : 'not-home-page'
- is_post() ? isHomeClass = 'post-bg' : isHomeClass
else
- var isHomeClass = 'not-top-img'
else else
- var top_img = page.top_img || theme.default_top_img - var top_img = false
- var isHomeClass = 'not-top-img'
if theme.douban
if is_current('/movies/', [strict])
- var top_img = theme.douban.movies_img || theme.default_top_img
else if is_current('/books/', [strict])
- var top_img = theme.douban.books_img || theme.default_top_img
else if is_current('/games/', [strict])
- var top_img = theme.douban.games_img || theme.default_top_img
- var bg_img = top_img && top_img !== true ? `background-image: url(${url_for(top_img)})` : ''
- var site_title = is_archive() ? _p('page.archives') : page.title || page.tag || page.category || config.title
- var isHomeClass = is_home() ? 'full_page' : 'not-index-bg'
- is_post() ? isHomeClass = 'post-bg' : isHomeClass
header#page-header(class=isHomeClass style=bg_img) header#page-header(class=isHomeClass style=bg_img)
!=partial('includes/header/nav', {}, {cache:theme.fragment_cache}) !=partial('includes/header/nav', {}, {cache: true})
if is_home() if top_img !== false
#site-info if is_post()
h1#site_title=site_title include ./post-info.pug
#site_subtitle else if is_home()
span#subtitle #site-info
if(theme.social) h1#site-title=site_title
#site_social_icons if theme.subtitle.enable
!=fragment_cache('social', function(){return partial('includes/header/social')}) - var loadSubJs = true
#scroll_down #site-subtitle
i.fas.fa-angle-down.scroll-down-effects span#subtitle
else if is_post() if(theme.social)
include ./post-info.pug #site_social_icons
else !=fragment_cache('social', function(){return partial('includes/header/social')})
#page_site-info #scroll-down
h1#site_title=site_title i.fas.fa-angle-down.scroll-down-effects
else
#page-site-info
h1#site-title=site_title

View File

@@ -1,22 +1,27 @@
.menus_items if theme.menu
each value, label in theme.menu .menus_items
if !Array.isArray(value) each value, label in theme.menu
.menus_item if typeof value !== 'object'
a.site-page(href=url_for(trim(value.split('||')[0]))) .menus_item
if value.split('||')[1] - const valueArray = value.split('||')
i.fa-fw(class=trim(value.split('||')[1])) a.site-page(href=url_for(trim(valueArray[0])))
span=' '+label if valueArray[1]
else i.fa-fw(class=trim(valueArray[1]))
.menus_item span=' '+label
a.site-page else
if label.split('||')[1] .menus_item
i.fa-fw(class=trim(label.split('||')[1]) ) - const labelArray = label.split('||')
span=' '+ trim(label.split('||')[0]) - const hideClass = labelArray[2] && trim(labelArray[2]) === 'hide' ? 'hide' : ''
i.fas.fa-chevron-down.menus-expand a.site-page.group(class=`${hideClass}` href='javascript:void(0);')
ul.menus_item_child if labelArray[1]
each i in value i.fa-fw(class=trim(labelArray[1]))
li span=' '+ trim(labelArray[0])
a.site-page(href=url_for(trim(i.split('||')[1]))) i.fas.fa-chevron-down
if i.split('||')[2] ul.menus_item_child
i.fa-fw(class=trim(i.split('||')[2])) each val,lab in value
span=' '+trim(i.split('||')[0]) - const valArray = val.split('||')
li
a.site-page.child(href=url_for(trim(valArray[0])))
if valArray[1]
i.fa-fw(class=trim(valArray[1]))
span=' '+ lab

View File

@@ -1,16 +1,16 @@
nav#nav nav#nav
span#blog_name.pull-left span#blog_name
a#site-name.blog_title(href=url_for('/')) #[=config.title] a#site-name(href=url_for('/')) #[=config.title]
span.pull-right.menus #menus
if (theme.algolia_search.enable || theme.local_search && theme.local_search.enable) if (theme.algolia_search.enable || theme.local_search.enable)
#search_button #search-button
a.site-page.social-icon.search a.site-page.social-icon.search
i.fas.fa-search.fa-fw i.fas.fa-search.fa-fw
span=' '+_p('search') span=' '+_p('search.title')
!=fragment_cache('menus', function(){return partial('includes/header/menu_item')}) !=partial('includes/header/menu_item', {}, {cache: true})
span.toggle-menu.close #toggle-menu
a.site-page a.site-page
i.fas.fa-bars.fa-fw i.fas.fa-bars.fa-fw

View File

@@ -1,88 +1,138 @@
- let comments = theme.comments
#post-info #post-info
#post-title h1.post-title= page.title || _p('no_title')
.posttitle= page.title || _p('no_title') if theme.post_edit.enable
a.post-edit-link(href=theme.post_edit.url + page.source title=_p('post.edit') target="_blank")
i.fas.fa-pencil-alt
#post-meta #post-meta
.meta-firstline .meta-firstline
if (theme.post_meta.post.date_type) if (theme.post_meta.post.date_type)
if (theme.post_meta.post.date_type === 'both') span.post-meta-date
time.post-meta__date if (theme.post_meta.post.date_type === 'both')
span.post-meta__date-created(title= _p('post.created')+' '+full_date(page.date)) i.far.fa-calendar-alt.fa-fw.post-meta-icon
i.far.fa-calendar-alt.fa-fw span.post-meta-label= _p('post.created')
=' '+_p('post.created')+' '+date(page.date, config.date_format) time.post-meta-date-created(datetime=date_xml(page.date) title=_p('post.created') + ' ' + full_date(page.date))=date(page.date, config.date_format)
span.post-meta__separator | span.post-meta-separator |
span.post-meta__date-updated(title= _p('post.updated')+' '+full_date(page.updated)) i.fas.fa-history.fa-fw.post-meta-icon
i.fas.fa-history.fa-fw span.post-meta-label= _p('post.updated')
=' '+_p('post.updated')+' '+date(page.updated, config.date_format) time.post-meta-date-updated(datetime=date_xml(page.updated) title=_p('post.updated') + ' ' + full_date(page.updated))=date(page.updated, config.date_format)
else else
- var data_type_update = theme.post_meta.post.date_type === 'updated' - let data_type_update = theme.post_meta.post.date_type === 'updated'
- var date_type = data_type_update ? 'updated' : 'date' - let date_type = data_type_update ? 'updated' : 'date'
- var date_icon = data_type_update ? 'fas fa-history' :'far fa-calendar-alt' - let date_icon = data_type_update ? 'fas fa-history' :'far fa-calendar-alt'
- var data_info = data_type_update ? _p('post.updated') : _p('post.created') - let date_title = data_type_update ? _p('post.updated') : _p('post.created')
time.post-meta__date(title=data_info + ' ' + full_date(page[date_type])) i.fa-fw.post-meta-icon(class=date_icon)
i.fa-fw(class=date_icon) span.post-meta-label= date_title
=' ' + data_info + ' ' + date(page[date_type], config.date_format) time(datetime=date_xml(page[date_type]) title=date_title + ' ' + full_date(page[date_type]))=date(page[date_type], config.date_format)
if (theme.post_meta.post.categories && page.categories.data.length > 0) if (theme.post_meta.post.categories && page.categories.data.length > 0)
span.post-meta__categories span.post-meta-categories
if (theme.post_meta.post.date_type) if (theme.post_meta.post.date_type)
span.post-meta__separator | span.post-meta-separator |
each item, index in page.categories.data each item, index in page.categories.data
i.fas.fa-inbox.fa-fw.post-meta__icon i.fas.fa-inbox.fa-fw.post-meta-icon
a(href=url_for(item.path)).post-meta__categories #[=item.name] a(href=url_for(item.path)).post-meta-categories #[=item.name]
if (index < page.categories.data.length - 1) if (index < page.categories.data.length - 1)
i.fas.fa-angle-right.post-meta__separator i.fas.fa-angle-right.post-meta-separator
.meta-secondline .meta-secondline
- let postWordcount = theme.wordcount.enable && (theme.wordcount.post_wordcount || theme.wordcount.min2read) - let postWordcount = theme.wordcount.enable && (theme.wordcount.post_wordcount || theme.wordcount.min2read)
if (postWordcount) if (postWordcount)
span.post-meta-separator |
span.post-meta-wordcount span.post-meta-wordcount
if theme.wordcount.post_wordcount if theme.wordcount.post_wordcount
i.far.fa-file-word.fa-fw.post-meta__icon i.far.fa-file-word.fa-fw.post-meta-icon
span= _p('post.wordcount') + ':' span.post-meta-label= _p('post.wordcount') + ':'
span.word-count= wordcount(page.content) span.word-count= wordcount(page.content)
if theme.wordcount.min2read if theme.wordcount.min2read
span.post-meta__separator | span.post-meta-separator |
if theme.wordcount.min2read if theme.wordcount.min2read
i.far.fa-clock.fa-fw.post-meta__icon i.far.fa-clock.fa-fw.post-meta-icon
span= _p('post.min2read', min2read(page.content, {cn: 350, en: 160})) span.post-meta-label= _p('post.min2read') + ':'
span= min2read(page.content, {cn: 350, en: 160}) + _p('post.min2read_unit')
.meta-thirdline //- for pv and count
span.post-meta-pv-cv mixin pvBlock(parent_id,parent_class,parent_title)
if (postWordcount && theme.busuanzi.page_pv) span.post-meta-separator |
span.post-meta__separator | span(class=parent_class id=parent_id data-flag-title=page.title)
if theme.busuanzi.page_pv i.far.fa-eye.fa-fw.post-meta-icon
i.far.fa-eye.fa-fw.post-meta__icon span.post-meta-label=_p('post.page_pv') + ':'
span=_p('post.page_pv') + ':' if block
span#busuanzi_value_page_pv block
span.post-meta-commentcount - const commentUse = comments.use
if ((theme.disqus && theme.disqus.enable && theme.disqus.count && page.comments !== false) || (theme.disqusjs && theme.disqusjs.enable && theme.disqusjs.count && page.comments !== false)) if page.comments !== false && commentUse && !comments.lazyload
if (postWordcount || theme.busuanzi.page_pv) if commentUse[0] === 'Valine' && theme.valine.visitor
span.post-meta__separator | +pvBlock(url_for(page.path),'leancloud_visitors',page.title)
i.far.fa-comments.fa-fw.post-meta__icon span.leancloud-visitors-count
span= _p('post.comments') + ':' i.fa-solid.fa-spinner.fa-spin
span.disqus-comment-count.comment-count else if commentUse[0] === 'Waline' && theme.waline.pageview
a(href=full_url_for(page.path) + '#disqus_thread') +pvBlock('','','')
else if (theme.valine && theme.valine.enable && theme.valine.count && page.comments !== false) span.waline-pageview-count(data-path=url_for(page.path))
if (postWordcount || theme.busuanzi.page_pv) i.fa-solid.fa-spinner.fa-spin
span.post-meta__separator | else if commentUse[0] === 'Twikoo' && theme.twikoo.visitor
i.far.fa-comments.fa-fw.post-meta__icon +pvBlock('','','')
span= _p('post.comments') + ':' span#twikoo_visitors
a(href=url_for(page.path) + '#post-comment' itemprop="discussionUrl") i.fa-solid.fa-spinner.fa-spin
span.valine-comment-count.comment-count(data-xid=url_for(page.path) itemprop="commentCount") else if theme.busuanzi.page_pv
else if (theme.gitalk && theme.gitalk.enable && theme.gitalk.count && page.comments !== false) +pvBlock('','post-meta-pv-cv','')
if (postWordcount || theme.busuanzi.page_pv) span#busuanzi_value_page_pv
span.post-meta__separator | i.fa-solid.fa-spinner.fa-spin
i.far.fa-comments.fa-fw.post-meta__icon else if theme.busuanzi.page_pv
span= _p('post.comments') + ':' +pvBlock('','post-meta-pv-cv','')
a(href=url_for(page.path) + '#post-comment') span#busuanzi_value_page_pv
span.gitalk-comment-count.comment-count i.fa-solid.fa-spinner.fa-spin
else if theme.facebook_comments.enable && theme.facebook_comments.count && page.comments !== false
if (postWordcount || theme.busuanzi.page_pv) if comments.count && !comments.lazyload && page.comments !== false && comments.use
span.post-meta__separator | - var whichCount = comments.use[0]
i.far.fa-comments.fa-fw.post-meta__icon
span= _p('post.comments') + ':' mixin countBlock
a.comment-count(href=url_for(page.path) + '#post-comment') span.post-meta-separator |
span.fb-comments-count(data-href=urlNoIndex()) span.post-meta-commentcount
i.far.fa-comments.fa-fw.post-meta-icon
span.post-meta-label= _p('post.comments') + ':'
if block
block
case whichCount
when 'Disqus'
+countBlock
span.disqus-comment-count
a(href=full_url_for(page.path) + '#disqus_thread')
i.fa-solid.fa-spinner.fa-spin
when 'Disqusjs'
+countBlock
a(href=full_url_for(page.path) + '#disqusjs')
span.disqus-comment-count(data-disqus-url=full_url_for(page.path))
i.fa-solid.fa-spinner.fa-spin
when 'Valine'
+countBlock
a(href=url_for(page.path) + '#post-comment' itemprop="discussionUrl")
span.valine-comment-count(data-xid=url_for(page.path) itemprop="commentCount")
i.fa-solid.fa-spinner.fa-spin
when 'Waline'
+countBlock
a(href=url_for(page.path) + '#post-comment')
span.waline-comment-count(data-path=url_for(page.path))
i.fa-solid.fa-spinner.fa-spin
when 'Gitalk'
+countBlock
a(href=url_for(page.path) + '#post-comment')
span.gitalk-comment-count
i.fa-solid.fa-spinner.fa-spin
when 'Twikoo'
+countBlock
a(href=url_for(page.path) + '#post-comment')
span#twikoo-count
i.fa-solid.fa-spinner.fa-spin
when 'Facebook Comments'
+countBlock
a(href=url_for(page.path) + '#post-comment')
span.fb-comments-count(data-href=urlNoIndex())
i.fa-solid.fa-spinner.fa-spin
when 'Remark42'
+countBlock
a(href=url_for(page.path) + '#post-comment')
span.remark42__counter(data-url=urlNoIndex())
i.fa-solid.fa-spinner.fa-spin

View File

@@ -1,48 +1,48 @@
- var htmlClassHideAside = theme.aside.enable && theme.aside.hide ? 'hide-aside' : ''
- page.aside = is_archive() ? theme.aside.display.archive: is_category() ? theme.aside.display.category : is_tag() ? theme.aside.display.tag : page.aside
- var hideAside = !theme.aside.enable || page.aside === false ? 'hide-aside' : '' - var hideAside = !theme.aside.enable || page.aside === false ? 'hide-aside' : ''
- var pageHighlightShrinkSet = page.highlight_shrink !== undefined ? page.highlight_shrink : theme.highlight_shrink - var pageType = is_post() ? 'post' : 'page'
- var pageHighlightShrink = theme.highlight_shrink !== 'none' && pageHighlightShrinkSet ? 'code-close' : ''
doctype html doctype html
html(lang=config.language data-theme=theme.display_mode) html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside)
head head
include ./head.pug include ./head.pug
body body
if theme.preloader if theme.preloader
!=partial('includes/loading/loading', {}, {cache:theme.fragment_cache}) !=partial('includes/loading/loading', {}, {cache: true})
if theme.fireworks && theme.fireworks.enable if theme.background
canvas.fireworks #web_bg
!=partial('includes/mobile-sidebar/index', {}, {cache:theme.fragment_cache})
include ./sidebar.pug
#body-wrap(class=pageHighlightShrink)
if theme.background
- var is_photo = theme.background.startsWith('url') ? 'photo':'color'
#web_bg(data-type=is_photo)
include ./header/index.pug
if (!is_post())
main#content-inner.layout_page(class=hideAside)
if body
div!= body
else
block content
include widget/index.pug
else
main#content-inner.layout_post
if body
div!= body
else
block content
- var footer_bg = theme.footer_bg == false ? '' : bg_img !=partial('includes/sidebar', {}, {cache: true})
- var is_bg = theme.footer_bg == false ? 'color' : 'photo'
footer#footer(style=footer_bg data-type=is_bg) if page.type !== '404'
!=partial('includes/footer', {}, {cache:theme.fragment_cache}) #body-wrap(class=pageType)
include ./header/index.pug
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
- var footer_bg = ''
footer#footer(style=footer_bg)
!=partial('includes/footer', {}, {cache: true})
else
include ./404.pug
include ./rightside.pug include ./rightside.pug
!=partial('includes/search/index', {}, {cache:theme.fragment_cache}) !=partial('includes/third-party/search/index', {}, {cache: true})
include ./additional-js.pug include ./additional-js.pug

View File

@@ -1,6 +1,13 @@
script. script.
var endLoading = function () { var preloader = {
document.body.style.overflow = 'auto'; endLoading: () => {
document.getElementById('loading-box').classList.add("loaded") document.body.style.overflow = 'auto';
document.getElementById('loading-box').classList.add("loaded")
},
initLoading: () => {
document.body.style.overflow = '';
document.getElementById('loading-box').classList.remove("loaded")
}
} }
window.addEventListener('load',endLoading) window.addEventListener('load',preloader.endLoading())

View File

@@ -1,7 +0,0 @@
link(rel="stylesheet" type="text/css" href=theme.CDN.katex)
script(src=url_for(theme.CDN.katex_copytex))
link(rel="stylesheet" type="text/css" href=theme.CDN.katex_copytex_css)
script.
$(function () {
$('span.katex-display').wrap('<div class="katex-wrap"></div>')
})

View File

@@ -1,27 +0,0 @@
script(type="text/x-mathjax-config").
MathJax.Hub.Config({
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
processEscapes: true,
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
},
CommonHTML: {
linebreaks: { automatic: true, width: "90% container" }
},
"HTML-CSS": {
linebreaks: { automatic: true, width: "90% container" }
},
"SVG": {
linebreaks: { automatic: true, width: "90% container" }
}
});
script(type="text/x-mathjax-config").
MathJax.Hub.Queue(function() {
var all = MathJax.Hub.getAllJax(), i;
for (i=0; i < all.length; i += 1) {
all[i].SourceElement().parentNode.className += ' has-jax';
}
});
script(src=theme.CDN.mathjax)

View File

@@ -1,8 +0,0 @@
script.
if (document.getElementsByClassName('mermaid').length) {
loadScript('!{theme.CDN.mermaid}',function () {
mermaid.initialize({
theme: '!{theme.mermaid.theme}',
})
})
}

View File

@@ -2,19 +2,19 @@ mixin articleSort(posts)
.article-sort .article-sort
- var year - var year
- posts.each(function (article) { - posts.each(function (article) {
- var tempYear = date(article.date, 'YYYY') - let tempYear = date(article.date, 'YYYY')
- var no_cover = article.cover === false || !theme.cover.archives_enable ? 'no-article-cover' : '' - let no_cover = article.cover === false || !theme.cover.archives_enable ? 'no-article-cover' : ''
- let title = article.title || _p('no_title')
if tempYear !== year if tempYear !== year
- year = tempYear - year = tempYear
.article-sort-item.year= year .article-sort-item.year= year
.article-sort-item(class=no_cover) .article-sort-item(class=no_cover)
if article.cover && theme.cover.archives_enable if article.cover && theme.cover.archives_enable
.article-sort-img a.article-sort-item-img(href=url_for(article.path) title=title)
a.article-sort-item__img(href=url_for(article.path)) 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=article.title || 'No Title' onerror=`this.onerror=null;this.src='`+ url_for(theme.error_img.post_page) + `'`) .article-sort-item-info
.article-sort-post .article-sort-item-time
a.article-sort-item__post(href=url_for(article.path))
i.far.fa-calendar-alt i.far.fa-calendar-alt
time.article-sort-item__time(title=_p('post.created') + ' ' + full_date(article.date))= date(article.date, config.date_format) time.post-meta-date-created(datetime=date_xml(article.date) title=_p('post.created') + ' ' + full_date(article.date))= date(article.date, config.date_format)
.article-sort-item__title= article.title || 'No Title' a.article-sort-item-title(href=url_for(article.path) title=title)= title
- }) - })

View File

@@ -1,78 +1,128 @@
mixin postUI(posts) mixin postUI(posts)
each article , index in page.posts.data each article , index in page.posts.data
.recent-post-item .recent-post-item
- var link = article.link || article.path -
- var title = article.title || _p('no_title') let link = article.link || article.path
- var leftOrRight = index%2 == 0 ? 'left_radius' : 'right_radius' let title = article.title || _p('no_title')
- var post_cover = article.cover const position = theme.cover.position
- var no_cover = article.cover === false || !theme.cover.index_enable ? 'no-cover' : '' let leftOrRight = position === 'both'
? index%2 == 0 ? 'left' : 'right'
: position === 'left' ? 'left' : 'right'
let post_cover = article.cover
let no_cover = article.cover === false || !theme.cover.index_enable ? 'no-cover' : ''
-
if post_cover && theme.cover.index_enable if post_cover && theme.cover.index_enable
.post_cover(class=leftOrRight) .post_cover(class=leftOrRight)
a(href=url_for(link) title=title) a(href=url_for(link) title=title)
if theme.lazyload.enable 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(data-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)
.recent-post-info(class=no_cover) .recent-post-info(class=no_cover)
a.article-title(href=url_for(link) title=title)= title a.article-title(href=url_for(link) title=title)= title
.article-meta-wrap .article-meta-wrap
if (is_home() && (article.top || article.sticky > 0)) if (is_home() && (article.top || article.sticky > 0))
span.article-meta span.article-meta
i.fas.fa-thumbtack.article-meta__icon.sticky i.fas.fa-thumbtack.sticky
span.sticky= _p('sticky') span.sticky= _p('sticky')
span.article-meta__separator | span.article-meta-separator |
if (theme.post_meta.page.date_type) if (theme.post_meta.page.date_type)
if (theme.post_meta.page.date_type === 'both') span.post-meta-date
time.post-meta__date if (theme.post_meta.page.date_type === 'both')
span.post-meta__date-created(title=_p('post.created') + ' ' + full_date(article.date)) i.far.fa-calendar-alt
i.far.fa-calendar-alt span.article-meta-label=_p('post.created')
=date(article.date, config.date_format) time.post-meta-date-created(datetime=date_xml(article.date) title=_p('post.created') + ' ' + full_date(article.date))=date(article.date, config.date_format)
span.article-meta__separator | span.article-meta-separator |
span.post-meta__date-updated(title=_p('post.updated') + ' ' + full_date(article.updated)) i.fas.fa-history
i.fas.fa-history span.article-meta-label=_p('post.updated')
=date(article.updated, config.date_format) time.post-meta-date-updated(datetime=date_xml(article.updated) title=_p('post.updated') + ' ' + full_date(article.updated))=date(article.updated, config.date_format)
else else
- var data_type_updated = theme.post_meta.page.date_type === 'updated' - let data_type_updated = theme.post_meta.page.date_type === 'updated'
- var date_type = data_type_updated ? 'updated' : 'date' - let date_type = data_type_updated ? 'updated' : 'date'
- var date_icon = data_type_updated ? 'fas fa-history' :'far fa-calendar-alt' - let date_icon = data_type_updated ? 'fas fa-history' :'far fa-calendar-alt'
- var date_title = data_type_updated ? _p('post.updated') : _p('post.created') - let date_title = data_type_updated ? _p('post.updated') : _p('post.created')
time.post-meta__date(title=date_title + ' ' + full_date(article[date_type]))
i(class=date_icon) i(class=date_icon)
=date(article[date_type], config.date_format) span.article-meta-label=date_title
time(datetime=date_xml(article[date_type]) title=date_title + ' ' + full_date(article[date_type]))=date(article[date_type], config.date_format)
if (theme.post_meta.page.categories && article.categories.data.length > 0) if (theme.post_meta.page.categories && article.categories.data.length > 0)
span.article-meta span.article-meta
span.article-meta__separator | span.article-meta-separator |
i.fas.fa-inbox.article-meta__icon i.fas.fa-inbox
each item, index in article.categories.data each item, index in article.categories.data
a(href=url_for(item.path)).article-meta__categories #[=item.name] a(href=url_for(item.path)).article-meta__categories #[=item.name]
if (index < article.categories.data.length - 1) if (index < article.categories.data.length - 1)
i.fas.fa-angle-right i.fas.fa-angle-right.article-meta-link
if (theme.post_meta.page.tags && article.tags.data.length > 0) if (theme.post_meta.page.tags && article.tags.data.length > 0)
span.article-meta.tags span.article-meta.tags
span.article-meta__separator | span.article-meta-separator |
i.fas.fa-tag.article-meta__icon i.fas.fa-tag
each item, index in article.tags.data each item, index in article.tags.data
a(href=url_for(item.path)).article-meta__tags #[=item.name] a(href=url_for(item.path)).article-meta__tags #[=item.name]
if (index < article.tags.data.length - 1) if (index < article.tags.data.length - 1)
span.article-meta__link #[='•'] span.article-meta-link #[='•']
mixin countBlockInIndex
- needLoadCountJs = true
span.article-meta
span.article-meta-separator |
i.fas.fa-comments
if block
block
span.article-meta-label= ' ' + _p('card_post_count')
if theme.comments.card_post_count
case theme.comments.use[0]
when 'Disqus'
+countBlockInIndex
a(href=full_url_for(link) + '#disqus_thread')
i.fa-solid.fa-spinner.fa-spin
when 'Disqusjs'
+countBlockInIndex
a(href=full_url_for(link) + '#disqusjs')
span.disqus-comment-count(data-disqus-url=full_url_for(link))
i.fa-solid.fa-spinner.fa-spin
when 'Valine'
+countBlockInIndex
a(href=url_for(link) + '#post-comment')
span.valine-comment-count(data-xid=url_for(link))
i.fa-solid.fa-spinner.fa-spin
when 'Waline'
+countBlockInIndex
a(href=url_for(link) + '#post-comment')
span.waline-comment-count(id=url_for(link))
i.fa-solid.fa-spinner.fa-spin
when 'Twikoo'
+countBlockInIndex
a.twikoo-count(href=url_for(link) + '#post-comment')
i.fa-solid.fa-spinner.fa-spin
when 'Facebook Comments'
+countBlockInIndex
a(href=url_for(link) + '#post-comment')
span.fb-comments-count(data-href=urlNoIndex(article.permalink))
i.fa-solid.fa-spinner.fa-spin
when 'Remark42'
+countBlockInIndex
a(href=url_for(link) + '#post-comment')
span.remark42__counter(data-url=urlNoIndex(article.permalink))
i.fa-solid.fa-spinner.fa-spin
//- Display the article introduction on homepage //- Display the article introduction on homepage
if theme.index_post_content.method == 1 case theme.index_post_content.method
.content!= article.description when false
else if theme.index_post_content.method == 2 - break
if article.description when 1
.content!= article.description .content!= article.description
else when 2
if article.description
.content!= article.description
else
- const content = strip_html(article.content)
- let expert = content.substring(0, theme.index_post_content.length)
- content.length > theme.index_post_content.length ? expert += ' ...' : ''
.content!= expert
default
- const content = strip_html(article.content) - const content = strip_html(article.content)
- let expert = content.substring(0, theme.index_post_content.length) - let expert = content.substring(0, theme.index_post_content.length)
- content.length > theme.index_post_content.length ? expert += ' ...' : '' - content.length > theme.index_post_content.length ? expert += ' ...' : ''
.content!= expert .content!= expert
else
- const content = strip_html(article.content)
- let expert = content.substring(0, theme.index_post_content.length)
- content.length > theme.index_post_content.length ? expert += ' ...' : ''
.content!= expert
if theme.ad && theme.ad.index if theme.ad && theme.ad.index
if (index + 1) % 3 == 0 if (index + 1) % 3 == 0
.recent-post-item.ad_height!=theme.ad.index .recent-post-item.ads-wrap!=theme.ad.index

View File

@@ -1,3 +0,0 @@
#mobile-sidebar
#menu_mask
include ../mobile-sidebar/mobile-menus.pug

View File

@@ -1,26 +0,0 @@
#mobile-sidebar-menus
.mobile_author_icon
img.avatar-img(src=url_for(theme.avatar.img) onerror=`onerror=null;src='${theme.error_img.flink}'` alt="avatar")
.mobile_post_data
if site.posts.length
.mobile_data_item.is-center
.mobile_data_link
a(href=url_for(config.archive_dir) + '/')
.headline= _p('aside.articles')
.length_num= site.posts.length
if site.tags.length
.mobile_data_item.is-center
.mobile_data_link
a(href=url_for(config.tag_dir) + '/' )
.headline= _p('aside.tags')
.length_num= site.tags.length
if site.categories.length
.mobile_data_item.is-center
.mobile_data_link
a(href=url_for(config.category_dir) + '/')
.headline= _p('aside.categories')
.length_num= site.categories.length
hr
!=fragment_cache('menus', function(){return partial('includes/header/menu_item')})

View File

@@ -0,0 +1 @@
.category-lists!= list_categories()

View File

@@ -0,0 +1,2 @@
#article-container
!= page.content

View File

@@ -0,0 +1,68 @@
#article-container
.flink
if page.flink_url
script.
(()=>{
const replaceSymbol = (str) => {
return str.replace(/[\p{P}\p{S}]/gu, "-")
}
let result = ""
fetch("!{url_for(page.flink_url)}")
.then(response => response.json())
.then(str => {
for(let i = 0; i < str.length; i++){
const replaceClassName = replaceSymbol(str[i].class_name)
const className = str[i].class_name ? `<h2 id="${replaceClassName}"><a href="#${replaceClassName}" class="headerlink" title="${str[i].class_name}"></a>${str[i].class_name}</h2>` : ""
const classDesc = str[i].class_desc ? `<div class="flink-desc">${str[i].class_desc}</div>` : ""
let listResult = ""
const lists = str[i].link_list
for(let j = 0; j < lists.length; j++){
listResult += `
<div class="flink-list-item">
<a href="${lists[j].link}" title="${lists[j].name}" target="_blank">
<div class="flink-item-icon">
<img class="no-lightbox" src="${lists[j].avatar}" onerror='this.onerror=null;this.src="!{url_for(theme.error_img.flink)}"' alt="${lists[j].name}" />
</div>
<div class="flink-item-name">${lists[j].name}</div>
<div class="flink-item-desc" title="${lists[j].descr}">${lists[j].descr}</div>
</a>
</div>`
}
result += `${className}${classDesc} <div class="flink-list">${listResult}</div>`
}
document.querySelector(".flink").insertAdjacentHTML("afterbegin", result)
})
})()
else
if site.data.link
- let result = ""
each i in site.data.link
- let className = i.class_name ? markdown(`## ${i.class_name}`) : ""
- let classDesc = i.class_desc ? `<div class="flink-desc">${i.class_desc}</div>` : ""
- let listResult = ""
each j in i.link_list
-
listResult += `
<div class="flink-list-item">
<a href="${j.link}" title="${j.name}" target="_blank">
<div class="flink-item-icon">
<img class="no-lightbox" src="${j.avatar}" onerror='this.onerror=null;this.src="${url_for(theme.error_img.flink)}"' alt="${j.name}" />
</div>
<div class="flink-item-name">${j.name}</div>
<div class="flink-item-desc" title="${j.descr}">${j.descr}</div>
</a>
</div>`
-
- result += `${className}${classDesc} <div class="flink-list">${listResult}</div>`
- page.content = result + page.content
!= page.content

View File

@@ -0,0 +1,2 @@
.tag-cloud-list.is-center
!=cloudTags({source: site.tags, minfontsize: 1.2, maxfontsize: 2.1, limit: 0, unit: 'em'})

View File

@@ -6,34 +6,32 @@
escape: false escape: false
} }
if(!is_post()) if is_post()
nav#pagination - let prev = theme.post_pagination === 1 ? page.prev : page.next
div.pagination - let next = theme.post_pagination === 1 ? page.next : page.prev
!=paginator(options)
else
nav#pagination.pagination-post nav#pagination.pagination-post
if(page.prev) if(prev)
- var hasPageNext = page.next ? 'pull-left' : 'pull-full' - var hasPageNext = next ? 'pull-left' : 'pull-full'
.prev-post(class=hasPageNext) .prev-post(class=hasPageNext)
- var pagination_cover = page.prev.cover === false ? page.prev.randomcover : page.prev.cover - var pagination_cover = prev.cover === false ? prev.randomcover : prev.cover
a(href=url_for(page.prev.path)) a(href=url_for(prev.path))
if theme.lazyload.enable 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(data-src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` )
else
img.prev-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` )
.pagination-info .pagination-info
.label=_p('pagination.prev') .label=_p('pagination.prev')
.prev_info=page.prev.title .prev_info=prev.title
if(page.next) if(next)
- var hasPagePrev = page.prev ? 'pull-right' : 'pull-full' - var hasPagePrev = prev ? 'pull-right' : 'pull-full'
- var pagination_cover = page.next.cover == false ? page.next.randomcover : page.next.cover - var pagination_cover = next.cover == false ? next.randomcover : next.cover
.next-post(class=hasPagePrev) .next-post(class=hasPagePrev)
a(href=url_for(page.next.path)) a(href=url_for(next.path))
if theme.lazyload.enable 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(data-src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'`)
else
img.next-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'`)
.pagination-info .pagination-info
.label=_p('pagination.next') .label=_p('pagination.next')
.next_info=page.next.title .next_info=next.title
else
nav#pagination
.pagination
if is_home()
- options.format = 'page/%d/#content-inner'
!=paginator(options)

View File

@@ -1,13 +1,17 @@
if (theme.post_copyright && theme.post_copyright.enable && page.copyright != false) if theme.post_copyright.enable && page.copyright !== false
- let author = page.copyright_author || config.author
- let authorHref = page.copyright_author_href || theme.post_copyright.author_href || config.url
- let url = page.copyright_url || page.permalink
- let info = page.copyright_info || _p('post.copyright.copyright_content', theme.post_copyright.license_url, theme.post_copyright.license, config.url, config.title)
.post-copyright .post-copyright
.post-copyright__author .post-copyright__author
span.post-copyright-meta= _p('post.copyright.author') + ": " span.post-copyright-meta= _p('post.copyright.author') + ": "
span.post-copyright-info span.post-copyright-info
a(href=`mailto:${config.email}`) #[=config.author] a(href=authorHref)=author
.post-copyright__type .post-copyright__type
span.post-copyright-meta= _p('post.copyright.link') + ": " span.post-copyright-meta= _p('post.copyright.link') + ": "
span.post-copyright-info span.post-copyright-info
a(href=url_for(page.permalink))= theme.post_copyright.decode ? decodeURI(page.permalink) : page.permalink a(href=url_for(url))= theme.post_copyright.decode ? decodeURI(url) : url
.post-copyright__notice .post-copyright__notice
span.post-copyright-meta= _p('post.copyright.copyright_notice') + ": " span.post-copyright-meta= _p('post.copyright.copyright_notice') + ": "
span.post-copyright-info!= _p('post.copyright.copyright_content', theme.post_copyright.license_url, theme.post_copyright.license, config.url, config.title) span.post-copyright-info!= info

View File

@@ -1,12 +1,13 @@
.post-reward .post-reward
button.reward-button .reward-button
i.fas.fa-qrcode i.fas.fa-qrcode
= ' ' + _p('donate') = ' ' + _p('donate')
.reward-main .reward-main
ul.reward-all ul.reward-all
each item in theme.reward.QR_code each item in theme.reward.QR_code
- var clickTo = (item.itemlist||item).link ? (item.itemlist||item).link : (item.itemlist||item).img - var clickTo = item.link ? item.link : item.img
li.reward-item li.reward-item
img.post-qr-code__img(src=url_for((item.itemlist||item).img) alt=(item.itemlist||item).text onclick=`window.open('${url_for(clickTo)}')`) a(href=url_for(clickTo) target='_blank')
.post-qr-code__desc=(item.itemlist||item).text img.post-qr-code-img(src=url_for(item.img) alt=item.text)
.post-qr-code-desc=item.text

View File

@@ -1,32 +1,60 @@
section#rightside.rightside - const { readmode, translate, darkmode, aside, chat_btn } = theme
mixin rightsideItem(array)
each item in array
case item
when 'readmode'
if is_post() && readmode
button#readmode(type="button" title=_p('rightside.readmode_title'))
i.fas.fa-book-open
when 'translate'
if translate.enable
button#translateLink(type="button" title=_p('rightside.translate_title'))= translate.default
when 'darkmode'
if darkmode.enable && darkmode.button
button#darkmode(type="button" title=_p('rightside.night_mode_title'))
i.fas.fa-adjust
when 'hideAside'
if aside.enable && aside.button && page.aside !== false
button#hide-aside-btn(type="button" title=_p('rightside.aside'))
i.fas.fa-arrows-alt-h
when 'toc'
if showToc
button#mobile-toc-button.close(type="button" title=_p("rightside.toc"))
i.fas.fa-list-ul
when 'chat'
if chat_btn
button#chat_btn(type="button" title=_p("rightside.chat"))
i.fas.fa-sms
when 'comment'
if commentsJsLoad
a#to_comment(href="#post-comment" title=_p("rightside.scroll_to_comment"))
i.fas.fa-comments
#rightside
- const { enable, hide, show } = theme.rightside_item_order
- const hideArray = enable ? hide && hide.split(',') : ['readmode','translate','darkmode','hideAside']
- const showArray = enable ? show && show.split(',') : ['toc','chat','comment']
#rightside-config-hide #rightside-config-hide
if is_post() if hideArray
if theme.readmode +rightsideItem(hideArray)
button#readmode(title=_p('rightside.readmode_title'))
i.fas.fa-book-open
button#font_plus(title=_p('rightside.font_plus_title'))
i.fas.fa-plus
button#font_minus(title=_p('rightside.font_minus_title'))
i.fas.fa-minus
if theme.translate && theme.translate.enable
button#translateLink.translate_chn_to_cht(title=_p('rightside.translate_title'))= theme.translate.default
if theme.darkmode.enable && theme.darkmode.button
button#darkmode(title=_p('rightside.night_mode_title'))
i.fas.fa-adjust
#rightside-config-show #rightside-config-show
button#rightside_config(title=_p("rightside.setting")) if enable
i.fas.fa-cog if hide
if is_post() && page.comments !== false && isComment button#rightside_config(type="button" title=_p("rightside.setting"))
a#to_comment(href="#post-comment" title=_p("rightside.scroll_to_comment")) i.fas.fa-cog.fa-spin
i.scroll_to_comment.fas.fa-comments else
if showToc if is_post()
button#mobile-toc-button.close(title=_p("rightside.toc")) if (readmode || translate.enable || (darkmode.enable && darkmode.button))
i.fas.fa-list-ul button#rightside_config(type="button" title=_p("rightside.setting"))
if theme.chat_btn && (theme.chatra.enable || theme.tidio.enable || theme.daovoice.enable || theme.gitter.enable) i.fas.fa-cog.fa-spin
button#chat_btn(title=_p("rightside.chat_btn")) else if translate.enable || (darkmode.enable && darkmode.button)
i.fas.fa-sms button#rightside_config(type="button" title=_p("rightside.setting"))
i.fas.fa-cog.fa-spin
button#go-up(title=_p("rightside.back_to_top"))
i.fas.fa-arrow-up
if showArray
+rightsideItem(showArray)
button#go-up(type="button" title=_p("rightside.back_to_top"))
i.fas.fa-arrow-up

View File

@@ -1,12 +0,0 @@
#algolia-search.search-dialog
#algolia-search-title.search-dialog__title Algolia
#algolia-input-panel
#algolia-search-input
hr
#algolia-search-results
#algolia-hits
#algolia-pagination
#algolia-stats
span.search-close-button
i.fas.fa-times
.search-mask

View File

@@ -1,5 +0,0 @@
if (theme.algolia_search.enable)
include ./algolia.pug
if (theme.local_search)
if (!theme.algolia_search.enable && theme.local_search.enable)
include ./local-search.pug

View File

@@ -1,23 +0,0 @@
#local-search.search-dialog
#local-search-title.search-dialog__title=_p("local_search.label")
#local-input-panel
#local-search-input
.local-search-box
input(placeholder=_p("local_search.input_placeholder") type="text").local-search-box--input
hr
#local-search-results
#local-hits
#local-stats
#hr.local-search-stats__hr
case config.language
when "zh-CN"
span=_p("local_search.by")
| #[a(href="https://github.com/wzpan/hexo-generator-search" style={'color': '#49B1F5'}) hexo-generator-search]
| #[span=_p("local_search.powered")]
when "en"
default
span=_p("local_search.powered_by")
| #[a(href="https://github.com/wzpan/hexo-generator-search" style={'color': '#49B1F5'}) hexo-generator-search]
span.search-close-button
i.fas.fa-times
.search-mask

View File

@@ -1,9 +0,0 @@
.addtoany
.a2a_kit.a2a_kit_size_32.a2a_default_style
each name in theme.addtoany.item
a(class="a2a_button_" + name)
a.a2a_dd(href="https://www.addtoany.com/share")
script(async src=url_for(theme.CDN.addtoany))

View File

@@ -1,7 +0,0 @@
.post_share
if theme.addThis.enable
include ./add-this.pug
else if theme.sharejs && theme.sharejs.enable
include ./share-js.pug
else if theme.addtoany.enable
include ./addtoany.pug

View File

@@ -1,4 +0,0 @@
if (theme.sharejs && theme.sharejs.enable)
.social-share(data-image=url_for(page.cover|| theme.avatar.img) data-sites= theme.sharejs.sites)
link(rel="stylesheet" href=url_for(theme.CDN.sharejs_css))
script(src=url_for(theme.CDN.sharejs))

View File

@@ -1,21 +1,18 @@
- #sidebar
let tocNumber = page.toc_number !== undefined ? page.toc_number : theme.toc.number #menu-mask
let autoOpenPostSet = page.auto_open == undefined ? theme.toc.auto_open : page.auto_open #sidebar-menus
let autoOpenSidebar = autoOpenPostSet ? 'on' : '' .avatar-img.is-center
- img(src=url_for(theme.avatar.img) onerror=`onerror=null;src='${theme.error_img.flink}'` alt="avatar")
.sidebar-site-data.site-data.is-center
a(href=url_for(config.archive_dir) + '/')
.headline= _p('aside.articles')
.length-num= site.posts.length
a(href=url_for(config.tag_dir) + '/' )
.headline= _p('aside.tags')
.length-num= site.tags.length
a(href=url_for(config.category_dir) + '/')
.headline= _p('aside.categories')
.length-num= site.categories.length
if(showToc) hr
i.fas.fa-arrow-right#toggle-sidebar(class=autoOpenSidebar) !=partial('includes/header/menu_item', {}, {cache: true})
#sidebar
.sidebar-toc
div.sidebar-toc__title= _p('sidebar.catalog')
div.sidebar-toc__progress
span.progress-notice= _p('sidebar.have_read')
span.progress-num 0
span.progress-percentage %
div.sidebar-toc__progress-bar
if (page.encrypt == true)
div.sidebar-toc__content.toc-div-class(style="display:none")!=toc(page.origin, {list_number: tocNumber})
else
div.sidebar-toc__content!=toc(page.content, {list_number: tocNumber})

View File

@@ -0,0 +1,3 @@
link(rel='stylesheet' href=url_for(theme.asset.aplayer_css) media="print" onload="this.media='all'")
script(src=url_for(theme.asset.aplayer_js))
script(src=url_for(theme.asset.meting_js))

View File

@@ -1 +0,0 @@
script#canvas_nest(color=theme.canvas_nest.color opacity=theme.canvas_nest.opacity zIndex=theme.canvas_nest.zIndex count=theme.canvas_nest.count mobile=`${theme.canvas_nest.mobile}` src=url_for(theme.CDN.canvas_nest))

View File

@@ -1 +0,0 @@
script(id="ribbon_piao" mobile=`${theme.canvas_ribbon_piao.mobile}` src=url_for(theme.CDN.canvas_ribbon_piao))

View File

@@ -1,3 +0,0 @@
script(defer id="ribbon" src=url_for(theme.CDN.canvas_ribbon) size=theme.canvas_ribbon.size
alpha=theme.canvas_ribbon.alpha zIndex=theme.canvas_ribbon.zIndex mobile=`${theme.canvas_ribbon.mobile}` data-click=`${theme.canvas_ribbon.click_to_change}`)

View File

@@ -0,0 +1,16 @@
script.
(() => {
const getCount = () => {
if (window.DISQUSWIDGETS === undefined) {
var d = document, s = d.createElement('script');
s.src = 'https://!{theme.disqus.shortname}.disqus.com/count.js';
s.id = 'dsq-count-scr';
(d.head || d.body).appendChild(s);
} else {
DISQUSWIDGETS.getCount({reset: true});
}
}
window.pjax ? getCount() : window.addEventListener('load', getCount)
})()

View File

@@ -0,0 +1,15 @@
script.
(()=>{
function loadFBComment () {
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('async', 'true')
ele.setAttribute('defer', 'true')
ele.setAttribute('crossorigin', 'anonymous')
document.body.appendChild(ele)
}
}
window.pjax ? loadFBComment() : window.addEventListener('load', loadFBComment)
})()

View File

@@ -0,0 +1,14 @@
case theme.comments.use[0]
when 'Twikoo'
include ./twikoo.pug
when 'Disqus'
when 'Disqusjs'
include ./disqus.pug
when 'Valine'
include ./valine.pug
when 'Waline'
include ./waline.pug
when 'Facebook Comments'
include ./fb.pug
when 'Remark42'
include ./remark42.pug

View File

@@ -0,0 +1,18 @@
- const { host, siteId, option } = theme.remark42
script.
(()=>{
window.remark_config = Object.assign({
host: '!{host}',
site_id: '!{siteId}',
},!{JSON.stringify(option)})
function getCount () {
const s = document.createElement('script')
s.src = remark_config.host + '/web/counter.js'
s.defer = true
document.head.appendChild(s)
}
window.pjax ? getCount() : window.addEventListener('load', getCount)
})()

View File

@@ -0,0 +1,37 @@
script.
(() => {
const getCommentUrl = () => {
const eleGroup = document.querySelectorAll('#recent-posts .article-title')
let urlArray = []
eleGroup.forEach(i=>{
urlArray.push(i.getAttribute('href'))
})
return urlArray
}
const getCount = () => {
const runTwikoo = () => {
twikoo.getCommentsCount({
envId: '!{theme.twikoo.envId}',
region: '!{theme.twikoo.region}',
urls: getCommentUrl(),
includeReply: false
}).then(function (res) {
document.querySelectorAll('#recent-posts .twikoo-count').forEach((item,index) => {
item.innerText = res[index].count
})
}).catch(function (err) {
console.log(err)
})
}
if (typeof twikoo === 'object') {
runTwikoo()
} else {
getScript('!{url_for(theme.asset.twikoo)}').then(runTwikoo)
}
}
window.pjax ? getCount() : window.addEventListener('load', getCount)
})()

View File

@@ -0,0 +1,20 @@
script.
(() => {
function loadValine () {
function initValine () {
let initData = {
el: '#vcomment',
appId: '#{theme.valine.appId}',
appKey: '#{theme.valine.appKey}',
serverURLs: '#{theme.valine.serverURLs}'
}
const valine = new Valine(initData)
}
if (typeof Valine === 'function') initValine()
else getScript('!{url_for(theme.asset.valine)}').then(initValine)
}
window.pjax ? loadValine() : window.addEventListener('load', loadValine)
})()

View File

@@ -0,0 +1,18 @@
script.
(() => {
function loadWaline () {
function initWaline () {
let initData = {
el: null,
serverURL: '!{theme.waline.serverURL}',
comment: true
}
const waline = Waline.init(initData)
}
if (typeof Waline === 'function') initWaline()
else getScript('!{url_for(theme.asset.waline_js)}').then(initWaline)
}
window.pjax ? loadWaline() : window.addEventListener('load', loadWaline)
})()

View File

@@ -12,10 +12,13 @@ script.
})(document, window, 'Chatra'); })(document, window, 'Chatra');
if (!{theme.chat_btn}) { if (!{theme.chat_btn}) {
var chatBtn = document.getElementById("chat_btn") var chatBtnFn = () => {
var chatBtn = document.getElementById("chat_btn")
chatBtn.addEventListener("click", function(){ chatBtn.addEventListener("click", function(){
Chatra('openChat') Chatra('openChat')
}); });
}
chatBtnFn()
} else { } else {
if (!{theme.chat_hide_show}) { if (!{theme.chat_hide_show}) {
function chatBtnHide () { function chatBtnHide () {

View File

@@ -0,0 +1,36 @@
script.
window.$crisp = [];
window.CRISP_WEBSITE_ID = "!{theme.crisp.website_id}";
(function () {
d = document;
s = d.createElement("script");
s.src = "https://client.crisp.chat/l.js";
s.async = 1;
d.getElementsByTagName("head")[0].appendChild(s);
})();
$crisp.push(["safe", true])
if (!{theme.chat_btn}) {
$crisp.push(["do", "chat:hide"])
$crisp.push(["on", "chat:closed", function() {
$crisp.push(["do", "chat:hide"])
}])
var chatBtnFn = () => {
var chatBtn = document.getElementById("chat_btn")
chatBtn.addEventListener("click", function(){
$crisp.push(["do", "chat:show"])
$crisp.push(["do", "chat:open"])
});
}
chatBtnFn()
} else {
if (!{theme.chat_hide_show}) {
function chatBtnHide () {
$crisp.push(["do", "chat:hide"])
}
function chatBtnShow () {
$crisp.push(["do", "chat:show"])
}
}
}

View File

@@ -13,10 +13,13 @@ script.
daovoice('update'); daovoice('update');
if (isChatBtn) { if (isChatBtn) {
var chatBtn = document.getElementById("chat_btn") var chatBtnFn = () => {
chatBtn.addEventListener("click", function(){ var chatBtn = document.getElementById("chat_btn")
daovoice('show') chatBtn.addEventListener("click", function(){
}); daovoice('show')
});
}
chatBtnFn()
} else { } else {
if (!{theme.chat_hide_show}) { if (!{theme.chat_hide_show}) {
function chatBtnHide () { function chatBtnHide () {

View File

@@ -0,0 +1,43 @@
if theme.chat_btn
script.
((window.gitter = {}).chat = {}).options = {
disableDefaultChat: true,
};
document.addEventListener('gitter-sidecar-ready', (e) => {
const GitterChat = e.detail.Chat
let chat
function initGitter () {
chat = new GitterChat({
room: '#{theme.gitter.room}',
activationElement: '#chat_btn'
});
}
initGitter()
if (!{theme.pjax.enable}) {
document.addEventListener('pjax:complete', () => {
chat.destroy()
initGitter()
})
}
})
else
script.
((window.gitter = {}).chat = {}).options = {
room: '#{theme.gitter.room}',
};
if (!{theme.chat_hide_show}) {
function chatBtnHide () {
document.getElementsByClassName('gitter-open-chat-button')[0].style.display= 'none'
}
function chatBtnShow () {
document.getElementsByClassName('gitter-open-chat-button')[0].style.display= 'block'
}
}
script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer)

View File

@@ -5,4 +5,6 @@ else if theme.tidio && theme.tidio.enable
else if theme.daovoice && theme.daovoice.enable else if theme.daovoice && theme.daovoice.enable
include ./daovoice.pug include ./daovoice.pug
else if theme.gitter && theme.gitter.enable else if theme.gitter && theme.gitter.enable
include ./gitter.pug include ./gitter.pug
else if theme.crisp && theme.crisp.enable
include ./crisp.pug

View File

@@ -0,0 +1,41 @@
script(src=`//code.tidio.co/${theme.tidio.public_key}.js` async)
if theme.chat_btn
script.
function onTidioChatApiReady() {
window.tidioChatApi.hide();
window.tidioChatApi.on("close", function() {
window.tidioChatApi.hide();
});
}
if (window.tidioChatApi) {
window.tidioChatApi.on("ready", onTidioChatApiReady);
} else {
document.addEventListener("tidioChat-ready", onTidioChatApiReady);
}
var chatBtnFn = () => {
document.getElementById("chat_btn").addEventListener("click", function(){
window.tidioChatApi.show();
window.tidioChatApi.open();
});
}
chatBtnFn()
else if theme.chat_hide_show
script.
function chatBtnHide () {
if (window.tidioChatApi) {
//- window.tidioChatApi.hide();
document.getElementById('tidio-chat').style.display= 'none'
}
}
function chatBtnShow () {
if (window.tidioChatApi) {
//- window.tidioChatApi.show();
document.getElementById('tidio-chat').style.display= 'block'
}
}

View File

@@ -0,0 +1,51 @@
- let disqusPageTitle = page.title.replace(/'/ig,"\\'")
script.
function loadDisqus () {
var disqus_config = function () {
this.page.url = '!{ page.permalink }'
this.page.identifier = '!{ url_for(page.path) }'
this.page.title = '!{ disqusPageTitle }'
};
window.disqusReset = () => {
DISQUS.reset({
reload: true,
config: disqus_config
})
}
if (window.DISQUS) disqusReset()
else {
(function() {
var d = document, s = d.createElement('script');
s.src = 'https://!{theme.disqus.shortname}.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
}
document.getElementById('darkmode').addEventListener('click', () => {
setTimeout(() => window.disqusReset(), 200)
})
}
if ('!{theme.comments.use[0]}' === 'Disqus' || !!{theme.comments.lazyload}) {
if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('disqus_thread'), loadDisqus)
else loadDisqus()
} else {
function loadOtherComment () {
loadDisqus()
}
}
if is_post() && !theme.comments.lazyload && theme.comments.count && theme.comments.use[0] === 'Disqus'
script.
if (window.DISQUSWIDGETS === undefined) {
var d = document, s = d.createElement('script');
s.src = 'https://!{theme.disqus.shortname}.disqus.com/count.js';
s.id = 'dsq-count-scr';
(d.head || d.body).appendChild(s);
} else {
DISQUSWIDGETS.getCount({reset: true});
}

View File

@@ -0,0 +1,64 @@
- let disqusjsPageTitle = page.title.replace(/'/ig,"\\'")
script.
function loadDisqusjs () {
function addDisqusjsCSS () {
const ele = document.createElement('link')
ele.rel = 'stylesheet'
ele.href= '!{url_for(theme.asset.disqusjs_css)}'
document.getElementsByTagName('head')[0].appendChild(ele)
}
function initDisqusjs () {
window.disqusjs = null
disqusjs = new DisqusJS(Object.assign({
shortname: '!{theme.disqusjs.shortname}',
identifier: '!{ url_for(page.path) }',
url: '!{ page.permalink }',
title: '!{ disqusjsPageTitle }',
apikey: '!{theme.disqusjs.apikey}',
},!{JSON.stringify(theme.disqusjs.option)}))
disqusjs.render(document.getElementById('disqusjs'))
}
const themeChange = () => {
const ele = document.getElementById('disqus_thread')
if(!ele) return
disqusjs.destroy()
initDisqusjs()
}
document.getElementById('darkmode').addEventListener('click', themeChange)
if (window.disqusJsLoad) initDisqusjs()
else {
addDisqusjsCSS()
getScript('!{url_for(theme.asset.disqusjs)}').then(initDisqusjs)
window.disqusJsLoad = true
}
}
if ('!{theme.comments.use[0]}' === 'Disqusjs' || !!{theme.comments.lazyload}) {
if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('disqusjs'), loadDisqusjs)
else loadDisqusjs()
}
else {
function loadOtherComment () {
loadDisqusjs()
}
}
if is_post() && !theme.comments.lazyload && theme.comments.count && theme.comments.use[0] === 'Disqusjs'
script.
if (window.DISQUSWIDGETS === undefined) {
var d = document, s = d.createElement('script');
s.src = 'https://!{theme.disqus.shortname}.disqus.com/count.js';
s.id = 'dsq-count-scr';
(d.head || d.body).appendChild(s);
} else {
DISQUSWIDGETS.getCount({reset: true});
}

View File

@@ -0,0 +1,26 @@
#fb-root
script.
function loadFBComment () {
var themeNow = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'
document.getElementsByClassName('fb-comments')[0].setAttribute('data-colorscheme',themeNow)
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=v13.0&appId=!{theme.facebook_comments.app_id}&autoLogAppEvents=1')
ele.setAttribute('async', 'true')
ele.setAttribute('defer', 'true')
ele.setAttribute('crossorigin', 'anonymous')
document.getElementById('fb-root').insertAdjacentElement('afterbegin',ele)
}
}
if ('!{theme.comments.use[0]}' === 'Facebook Comments' || !!{theme.comments.lazyload}) {
if (!{theme.comments.lazyload}) btf.loadComment(document.querySelector('#post-comment .fb-comments'), loadFBComment)
else loadFBComment()
} else {
function loadOtherComment () {
loadFBComment()
}
}

View File

@@ -0,0 +1,49 @@
- const { repo, repo_id, category_id, option } = theme.giscus
- const themes = theme.giscus.theme
script.
function loadGiscus () {
let nowTheme = document.documentElement.getAttribute('data-theme') === 'dark' ? '!{themes.dark}' : '!{themes.light}'
const config = Object.assign({
src: 'https://giscus.app/client.js',
'data-repo': '!{repo}',
'data-repo-id': '!{repo_id}',
'data-category-id': '!{category_id}',
'data-mapping': 'pathname',
'data-theme': nowTheme,
'data-reactions-enabled': '1',
crossorigin: 'anonymous',
async: true
},!{JSON.stringify(option)})
let ele = document.createElement('script')
for (let key in config) {
ele.setAttribute(key, config[key])
}
document.getElementById('giscus-wrap').insertAdjacentElement('afterbegin',ele)
}
function changeGiscusTheme () {
const theme = document.documentElement.getAttribute('data-theme') === 'dark' ? '!{themes.dark}' : '!{themes.light}'
function sendMessage(message) {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: theme
}
});
}
if ('!{theme.comments.use[0]}' === 'Giscus' || !!{theme.comments.lazyload}) {
if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('giscus-wrap'), loadGiscus)
else loadGiscus()
} else {
function loadOtherComment () {
loadGiscus()
}
}

View File

@@ -0,0 +1,48 @@
script.
function addGitalkSource () {
const ele = document.createElement('link')
ele.rel = 'stylesheet'
ele.href= '!{url_for(theme.asset.gitalk_css)}'
document.getElementsByTagName('head')[0].appendChild(ele)
}
function loadGitalk () {
function initGitalk () {
var gitalk = new Gitalk(Object.assign({
clientID: '!{theme.gitalk.client_id}',
clientSecret: '!{theme.gitalk.client_secret}',
repo: '!{theme.gitalk.repo}',
owner: '!{theme.gitalk.owner}',
admin: ['!{theme.gitalk.admin}'],
id: '!{md5(page.path)}',
updateCountCallback: commentCount
},!{JSON.stringify(theme.gitalk.option)}))
gitalk.render('gitalk-container')
}
if (typeof Gitalk === 'function') initGitalk()
else {
addGitalkSource()
getScript('!{url_for(theme.asset.gitalk)}').then(initGitalk)
}
}
function commentCount(n){
let isCommentCount = document.querySelector('#post-meta .gitalk-comment-count')
if (isCommentCount) {
isCommentCount.innerHTML= n
}
}
if ('!{theme.comments.use[0]}' === 'Gitalk' || !!{theme.comments.lazyload}) {
if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('gitalk-container'), loadGitalk)
else loadGitalk()
} else {
function loadOtherComment () {
loadGitalk()
}
}

View File

@@ -0,0 +1,44 @@
- let defaultComment = theme.comments.use[0]
hr
#post-comment
.comment-head
.comment-headline
i.fas.fa-comments.fa-fw
span= ' ' + _p('comment')
if theme.comments.use.length > 1
#comment-switch
span.first-comment=defaultComment
span.switch-btn
span.second-comment=theme.comments.use[1]
.comment-wrap
each name in theme.comments.use
div
case name
when 'Disqus'
#disqus_thread
when 'Valine'
#vcomment.vcomment
when 'Disqusjs'
#disqusjs
when 'Livere'
#lv-container(data-id="city" data-uid=theme.livere.uid)
when 'Gitalk'
#gitalk-container
when 'Utterances'
#utterances-wrap
when 'Twikoo'
#twikoo-wrap
when 'Waline'
#waline-wrap
when 'Giscus'
#giscus-wrap
when 'Facebook Comments'
.fb-comments(data-colorscheme = theme.display_mode === 'dark' ? 'dark' : 'light'
data-numposts= theme.facebook_comments.pageSize || 10
data-order-by= theme.facebook_comments.order_by || 'social'
data-width="100%")
when 'Remark42'
#remark42

View File

@@ -0,0 +1,24 @@
each name in theme.comments.use
case name
when 'Valine'
!=partial('includes/third-party/comments/valine', {}, {cache: true})
when 'Disqus'
include ./disqus.pug
when 'Disqusjs'
include ./disqusjs.pug
when 'Livere'
!=partial('includes/third-party/comments/livere', {}, {cache: true})
when 'Gitalk'
include ./gitalk.pug
when 'Utterances'
!=partial('includes/third-party/comments/utterances', {}, {cache: true})
when 'Twikoo'
!=partial('includes/third-party/comments/twikoo', {}, {cache: true})
when 'Waline'
!=partial('includes/third-party/comments/waline', {}, {cache: true})
when 'Giscus'
!=partial('includes/third-party/comments/giscus', {}, {cache: true})
when 'Facebook Comments'
!=partial('includes/third-party/comments/facebook_comments', {}, {cache: true})
when 'Remark42'
!=partial('includes/third-party/comments/remark42', {}, {cache: true})

View File

@@ -0,0 +1,26 @@
script.
function loadLivere () {
if (typeof LivereTower === 'object') {
window.LivereTower.init()
}
else {
(function(d, s) {
var j, e = d.getElementsByTagName(s)[0];
if (typeof LivereTower === 'function') { return; }
j = d.createElement(s);
j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
j.async = true;
e.parentNode.insertBefore(j, e);
})(document, 'script');
}
}
if ('!{theme.comments.use[0]}' === 'Livere' || !!{theme.comments.lazyload}) {
if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('lv-container'), loadLivere)
else loadLivere()
}
else {
function loadOtherComment () {
loadLivere()
}
}

View File

@@ -0,0 +1,67 @@
- const { host, siteId, option } = theme.remark42
script.
var remark_config = Object.assign({
host: '!{host}',
site_id: '!{siteId}',
components: ['embed'],
theme: document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'
},!{JSON.stringify(option)})
function addRemark42(){
for (let i = 0; i < remark_config.components.length; i++) {
const s = document.createElement('script')
s.src = remark_config.host + '/web/' + remark_config.components[i] + '.js'
s.defer = true
document.head.appendChild(s)
}
}
function initRemark42() {
if (window.REMARK42) {
if (this.remark42Instance) {
this.remark42Instance.destroy()
}
this.remark42Instance = window.REMARK42.createInstance({
...remark_config
})
}
}
function getCount () {
const ele = document.querySelector('.remark42__counter')
if (ele) {
const s = document.createElement('script')
s.src = remark_config.host + '/web/counter.js'
s.defer = true
document.head.appendChild(s)
}
}
function loadRemark42 () {
if (window.REMARK42) {
this.initRemark42()
getCount()
} else {
addRemark42()
window.addEventListener('REMARK42::ready', () => {
this.initRemark42()
getCount()
})
}
}
document.getElementById('darkmode').addEventListener('click',()=>{
if (!window.REMARK42) return
let theme = document.documentElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark'
window.REMARK42.changeTheme(theme)
})
if ('!{theme.comments.use[0]}' === 'Remark42' || !!{theme.comments.lazyload}) {
if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('remark42'), loadRemark42)
else loadRemark42()
} else {
function loadOtherComment () {
loadRemark42()
}
}

View File

@@ -0,0 +1,53 @@
- const { envId, region, option } = theme.twikoo
- const { use, lazyload, count } = theme.comments
script.
(()=>{
const init = () => {
twikoo.init(Object.assign({
el: '#twikoo-wrap',
envId: '!{envId}',
region: '!{region}',
onCommentLoaded: function () {
btf.loadLightbox(document.querySelectorAll('#twikoo .tk-content img:not(.tk-owo-emotion)'))
}
}, !{JSON.stringify(option)}))
}
const getCount = () => {
const countELement = document.getElementById('twikoo-count')
if(!countELement) return
twikoo.getCommentsCount({
envId: '!{envId}',
region: '!{region}',
urls: [window.location.pathname],
includeReply: false
}).then(function (res) {
countELement.innerText = res[0].count
}).catch(function (err) {
console.error(err);
});
}
const runFn = () => {
init()
!{count ? 'GLOBAL_CONFIG_SITE.isPost && getCount()' : ''}
}
const loadTwikoo = () => {
if (typeof twikoo === 'object') {
setTimeout(runFn,0)
return
}
getScript('!{url_for(theme.asset.twikoo)}').then(runFn)
}
if ('!{use[0]}' === 'Twikoo' || !!{lazyload}) {
if (!{lazyload}) btf.loadComment(document.getElementById('twikoo-wrap'), loadTwikoo)
else loadTwikoo()
} else {
window.loadOtherComment = () => {
loadTwikoo()
}
}
})()

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