Add solitude

This commit is contained in:
IF-chan
2024-07-05 21:01:19 +08:00
parent 26d71c4fbc
commit 71758b9fce
289 changed files with 23277 additions and 0 deletions
+13
View File
@@ -0,0 +1,13 @@
# These are supported funding model platforms
github: [everfu] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: everfu # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: ['https://afdian.net/a/everfu', 'https://s3.qjqq.cn/47/66374315ebd08.webp!color', 'https://s3.qjqq.cn/47/663742bac8e52.webp!color'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
+108
View File
@@ -0,0 +1,108 @@
name: Bug 报告 🐛
description: 本项目仅对最新版本进行维护,使用老版本出现问题的,请先升级到最新版本或使用dev版本,升级完后如果发现bug依然存在,请继续填写此issue。
labels: ['status: needs check']
title: "[Bug]: "
body:
- type: markdown
attributes:
value: |
### ⚠️ 前置确认
1. 请确保阅读过本主题GitHub项目说明
2. 查询主题使用文档的相关内容和正确配置
3. 使用的是Solitude主题最新版本
4. 执行`npm ls -dept 0`检查是否已安装对应插件
5. [FAQS](https://solitude-docs.efu.me/faq) 中无类似问题
- type: checkboxes
attributes:
label: 前置确认
options:
- label: 我确认我运行的是最新版本的主题,并且安装了所需的依赖,在[FAQS](https://solitude-docs.efu.me/faq)中也未找到类似问题。
required: true
- type: checkboxes
attributes:
label: ⚠️ 搜索issues中是否已存在类似问题
description: >
请在 [历史issue](https://github.com/valor-x/hexo-theme-solitude/issues) 中清空输入框,搜索你的问题
或相关日志的关键词来查找是否存在类似问题。
options:
- label: 我已经搜索过issues和disscussions,没有跟我遇到的问题相关的issue
required: true
- type: markdown
attributes:
value: |
请在上方的`title`中填写你对你所遇到问题的简略总结,这将帮助其他人更好的找到相似问题,谢谢❤️。
- type: dropdown
attributes:
label: 操作系统类型?
description: >
请选择你运行程序的操作系统类型。
options:
- Windows
- Mac/Linux
validations:
required: true
- type: dropdown
attributes:
label: 运行的Hexo版本是?
description: |
请选择你运行的`Hexo`版本。
注意:在`Hexo 7.0+`版本中,Node的最低支持的版本为:14.0.0。
你可以前往 [Node.js 版本限制](https://hexo.io/zh-cn/docs/#Node-js-%E7%89%88%E6%9C%AC%E9%99%90%E5%88%B6)进行查看详情。
options:
- Hexo 7.0.0
- Hexo 6.3.0及以下
validations:
required: true
- type: dropdown
attributes:
label: 你所使用的主题版本是稳定/最新?
description: |
**注意:新手小白推荐使用稳定版本(main分支)。**
具有一定的排错能力且具备开发知识的同学可以尝试使用开发版(dev分支)进行体验。
options:
- 稳定版(main)
- 开发板 (dev)
validations:
required: true
- type: textarea
attributes:
label: 问题描述 😯
description: 详细描述出现的问题,或提供有关截图。
placeholder: "e.g., 我在...出现..."
- type: textarea
attributes:
label: 终端日志 📒
description: |
在此处粘贴终端运行日志,这会帮助我们更好的分析问题。
建议使用`hexo s -debug`进行调试输出,打印出的日志会更有帮助。
<details>
<summary><i>示例</i></summary>
ERROR Process failed: layout/index.pug
Error: ENOENT: no such file or directory, open 'E:\OC\Desktop\iCat\Solitude\themes\solitude\layout\includes\widgets\home\bbTimeList.pug'
at E:\OC\Desktop\iCat\Solitude\themes\solitude\layout\index.pug line 6
at Object.openSync (node:fs:590:3)
at Object.readFileSync (node:fs:458:35)
at Function.read (E:\OC\Desktop\iCat\Solitude\node_modules\pug-load\index.js:85:13)
at Object.read (E:\OC\Desktop\iCat\Solitude\node_modules\pug\lib\index.js:164:25)
at E:\OC\Desktop\iCat\Solitude\node_modules\pug-load\index.js:28:25
at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:26:18)
at E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:112:20
at Array.reduce (<anonymous>)
at walkAndMergeNodes (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:111:18)
at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:40:19)
at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:69:26)
at E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:112:20
at Array.reduce (<anonymous>)
at walkAndMergeNodes (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:111:18)
at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:40:19)
at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:51:21)
at E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:112:20
at Array.reduce (<anonymous>)
at walkAndMergeNodes (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:111:18)
at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:40:19)
at E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:112:20
at Array.reduce (<anonymous>)
INFO Hexo is running at http://localhost:4000/ . Press Ctrl+C to stop.
</details>
placeholder: "e.g., <此处粘贴终端日志>"
+21
View File
@@ -0,0 +1,21 @@
blank_issues_enabled: false
contact_links:
- name: 关于主题使用问题
url: https://github.com/valor-x/hexo-theme-solitude/discussions
about: 一些使用上碰到的问题 Discussion 询问。 Please ask questions in Discussion.
- name: Solitude Q&A
url: https://docs.efu.me/faq
about: Solitude Q&A
- name: QQ群
url: https://qm.qq.com/q/mxfomMvJPG
about: 新建立的QQ群
- name: Discord
url: https://discord.gg/Y8VEvVgW
about: 'Official Discord Group'
- name: Telegram
url: https://t.me/solitudePro
about: 'Official Telegram Group'
@@ -0,0 +1,48 @@
name: 功能新增✨
description: 为这个项目提出一个想法
title: "[Feature]: "
labels: ["增强"]
body:
- type: markdown
attributes:
value: "感谢你抽出宝贵时间提出新功能建议!"
- type: input
id: feature_summary
attributes:
label: 功能简介
description: 对功能的清晰简明的描述。
placeholder: "e.g., 我想要..."
validations:
required: true
- type: textarea
id: feature_motivation
attributes:
label: 问题描述
description: 对问题是什么进行清晰简洁的描述。
placeholder: "e.g., 我在...需要..."
validations:
required: true
- type: textarea
id: feature_description
attributes:
label: 实现效果
description: 清晰简洁地描述您想要发生的事情。
placeholder: "e.g., 这个功能实现...的效果"
validations:
required: true
- type: textarea
id: feature_alternatives
attributes:
label: 你想到的可行的替代方案
description: 对你考虑过的任何替代解决方案或功能进行清晰简洁的描述。
placeholder: "e.g., 解决这个问题的一种方法是..."
validations:
required: false
- type: textarea
id: additional_context
attributes:
label: 其他内容
description: 在此处添加有关功能请求的任何其他上下文或屏幕截图。
placeholder: "在这里添加屏幕截图或着文字内容..."
validations:
required: false
+35
View File
@@ -0,0 +1,35 @@
<!---
☝️ PR title should follow conventional commits (https://conventionalcommits.org)
Please carefully read the contribution docs before creating a pull request
👉 https://github.com/valor-x/hexo-theme-solitude/blob/main/CONTRIBUTING.md
-->
### 🔗 链接 issue
<!-- 请确保存在未解决的问题,将编号提及为 #123(示例) -->
### ❓ 修改类型
<!--代码引入了哪些类型的更改?在所有适用的框中放置一个“x”。 -->
- [ ] 🐞 Bug fix (修复问题的连续性改)
- [ ] 👌 增强功能(改进现有功能,如性能)
- [ ] ✨ Feature(添加功能的连续性修改)
- [ ] ⚠️ 中断修改(重大的修改,如配置文件调整、模块移除)
### 📚 描述
<!-- 详细说明你的更改 -->
<!-- 为什么需要此更改?它解决了什么问题?-->
<!-- 如果它解决了未解决的问题,请在此处链接到该问题。例如,“Resolves #1337” -->
### 📝 清单
<!-- 在所有适用的框中放置一个“x”。 -->
<!-- 如果更改需要文档 PR,请适当地链接它 -->
<!-- 如果不确定其中任何一个,请随时询问。我们是来帮忙的! -->
- [ ] 我已链接问题或讨论。
- [ ] 我已经添加了测试(如果可能的话)。
- [ ] 我已相应地更新了[文档](https://github.com/efuo/theme-solitude-docs)。
+23
View File
@@ -0,0 +1,23 @@
<svg width="500px" height="500px" viewBox="0 0 500 500" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<radialGradient cx="50.2980052%" cy="50%" fx="50.2980052%" fy="50%" r="49.7019948%" id="radialGradient-1">
<stop stop-color="#59A2EF" offset="0%"></stop>
<stop stop-color="#1588FF" stop-opacity="0.265264551" offset="74.3273328%"></stop>
<stop stop-color="#153C92" stop-opacity="0" offset="100%"></stop>
</radialGradient>
</defs>
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g>
<rect id="rectangle" fill="url(#radialGradient-1)" x="0" y="0" width="500" height="500" rx="250"></rect>
<g id="group" transform="translate(167, 59)" fill="#000000" fill-rule="nonzero">
<path d="M41.451978,366.819156 C63.2265115,314.167618 167.050853,309.635807 118.99746,228.707504 C153.639423,313.979396 6.78825531,314.963943 26.3287594,382 C12.5619158,361.643046 18.1905094,334.473897 37.7672802,320.255882 C54.8416479,307.145482 77.6751693,304.944731 94.4956701,291.066964 C124.038533,271.079215 120.593196,234.976751 96.7006861,211.861618 C96.0188719,211.181122 95.003404,210.544062 94.0822296,210.449951 C86.4807269,209.660866 78.8719708,208.915216 71.2487081,208.328832 C57.1699707,207.250174 43.5046739,208.806627 30.7315382,215.314771 C27.2426805,217.088403 23.7393162,218.348044 19.8007514,216.943617 C24.2397968,216.06042 28.6425756,215.162745 32.3272735,212.411806 C32.2692467,212.180148 32.2184733,211.948489 32.1604466,211.716831 C29.7523369,212.107754 27.6996411,213.041626 25.1537179,212.940276 C38.187974,204.006961 24.0149432,203.340944 16,204.796046 C43.9108611,184.243631 36.1280248,151.550884 84.6746446,161.273284 C101.270292,126.502854 113.695267,142.798552 133.649212,122 C130.261901,131.816511 125.583495,141.205903 121.347543,150.718363 C116.879484,161.895865 106.790085,163.495754 96.4178058,166.029514 C100.102504,164.921899 101.545919,167.404984 103.352001,169.641932 C129.057846,200.039816 157.962415,234.0284 155.895212,276.356675 C147.234722,323.376027 66.3744621,327.364889 41.451978,366.819156 L41.451978,366.819156 Z M71.3937749,171.88612 C61.1157889,177.641375 44.7957688,175.672282 47.1893718,192.474732 C52.5858584,180.23305 59.8754674,195.001253 71.3937749,171.88612 L71.3937749,171.88612 Z"></path>
<path d="M75.3032249,211.025533 C106.026327,209.673873 112.009852,262.374155 89.125744,277.126764 C55.0225258,300.451933 -10.1418056,326.335859 20.1569835,378.551856 C19.9915736,378.703647 19.8333554,378.848209 19.6679454,379 C-9.82536916,354.648437 3.54407043,308.728139 30.8798638,288.53275 C55.238278,268.041007 100.157869,249.385209 75.3032249,211.025533 Z"></path>
<path d="M131.122758,44.5611246 C140.518488,52.0520972 149.271959,60.2108697 155.377019,71.2803786 C171.087083,44.8006616 152.086349,16.9853448 131.534092,0 C163.329472,16.2086645 181.738463,59.2744981 151.913155,88.0552212 C133.150561,109.533698 83.0400028,127.861901 83.0688683,158 L70,158 C71.5587386,126.468232 104.321114,124.885836 92.9625284,113.344512 C85.81831,103.066201 82.6791837,91.7426379 83.3503072,78.4810034 C93.2511837,128.333716 119.56933,105.577709 144.877183,81.9216245 C153.58014,70.1480222 137.732964,54.0337208 131.122758,44.5683833 L131.122758,44.5611246 Z"></path>
<path d="M62.2292659,56 C43.1451334,63.2999022 18.3176548,75.3501886 23.7278434,99.6686688 C30.7965771,99.1456907 37.8363406,98.6299763 44.876104,98.1069982 C44.9195594,98.4120687 44.9702573,98.7098757 45.0137126,99.0149462 C19.0853656,102.879173 29.4711895,111.580947 43.5145037,123.362481 C55.1822598,131.44685 65.3290794,100.736416 71,93.4946222 C67.581514,101.470038 64.1123302,109.423663 60.7735123,117.428132 C58.0503116,124.916888 53.6395956,131.149043 60.9400911,137.555525 C65.7491476,143.279229 67.4946034,149.874563 66.5313436,157.399637 C62.9680065,158.25674 59.3322439,159.12837 55.6747536,160 C60.3462016,135.11496 44.3763678,137.097919 29.5001597,123.34069 C-1.69352472,93.7706384 26.1903121,58.760162 62.2292659,56 Z"></path>
<path d="M0.00732087227,143 C17.3943925,162.502948 36.3115265,145.13458 47,164.110998 C41.5898754,167.604594 37.7903427,172.386054 35.1401869,178 C21.3476636,175.47408 8.91682243,161.400081 0,143.007115 L0.00732087227,143 Z"></path>
<path d="M29,207.557191 C25.5771332,208.185531 23.8692728,211.545785 20.9966372,212.980039 C16.6591005,213.184933 12.6502732,211.853125 12,207.092765 C17.6309374,206.703468 22.740227,206.355149 27.8495166,206 L29,207.550361 L29,207.557191 Z"></path>
<path d="M66,177 C60.2942272,179.492077 52.7486034,178.10342 50,186 C56.264432,184.566305 62.8193669,184.123436 66,177 Z"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

@@ -0,0 +1,25 @@
name: Close need info
on:
schedule:
- cron: "0 0 */1 * *"
workflow_dispatch:
jobs:
close-need-info:
runs-on: ubuntu-latest
steps:
- name: close-issues
uses: actions-cool/issues-helper@v3
with:
actions: "close-issues"
token: ${{ secrets.GITHUB_TOKEN }}
labels: "question"
inactive-day: 60
close-reason: "not_planned"
body: |
Hi there! This issue has been automatically closed because it has not had any activity for 60 days. We label issues as "questions" in hopes of community or maintainer input, and it seems this issue has gone stale.
If you still need assistance or believe this closure is a mistake, please feel free to reopen the issue or create a new one with updated details. We're here to help!
Thank you for your contributions to our project!
+18
View File
@@ -0,0 +1,18 @@
name: Issue Invalid
on:
issues:
types: [labeled]
jobs:
lock-issue:
runs-on: ubuntu-latest
if: github.event.label.name == 'invalid'
steps:
- name: Lock issue
uses: actions-cool/issues-helper@v2
with:
actions: "lock-issue"
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
lock-reason: "off-topic"
+30
View File
@@ -0,0 +1,30 @@
name: Issue Question
on:
issues:
types: [labeled]
jobs:
create-comment:
runs-on: ubuntu-latest
if: github.event.label.name == 'question'
steps:
- name: Create comment
uses: actions-cool/issues-helper@v2.0.0
with:
actions: "create-comment"
token: ${{ secrets.ISSUSE_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: |
Hello! 👋
Thank you for submitting your question. To ensure we can provide the best answer possible, could you please confirm you've provided the following details:
- A clear and concise description of your question.
- Any relevant code snippets or links to your project.
- What you've tried so far in attempting to solve your issue.
In the meantime, you might find the answer to your question in our [FAQs](https://solitude-docs.efu.me/faq) or [documentation](https://solitude-docs.efu.me/).
We aim to respond to questions within 48 hours. If your question is urgent, please consider reaching out through our support channels.
Thanks again for reaching out, and we look forward to assisting you!
+29
View File
@@ -0,0 +1,29 @@
name: Issue Wontfix
on:
issues:
types: [labeled]
jobs:
handle-wontfix:
runs-on: ubuntu-latest
if: github.event.label.name == 'wontfix'
steps:
- name: Create comment for wontfix
uses: actions-cool/issues-helper@v3
with:
actions: "create-comment"
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: |
Hi there! This issue has been marked as 'wontfix'. It means we've reviewed the issue but have chosen not to pursue it for reasons that may vary (e.g., aligning with the project's current priorities, outside of project scope, etc.).
We understand this might not be the outcome you were hoping for. If you believe this decision should be reconsidered, please provide any additional context or reasoning that was not previously considered.
Thank you for your understanding and for contributing to the project. Your efforts are greatly appreciated!
- name: Close issue after wontfix
uses: actions-cool/issues-helper@v3
with:
actions: "close-issue"
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
+20
View File
@@ -0,0 +1,20 @@
name: Node.js Package
on:
release:
types: [created]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
token: ${{ secrets.ACCESS_TOKEN }}
- uses: actions/setup-node@v2
with:
node-version: '14'
registry-url: 'https://registry.npmjs.org'
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+19
View File
@@ -0,0 +1,19 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v5
with:
days-before-issue-stale: 30
days-before-pr-stale: -1
days-before-close: 7
stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
close-pr-message: 'This issue has not seen any activity since it was marked stale. Closing.'
stale-issue-label: 'Stale'
exempt-issue-labels: 'pinned,bug,enhancement,documentation,Plan'
operations-per-run: 1000
+3
View File
@@ -0,0 +1,3 @@
.DS_STORE
.vscode
.idea
+88
View File
@@ -0,0 +1,88 @@
# 贡献者公约
## 我们的承诺
身为社区成员、贡献者和领袖,我们承诺使社区参与者不受骚扰,无论其年龄、体型、可见或不可见的缺陷、族裔、性征、性别认同和表达、经验水平、教育程度、社会与经济地位、国籍、相貌、种族、种姓、肤色、宗教信仰、性倾向或性取向如何。
我们承诺以有助于建立开放、友善、多样化、包容、健康社区的方式行事和互动。
## 我们的准则
有助于为我们的社区创造积极环境的行为例子包括但不限于:
* 表现出对他人的同情和善意
* 尊重不同的主张、观点和感受
* 提出和大方接受建设性意见
* 承担责任并向受我们错误影响的人道歉
* 注重社区共同诉求,而非个人得失
不当行为例子包括:
* 使用情色化的语言或图像,及性引诱或挑逗
* 嘲弄、侮辱或诋毁性评论,以及人身或政治攻击
* 公开或私下的骚扰行为
* 未经他人明确许可,公布他人的私人信息,如物理或电子邮件地址
* 其他有理由认定为违反职业操守的不当行为
## 责任和权力
社区领袖有责任解释和落实我们所认可的行为准则,并妥善公正地对他们认为不当、威胁、冒犯或有害的任何行为采取纠正措施。
社区领导有权力和责任删除、编辑或拒绝或拒绝与本行为准则不相符的评论(comment)、提交(commits)、代码、维基(wiki)编辑、议题(issues)或其他贡献,并在适当时机知采取措施的理由。
## 适用范围
本行为准则适用于所有社区场合,也适用于在公共场所代表社区时的个人。
代表社区的情形包括使用官方电子邮件地址、通过官方社交媒体帐户发帖或在线上或线下活动中担任指定代表。
## 监督
辱骂、骚扰或其他不可接受的行为可通过 [插入联系方式] 向负责监督的社区领袖报告。
所有投诉都将得到及时和公平的审查和调查。
所有社区领袖都有义务尊重任何事件报告者的隐私和安全。
## 处理方针
社区领袖将遵循下列社区处理方针来明确他们所认定违反本行为准则的行为的处理方式:
### 1. 纠正
**社区影响**:使用不恰当的语言或其他在社区中被认定为不符合职业道德或不受欢迎的行为。
**处理意见**:由社区领袖发出非公开的书面警告,明确说明违规行为的性质,并解释举止如何不妥。或将要求公开道歉。
### 2. 警告
**社区影响**:单个或一系列违规行为。
**处理意见**:警告并对连续性行为进行处理。在指定时间内,不得与相关人员互动,包括主动与行为准则执行者互动。这包括避免在社区场所和外部渠道中的互动。违反这些条款可能会导致临时或永久封禁。
### 3. 临时封禁
**社区影响**: 严重违反社区准则,包括持续的不当行为。
**处理意见**: 在指定时间内,暂时禁止与社区进行任何形式的互动或公开交流。在此期间,不得与相关人员进行公开或私下互动,包括主动与行为准则执行者互动。违反这些条款可能会导致永久封禁。
### 4. 永久封禁
**社区影响**:行为模式表现出违反社区准则,包括持续的不当行为、骚扰个人或攻击或贬低某个类别的个体。
**处理意见**:永久禁止在社区内进行任何形式的公开互动。
## 参见
本行为准则改编自 [Contributor Covenant][homepage] 2.1 版, 参见 [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]。
社区处理方针灵感来源于 [Mozilla's code of conduct enforcement ladder][Mozilla CoC]。
有关本行为准则的常见问题的答案,参见 [https://www.contributor-covenant.org/faq][FAQ]。
其他语言翻译参见 [https://www.contributor-covenant.org/translations][translations]。
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
+43
View File
@@ -0,0 +1,43 @@
# 代码贡献指南
1. 首先非常欢迎和感谢对本项目发起 `Pull Request` 的热心小伙伴们。
2. **特别提示:请务必在 `dev` 分支提交 `PR`,`main` 分支目前仅是正式版的代码,即发布正式版本后才会从 `dev` 分支进行合并。**
3. 本项目代码风格为使用2个空格代表一个Tab,因此在提交代码时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样会给其他人阅读代码带来极大的困扰。
4. 当你遇到这几种情况,非常欢迎你做出贡献,如纠正拼写错误、损坏的链接、或者是其它较明显的错误,又或者是开始一项别人请求的任务,或者是过去在 `issue` 中早就讨论过的。
5. **提交代码前,请再三检查并测试是否能正常运行,如若有难点无法解决,请在提交时注明情况。并且保证新增加或者修改的方法都有完整的文档说明。**
6. 本项目可以采用两种方式接受代码贡献:
- 第一种就是基于[Git Flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择dev分支,详细步骤参考后文,推荐使用此种方式贡献代码。
- 另外一种贡献代码的方式就是加入Solitude开发组,前提是对自己的代码足够自信就可以申请加入,加入之后可以随时直接提交代码,但要注意对所做的修改或新增的代码进行单元测试,保证提交代码没有明显问题。
### PR方式贡献代码步骤
* 在 GitHub 上 `fork` 到自己的仓库,如 `yife68/Hexo-Theme-Solitude`,然后 `clone` 到本地Hexo主题目录,并设置用户信息。
```bash
$ git clone git@github.com:{your-github-username}/hexo-theme-solitude.git themes/solitude
$ cd solitude
$ git config user.name "yourname"
$ git config user.email "your email"
```
* 修改代码后提交,并推送到自己的仓库。
```bash
$ #do some change on the content
$ git commit -am "Fix issue #1: change something"
$ git push
```
* 在 `GitHub` 上提交 `Pull Request`。
* 定期使用项目仓库内容更新自己仓库内容。
```bash
$ git remote add upstream https://github.com/everfu/hexo-theme-solitude
$ git fetch upstream
$ git checkout dev
$ git rebase upstream/dev
$ git push -f origin dev
```
* 不得添加任何第三方的创作
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2024 EverFu
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:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
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.
+83
View File
@@ -0,0 +1,83 @@
简体中文丨[繁体中文](README_zh-Hant.md)丨[English](README_en-US.md)
<div align="center">
<img src=".github/logo.svg" alt="Solitude logo" height="200">
<h1>Hexo Theme Solitude</h1>
一款优雅的 Hexo 主题,支持懒加载、PWA、Latex 以及多种评论系统。
主题设计由 [@张洪Heo](https://github.com/zhheo) 全权授权
![npm package](https://img.shields.io/npm/v/hexo-theme-solitude?logo=npm)
![release](https://img.shields.io/github/package-json/v/valor-x/hexo-theme-solitude/master?color=%231ab1ad&label=release)
![license](https://img.shields.io/github/license/valor-x/hexo-theme-solitude?color=FF5531)
[![Stars](https://img.shields.io/github/stars/everfu/hexo-theme-solitude)](https://github.com/everfu/hexo-theme-solitude/stargazers)
[![NPM all downloads](https://img.shields.io/npm/dy/hexo-theme-solitude?color=white)](https://www.npmjs.com/package/hexo-theme-solitude)
![hexo version](https://img.shields.io/badge/hexo-7.0.0+-blue?logo=hexo&logoColor=white)
![node version](https://img.shields.io/badge/node-14.0.0-white?logo=node.js&logoColor=white)
[![Socket Badge](https://socket.dev/api/badge/npm/package/hexo-theme-solitude/)](https://socket.dev/npm/package/hexo-theme-solitude/overview)
[![twiter](https://img.shields.io/badge/Twitter-gray?logo=x)](https://twitter.com/efu_oo)
[![TG](https://img.shields.io/badge/Telegram-gray?logo=Telegram&logoColor=white)](https://t.me/solitudePro)
![JetBrains](https://img.shields.io/badge/jetbrains-support-black?logo=jetbrains)
![DuoLingo](https://img.shields.io/badge/duolingo-support-black?logo=duolingo&logoColor=white)
[![gitee](https://img.shields.io/badge/Gitee-red?logo=gitee)](https://gitee.com/nsjjd_w/hexo-theme-solitude)
[![gitlab](https://img.shields.io/badge/GitLab-blue?logo=gitlab)](https://gitlab.com/efu/hexo-theme-solitude)
[文档](https://solitude.js.org/)丨[预览](https://www.efu.me/)
</div>
![Screenshot](.github/screenshot.webp)
## 特性
- 页面懒加载(Pjax)、图片懒加载(LazyLoad)、离线应用(PWA)
- 评论(Twikoo、Waline、Valine、Artalk、Giscus),支持双评论
- 昼夜切换(ColorMode)
- 灯箱(medium-zoom、fancybox)
- 数学公式(Latex)
- 特色页面:即刻短文、我的装备、在线工具、音乐馆、友链鱼塘、相册页、豆瓣页、弹幕留言页
- 文章功能:AI 摘要、代码高亮
## Todo
- [x] 首页顶部新样式
- [x] 首页文章列表三列显示
- [x] btns 外挂标签
> 如有问题请提 [issue](https://github.com/everfu/hexo-theme-solitude/issues)
## 应用
1. 使用 NPM 包进行安装
```bash
npm i hexo-theme-solitude
```
2. 应用主题
```yaml
theme: solitude
```
前往 [文档](https://solitude.js.org/) 获取更多信息。
## 赞助者
[!["Buy Me A Coffee"](https://img.buymeacoffee.com/button-api/?text=请我喝杯咖啡&emoji=%E2%98%95&everfu=ezgif&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff)](https://www.buymeacoffee.com/everfu)
<p align="center">
<a href="https://cdn.jsdelivr.net/gh/efuo/static/sponsors.svg">
<img src='https://cdn.jsdelivr.net/gh/efuo/static/sponsors.svg' alt="赞助者"/>
</a>
</p>
## 版权
[MIT](./LICENSE) License &copy; 2023-至今 [EverFu](https://github.com/efuo)
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fvalor-x%2Fhexo-theme-solitude.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fvalor-x%2Fhexo-theme-solitude?ref=badge_large)
+80
View File
@@ -0,0 +1,80 @@
[简体中文](README.md)丨[繁体中文](README_zh-Hant.md)丨English
<div align="center">
<img src=".github/logo.svg" alt="Solitude logo" height="200">
<h1>Hexo Theme Solitude</h1>
An elegant Hexo theme that supports lazy loading, PWA, Latex, and multiple comment systems.
Theme design is fully licensed by [@张洪Heo](https://github.com/zhheo).
![npm package](https://img.shields.io/npm/v/hexo-theme-solitude?logo=npm)
![release](https://img.shields.io/github/package-json/v/valor-x/hexo-theme-solitude/master?color=%231ab1ad&label=release)
![license](https://img.shields.io/github/license/valor-x/hexo-theme-solitude?color=FF5531)
[![Stars](https://img.shields.io/github/stars/everfu/hexo-theme-solitude)](https://github.com/everfu/hexo-theme-solitude/stargazers)
[![NPM all downloads](https://img.shields.io/npm/dy/hexo-theme-solitude?color=white)](https://www.npmjs.com/package/hexo-theme-solitude)
![hexo version](https://img.shields.io/badge/hexo-7.0.0+-blue?logo=hexo&logoColor=white)
![node version](https://img.shields.io/badge/node-14.0.0-white?logo=node.js&logoColor=white)
[![Socket Badge](https://socket.dev/api/badge/npm/package/hexo-theme-solitude/)](https://socket.dev/npm/package/hexo-theme-solitude/overview)
[![twiter](https://img.shields.io/badge/Twitter-gray?logo=x)](https://twitter.com/efu_oo)
[![TG](https://img.shields.io/badge/Telegram-gray?logo=Telegram&logoColor=white)](https://t.me/solitudePro)
![JetBrains](https://img.shields.io/badge/jetbrains-support-black?logo=jetbrains)
![DuoLingo](https://img.shields.io/badge/duolingo-support-black?logo=duolingo&logoColor=white)
[![gitee](https://img.shields.io/badge/Gitee-red?logo=gitee)](https://gitee.com/nsjjd_w/hexo-theme-solitude)
[![gitlab](https://img.shields.io/badge/GitLab-blue?logo=gitlab)](https://gitlab.com/efu/hexo-theme-solitude)
[Documentation](https://solitude.js.org/)丨[Preview](https://www.efu.me/)
</div>
![Screenshot](.github/screenshot.webp)
## Features
- Pjax、LazyLoad、PWA.
- Comments(Twikoo、Waline、Valine、Artalk、Giscus), Can double comment.
- ColorMode.
- Lightbox(medium-zoom、fancybox).
- Mathematical formulas(Latex).
- Featured pages: Instant Short Article, My Equipment, Online Tools, Music Gallery, Friend Chain Fish Pond, Photo Album Page, Douban Page, Barrage message page.
- Article features: AI summary, code highlighting.
## Todo
- [x] The list of articles is displayed in three columns on the homepage.
- [x] btns tags plugin.
> If you have any questions, please issue an [issue](https://github.com/everfu/hexo-theme-solitude/issues)
## Setup
1. Use the NPM package
```bash
npm i hexo-theme-solitude
```
2. Apply
```yaml
theme: solitude
```
Check out the [Documentation](https://solitude.js.org/) for more information.
## Sponsors
[!["Buy Me A Coffee"](https://img.buymeacoffee.com/button-api/?text=Buy&nbsp;Me&nbsp;A&nbsp;Coffee&emoji=%E2%98%95&everfu=ezgif&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff)](https://www.buymeacoffee.com/everfu)
<p align="center">
<a href="https://cdn.jsdelivr.net/gh/efuo/static/sponsors.svg">
<img src='https://cdn.jsdelivr.net/gh/efuo/static/sponsors.svg'/>
</a>
</p>
## License
[MIT](./LICENSE) License &copy; 2023-PRESENT [Ever Fu](https://github.com/everfu)
+78
View File
@@ -0,0 +1,78 @@
[简体中文](README.md)丨繁体中文丨[English](README_en-US.md)
<div align="center">
<img src=".github/logo.svg" alt="Solitude logo" height="200">
<h1>Hexo Theme Solitude</h1>
一款優雅的 Hexo 主題,支援懶載入、PWA、Latex 以及多種評論系統。
主題設計由 [@张洪Heo](https://github.com/zhheo)全權授權
![npm package](https://img.shields.io/npm/v/hexo-theme-solitude?logo=npm)
![release](https://img.shields.io/github/package-json/v/valor-x/hexo-theme-solitude/master?color=%231ab1ad&label=release)
![license](https://img.shields.io/github/license/valor-x/hexo-theme-solitude?color=FF5531)
[![Stars](https://img.shields.io/github/stars/everfu/hexo-theme-solitude)](https://github.com/everfu/hexo-theme-solitude/stargazers)
[![NPM all downloads](https://img.shields.io/npm/dy/hexo-theme-solitude?color=white)](https://www.npmjs.com/package/hexo-theme-solitude)
![hexo version](https://img.shields.io/badge/hexo-7.0.0+-blue?logo=hexo&logoColor=white)
![node version](https://img.shields.io/badge/node-14.0.0-white?logo=node.js&logoColor=white)
[![Socket Badge](https://socket.dev/api/badge/npm/package/hexo-theme-solitude/)](https://socket.dev/npm/package/hexo-theme-solitude/overview)
[![twiter](https://img.shields.io/badge/Twitter-gray?logo=x)](https://twitter.com/efu_oo)
[![TG](https://img.shields.io/badge/Telegram-gray?logo=Telegram&logoColor=white)](https://t.me/solitudePro)
![JetBrains](https://img.shields.io/badge/jetbrains-support-black?logo=jetbrains)
![DuoLingo](https://img.shields.io/badge/duolingo-support-black?logo=duolingo&logoColor=white)
[![gitee](https://img.shields.io/badge/Gitee-red?logo=gitee)](https://gitee.com/nsjjd_w/hexo-theme-solitude)
[![gitlab](https://img.shields.io/badge/GitLab-blue?logo=gitlab)](https://gitlab.com/efu/hexo-theme-solitude)
[文档](https://solitude.js.org/)丨[預覽](https://www.efu.me/)
</div>
![Screenshot](.github/screenshot.webp)
## 特性
- 頁面懶載入(Pjax)、圖片懶載入(LazyLoad)、離線應用(PWA)
- 評論(Twikoo、Waline、Valine、Artalk、Giscus),支援雙評論
- 晝夜切換(ColorMode)
- 燈箱(medium-zoom、fancybox)
- 數學公式(Latex)
- 特色頁面:即刻短文、我的裝備、在線工具、音樂館、友鏈魚塘、相冊頁、豆瓣頁、留言彈幕頁。
- 文章功能:AI 摘要、代碼高亮。
## Todo
- [x] 首页文章列表三列显示
- [x] btns 外挂标签
## 應用
1. 使用 NPM 包進行安裝
```bash
npm i hexo-theme-solitude
```
2. 應用主題
```yaml
theme: solitude
```
前往 [文檔](https://solitude.js.org/) 獲取更多資訊。
## 贊助者
[!["Buy Me A Coffee"](https://img.buymeacoffee.com/button-api/?text=請我喝杯咖啡&emoji=%E2%98%95&everfu=ezgif&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff)](https://www.buymeacoffee.com/everfu)
<p align="center">
<a href="https://cdn.jsdelivr.net/gh/efuo/static/sponsors.svg">
<img src='https://cdn.jsdelivr.net/gh/efuo/static/sponsors.svg'/>
</a>
</p>
## 版權
[MIT](./LICENSE) License &copy; 2023-至今 [Efu](https://github.com/everfu)
+9
View File
@@ -0,0 +1,9 @@
# Security Policy
## Report a vulnerability
To report a vulnerability, please [report privately via security tab](https://github.com/everfu/hexo-theme-solitude/security/advisories/new) on the correct GitHub repository (see [Document](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability)). If you are unable to report, please feel free to email us at o@efu.me.
All security vulnerabilities will be verified and resolved in a timely manner.
While it is rare for new vulnerabilities to be discovered, it is recommended to always use the latest version of the theme and other dependencies by maintaining locked files (`yarn.lock`, `package-lock.json`) to ensure that they are as secure as possible.
+977
View File
@@ -0,0 +1,977 @@
#---------------------------
# Hexo Theme Solitude
# Author: EverFu
# Github: https://github.com/everfu/hexo-theme-solitude
#
# 配置指南: https://solitude.js.org/
# 你可以从指南中获得更详细的说明
#
# Guide: https://solitude.js.org/
# You can get more detailed help from the guide
#
# 赞助:https://afdian.net/a/everfu
# sponsor: https://github.com/sponsors/everfu
#---------------------------
# 站点设置
# site settings
site:
# Logo
name:
# 显示类型 (i_class/text/img)
# Display type (i_class/text/img)
class: text
# 具体内容 例如:solitude st-logo / Efu / /img/logo.png
# Specific content, for example: solitude st-logo / Efu / /img/logo.png
custom: Solitude
# 网页icon
# Web icon
siteIcon: /img/pwa/favicon.ico
# 页脚的Logo、加载动画默认的logo
# Logo in the footer, default logo for loading animation
icon: /img/pwa/favicon.ico
# 导航栏
# NavBar
nav:
# logo 箱子
# logo group
group:
# 项目: # 分类名称
# Solitude: https://github.com/everfu/hexo-theme-solitude || /img/pwa/favicon.ico # 子菜单名称(submenu name): 链接地址(address) || 图标(icon)
# 中心菜单
# center menu
menu:
# 首页: / # 显示名称:路径 / Display name: path
# 文库: # 显示名称 / Display name
# 文章列表: /archives/ || st-folder-fill # 子菜单名称:路径 || 图标 / Submenu name: path || icon
# 全部分类: /categories/ || st-checkbox-multiple-blank-fill
# 全部标签: /tags/ || st-price-tag-fill
# 友链:
# 友链鱼塘: /moments/ || st-wifi-fill
# 友情链接: /links/ || st-group-fill
# 宝藏博主: javascript:travelling() || st-gift-fill
# 我的:
# 装备: /equipment/ || st-laptop-line
# 工具箱: /tlink/ || st-tools-fill
# 音乐馆: /music/ || st-disc-fill
# 关于:
# 关于本站: /about/ || st-contacts-fill
# 右侧按钮
# Button on the right
right:
random: false # 随机文章跳转 / random post button
console: false #控制台 / console
# 自定义按钮
# custom button
# 左至右
# from left to right
custom:
# - name: 开往 - 友链接力 # 显示文字 / Displayed text
# url: https://www.travellings.cn/go.html # 跳转链接 / Jump link
# icon: st-train-line # 图标 / Icon
# onclick: # 点击事件 / Click event
# id: travellings_button # id
# 首页顶部样式
# Home top style
hometop:
enable: false # 是否打开 / if enable
# banner display
banner:
# 左上角显示大文字
# Large text displayed in the upper left corner
# tip:可使用html标签
# tip: html tags be used
title: 宁静致远<br>热爱生活
# 左上角显示小文字
# Small text displayed in the upper left corner
url: Hexo Theme Solitude
# 轮播icon
# Carousel icon
# tip: 76x76 size
icon:
# HTML: # 名字 / Name
# img: https://7.isyangs.cn/34/65f2e42921677-34.png # 图片 / Image
# color: "#e9572b" # 背景色 / Background color
# JS:
# img: https://7.isyangs.cn/34/65f2e43ceddda-34.png
# color: "#f7cb4f"
# Docker:
# img: https://7.isyangs.cn/34/65f2e45462045-34.png
# color: "#57b6e6"
# Flutter:
# img: https://7.isyangs.cn/34/65f2e47acbe98-34.png
# color: "#ffffff"
# WebPack:
# img: https://7.isyangs.cn/34/65f2e488bf8ed-34.png
# color: "#2e3a41"
# Git:
# img: https://7.isyangs.cn/34/65f2e499066fa-34.png
# color: "#df5b40"
# 左下跳转按钮
# Banner lower left jump button
group:
# 热门: /tags/热门/ || st-fire-fill || linear-gradient(to right,#f65,#ffbf37)
# 教程: /tags/教程/ || st-book-mark-fill || linear-gradient(to right,#358bff,#15c6ff)
# 精选: /tags/精选/ || st-star-smile-fill || linear-gradient(to right,#18e7ae,#1eebeb)
# 右侧置顶列表(在文章的front matter中添加“recommend: true”)
# Right top list (add "recommend: true" in the front matter of the article)
recommendList:
# 左上角显示文字
# Large text displayed in the upper left corner
sup: 置顶
# 左下角大字
# Large text in the lower left corner
title: Solitude 主题文档
# 点击跳转链接
# Click the jump link
url: https://solitude.js.org/
# 显示背景图片
# Display background image
img: /img/default.avif
# 阴影颜色
# Shadow color
color: "none"
# carousel
# 顶部推荐轮播图
# 使用方法:在文章的front matter中添加“recommend: true”
# tip:建议开了这个就不要开hometop,其功能类似
carousel: false
# --------------------------------------
# Aside Settings
# 侧边栏配置
aside:
# 值:about(关于我)、newestPost(最新文章)、allInfo(网站信息)、flip(公众号二维码)、newest_comment(最新评论)
# Values: about (info card), newestPost (latest article), allInfo (website information), flip (official account QR code), newest_comment (latest comment)
# 在主页显示的侧边栏信息
# Sidebar information displayed on the homepage
home:
# 固定的信息(滑动不跟随)
# Fixed information (not followed by sliding)
noSticky: "about"
# 不固定的信息(滑动跟随)
# Unfixed information (sliding follow)
Sticky: "allInfo"
# 在文章页显示的侧边栏信息
# Sidebar information displayed on the article page
post:
noSticky: "about"
Sticky: "newestPost"
# 在页面中显示的侧边栏信息
# Sidebar information displayed on the
page:
noSticky: "about"
Sticky: "newestPost,allInfo"
position: 1 # left(0): 左侧 / right(1): 右侧
# 侧边栏个人信息卡片
# Sidebar personal information
card:
style: 0 # 0: Heo样式 :1: 设计样式
# 头像信息
# Avatar information
author:
# 头像
# Avatar
img: /img/avatar.avif
# 表情图片链接
# Emoticon image link
# tip: 26x26 size
sticker: https://7.isyangs.cn/34/65f2e4e0423cc-34.png # 不填不显示
# 点击作者头像跳转链接
# Click the author's avatar to jump link
url: /about/
# 背景图片
# Background image
background: # https://s3.qjqq.cn/47/663af296b85f4.webp!color # 不设置不会展示(仅样式为1、2时有效)
# 文案1
# label1
content: 分享自己对编程的<b>热爱</b>,对美好生活的<b>向往</b>,对知识海洋<b>探索历程</b>。 # 样式为1时无效
# 文案2
# label2
content2: 相信你可以在这里找到对你有用的知识和教程。 # 样式为1时无效
# 个人信息卡片底部的小图标,按照例子填写
# Small icons at the bottom of the personal information card, fill in according to the example
# 个人信息卡片顶部按钮的打招呼语句
# Greeting statement of the button at the top of the personal information card
sayhello: # 样式为2时无效
morning: 一日之计在于晨
noon: 吃饱了才有力气干活
afternoon: 集中精力,攻克难关
night: 不要太劳累了,早睡更健康
goodnight: 睡个好觉,保证精力充沛
# 个人信息卡片顶部按钮的切换文字
# Switching text of the button at the top of the personal information card
sayhello2: # 样式为2时无效
# - 🤖️ 数码科技爱好者
# - 🔍 分享与热心帮助
# - 🏠 智能家居小能手
# - 🔨 设计开发一条龙
# - 🤝 专修交互与设计
# - 🏃 脚踏实地行动派
# - 🧱 团队小组发动机
# - 💢 壮汉人狠话不多
# - 🎮 电竞游戏爱好者
# 个人信息卡片底部的小图标,按照例子填写
information: # 样式为1时请不要超过4个
# Github: https://github.com/efuo || st-github-line # 名称:链接 || 图标 / Name: link || icon
# Bilibili: https://space.bilibili.com/1329819902 || st-bilibili-line
# 二维码
# Official account QR code
flip:
# 右下角头像
# Avatar in the lower right corner
favicon:
# 正面
# Front
face:
# 鼠标悬停翻转图片
# Mouse hover flip image
backface:
# 背景色:var(--efu-blue) / #000 / rgba(0,0,0,0.5) / linear-gradient(to right,#f65,#ffbf37)
# Background color: var(--efu-blue) / #000 / rgba(0,0,0,0.5) / linear-gradient(to right,#f65,#ffbf37)
backcolor: "var(--efu-blue)"
newest_comment:
enable: true
storage: .5 # 缓存时间 1: 1天 / .5 : 半天 / Cache time 1: 1 day .5 : half a day
limit: 5 # 评论数 / Number of comments
# 页面目录
# Page directory
toc:
# 在文章页显示
# Display on the article page
post: true
# 在任意页显示
# Display on any page
page: false
# 开启后不悬停目录有模糊效果
# After opening, there is a fuzzy effect without hovering over the directory
vague: true
# 侧边栏文章列表
# Sidebar article list
tags:
# 是否显示标签
# Whether to display tags
enable: false
# 显示标签数量,当高于标签总数时,显示全部标签按钮
# Display the number of tags, when it is higher than the total number of tags, display all tags button
limit: 20
# 高亮显示标签列表
# Highlighted tag list
highlight_list:
# - Hexo
# 侧边栏归档
# aside archive
archive:
enable: false
# 显示类型
type: "month" # month: 按月 / year: 按年 : month: by month / year: by year
# 建站信息
# Website information
siteinfo:
# 文章数
# Number of articles
postcount: true
# 总字数
# The number of words on the web site
wordcount: false
# 访问量
# PV
pv: true
# 访客数
# UV
uv: true
# 最后更新日期
# Last update date
updatetime: true
# 建站时间
# Website creation time
runtimeenable: true
# 格式:yyyy-MM-dd hh-mm-ss
# Format: yyyy-MM-dd hh-mm-ss
runtime: "2023-04-20 00:00:00"
# 首页文章配置信息
# Configure information on the home page
index_post_list:
direction: column # row / column
column: 2 #2:2列 3:3列
content: false # 1: post.description / 2: 自动获取description或截取内容(Automatically get descriptions or screenshots) / 3: 只使用截取内容(Use only screenshots) / false: 不显示内容(No content is displayed)
length: 500 # 截取内容的长度 : The length of the screenshot content
cover: both # left: 在左侧 : left / right: 在右侧 : right / both: 两侧 : both
# 页面默认设置
# page default settings
page:
error: true # 404页面 / 404 page
tags: true # 标签页 / Tags page
categories: true # 分类页 / Categories page
default: # 默认值 / Default value
# 默认图片
# default cover
cover:
# - /img/default.png # 默认图片 / default cover
# 文章页默认设置
# post default settings
post:
default:
# 文章默认图片
# default cover
cover:
# - # 默认图片 / default cover
# 文章发布默认地址
# default post locate
locate: 衡阳
# 文章默认版权
# default post copyright
copyright:
enable: true
author:
url: /about/ # 点击头像跳转地址
img: # 显示头像,不填写默认显示site_icon
license: CC BY-NC-SA 4.0
licenurl: https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh
# 顶部文章简介
# Top article introduction
meta:
date: false # 发布日期 / Release date
updated: false # 更新日期 / Update date
locate: false # 位置 / Location
wordcount: false # 字数 / Number of words
readtime: false # 访问 / uv
pv: false # 浏览量 / pv
comment: false # 评论数 / Comment count
# 打赏
# reward
award:
enable: false
appreciators: /about # 赞赏记录 / Appreciative records
title: 感谢您的赞赏。
desc: 因为有你们的支持,我才体会到写文章的价值。
list:
# - name: 爱发电
# qcode: https://s3.qjqq.cn/47/661ba8e695f17.webp!color
# url: https://afdian.net/a/efu0u0/
# color: var(--efu-purple)
# - name: Github Sponsor
# qcode: https://s3.qjqq.cn/47/661ba900c4bc1.webp!color
# url: https://github.com/sponsors/efuo
# color: var(--efu-black)
# 分享按钮,需要是什么哪些按钮,填写后开启
share:
enable: false
list:
# - qq
# - weibo
# - twitter
# - facebook
# - telegram
# - whatsapp
# - linkedin
# - link
# - qrcode
# 版权中订阅按钮跳转链接,填写地址后开启
# Subscription button jump link in copyright
rss: # /atom.xml
# 文章主题色获取
# Article theme color acquisition
covercolor:
enable: false
mode: local # local:本地取色 / api:img2color取色 : local: local color / api: img2color color
api: https://api.qjqq.cn/api/Imgcolor?img= # api地址 / api address
time: 43200000 # api取色间隔(毫秒),默认为12小时 / api color interval (milliseconds), default is 12 hours
# footer
footer:
enable: true
desc: 来自 Efu 的文章 # 介绍文字
button: # 跳转按钮
enable: true
name: 了解更多
url: /about/
# -------------------------
# 自定义主题
# 自定义配色
# custom theme color
# 注意:颜色值必须使用引号,如“#000”,否则可能会导致错误!
# Note: The color value must be enclosed in quotation marks, such as "#000", otherwise it may cause an error!
# --------------------------------------
theme_color:
dark: "#ffc848" # 暗色模式 / Dark mode
dark_op: "#f2b94b23" # 暗色模式透明 / Dark mode transparent
dark_op_deep: "#f2b94bdd" # 暗色模式透明深色 / Dark mode transparent dark
dark_none: "#f2b94b00" # 暗色模式透明无色 / Dark mode transparent colorless
light: "#425AEF" # 亮色模式 / Light mode
light_op: "#4259ef23" # 亮色模式透明 / Light mode transparent
light_op_deep: "#4259efdd" # 亮色模式透明深色 / Light mode transparent dark
light_none: "#4259ef01" # 亮色模式透明无色 / Light mode transparent colorless
# 主题显示模式调整
# theme display mode adjustment
# 主题支持三种模式:自动切换、暗色模式、亮色模式
# The theme supports three modes: automatic switching, dark mode, and light mode
# --------------------------------------
display_mode:
type: auto # auto: 自动切换 / dark: 暗色模式 / light: 亮色模式 / auto: automatic switching / dark: dark mode / light: light mode
universe: true # 开启后暗色模式下会显示星空背景 / After opening, the dark mode will display the starry sky background
# 文章底部推荐文章
# Recommended articles at the bottom of the article
# --------------------------------------
related_post:
enable: false
# 推荐文章数量
# Number of recommended articles
limit: 2
# 根据创建日期(created)或是更新日期(updated)
# According to the creation date (created) or the update date (updated)
date_type: created
# --------------------------------------
# Footer Settings
# 页脚配置
footer:
# 底部上方一排图标
# Bottom row of icons
information:
author: false # 是否显示 site_icon / enable site_icon in footer
left: # 左侧显示图标
# Github: https://github.com/efuo || st-github-line # 名称:链接 || 图标 / Name: link || icon
# Mail: mailto:o@efu.me || st-mail-line
right: # 右侧显示图标
# Bilibili: https://space.bilibili.com/1329819902 || st-bilibili-line
# 抖音: https://v.douyin.com/iJsLc8jt/ || st-douyin-fill
# 底部导航栏
# Bottom navigation bar
group:
# 导航:
# 归档: /archives/
# 分类: /categories/
# 标签: /tags/
# 服务:
# 阿里云: https://aliyun.com/
# 51la统计: https://v6.51.la/
# 百度统计: https://tongji.baidu.com/
# 支持:
# 打赏记录: /about/
# 协议:
# Cookies: /cookies/
# 用户协议: /privacy/
# 版权协议: /copyright/
# 页脚随机友链
# Random links at footer
# warning: 打开前必须先配置links
# warning: links must be configured before opening
randomlink: false
# 隐私助手右侧弹窗,填写路径后开启
# Privacy assistant right pop-up window, fill in the path to open
privacy: # /privacy/
# 版权(Copyright)
license: # /license/
# 页脚右侧链接,例如:ICP备案号、公安备案号等
# Footer right link, such as: ICP filing number, public security filing number, etc.
links:
# 为了主题能够得到更多的支持,建议保留主题链接
# In order for the theme to get more support, it is recommended to keep the theme link
- name: 主题
url: https://github.com/everfu/hexo-theme-solitude
# - name: 订阅
# url: /atom.xml
# 404 页面(404 page)
errorpage:
# 图片
# image
img: /img/404.avif
# 文字
# text
text: =awa= 页面走丢了
# 推荐文章列表
# Recommended article list
recommendList: true
# 即刻短文
# talk now
# 前置要求:需配置即刻短文页面
# Pre-requirements: talk now page needs to be configured
says:
enable: false
# 主页的即刻轮播条
# Talk carousel bar on the homepage
home_mini: false
# 1:张洪heo样式 / 2:Leonus样式
# 1: Zhang Hong heo style / 2: Leonus style
style: 1
# 即刻短文仅展示前n条
# Talk short text only shows the first n
strip: 30
# 最近评论
# recent comments
# 前置要求:需配置最近评论页面和评论,否则显示为空
# Pre-requirements: recent comments page needs to be configured and commented, otherwise it will be displayed as empty
recent_comments:
enable: false
# 评论数
# Number of comments
limit: 50 # ⚠️waline 仅支持最大50条评论 / ⚠️waline only supports a maximum of 50 comments
# 缓存时间
# Cache time
cache: 0.2 # 1 = 1天 / 1 = 1 day
page: /recentcomments/ # 最近评论页面 / recent comments page
img: /img/recent_c.avif # 中控台显示图片(不填不显示) / image displayed in the console
# 留言板
# message board
# 前置要求:需配置留言板页面
# Pre-requirements: message board page needs to be configured
envelope:
enable: false
line: 10 # 显示行数
speed: 20 # 播放速度
hover: true # 鼠标悬停暂停
loop: true # 循环播放
page: /message/ # 留言板页面 / message board page
# -------------------------
# meeting-api,用于界面中的音乐胶囊和音乐馆页,可自定义api,不会请勿动。
# meeting-api, used for music capsules and music halls in the interface, can customize api, do not move if you don't know.
meting_api: "https://meting.qjqq.cn/?server=:server&type=:type&id=:id&auth=:auth&r=:r" #自定义api
# 音乐馆页
# music page
music:
enable: false
# 音乐ID:歌单ID / 专辑ID / 歌手ID
# Music ID: playlist ID / album ID / singer ID
id: 1994908354
# 播放列表的服务商。netease:网易云 / tencent:腾讯 / kugou:酷狗 / xiami:小米 / baidu:百度
# Music service provider. netease: Netease Cloud / tencent: Tencent / kugou: Kugou / xiaomi: Xiaomi / baidu: Baidu
server: netease
# 播放列表的类型。song:单曲 / playlist:歌单 / album:专辑 / artist:歌手
# Type of playlist. song: Single / playlist: Playlist / album: Album / artist: Singer
type: playlist
# 初始音量。0.8 = 80%,范围 0 到 1
# Initial volume. 0.8 = 80%, range 0 to 1
volume: 0.8
# 是否开启互斥模式,即同时只能有一个播放器播放
# Whether to enable mutex mode, that is, only one player can play at the same time
mutex: true
# 音乐胶囊
# capsule music
capsule:
enable: false
# 歌单id / playlist id
id: 8407304077
# 播放列表的服务商。netease:网易云 / tencent:腾讯 / kugou:酷狗 / xiami:小米 / baidu:百度
# Music service provider. netease: Netease Cloud / tencent: Tencent / kugou: Kugou / xiaomi: Xiaomi / baidu: Baidu
server: netease
# 播放列表的类型。song:单曲 / playlist:歌单 / album:专辑 / artist:歌手
# Type of playlist. song: Single / playlist: Playlist / album: Album / artist: Singer
type: playlist
# 快捷菜单你
# quick menu
keyboard:
enable: false # 是否开启键盘控制 / Whether to enable keyboard control
# 键盘控制配置
# Keyboard control configuration
list:
# name: 按键名称(name)
# key: 按键(Key)
# func: 方法(function)
# sco: sco内置方法(sco.'function')
# url: 跳转链接(link)
# ------------------
# - name: 关闭快捷键功能
# key: K
# func: keyboard
# - name: 打开中控台
# key: A
# sco: showConsole
# - name: 播放/暂停音乐
# key: M
# sco: musicToggle
# - name: 打开友情链接
# key: L
# url: "/links/"
# 复制
# Copy
copy:
enable: true
copyright: # Turn on Link copyright information after copying.(开启后将在默认增加版权信息)
enable: true
limit: 50 # word count. (字数)
# 懒加载
# lazyload
lazyload:
enable: false
field: site # post, site
# 加载中显示图片
# Loading display image
placeholder: /img/loading.avif
# 加载失败显示图片
# Loading failed display image
errorimg: /img/error_load.avif
# 加载动画
# loading animation
loading:
# 全局加载动画
# Global loading animation
fullpage: false
# 顶部加载胶囊
# Top loading capsule
pace: true
#代码高亮增强
# code highlight
highlight:
enable: true
limit: 200 # 代码行高限制 / Code line limit
copy: true # 是否开启复制按钮 / Whether to enable the copy button
expand: true # 是否默认展开 / Whether to expand by default
# 代码块样式
# Code block style
theme: default # default: 默认 / mac : apple terminal
# 代码配色
# Code color
color: default # default: 默认 / solidity: solidity / dracula: dracula
# 图片灯箱
# image lightbox
# warning:开启前下方的fancybox或mediumZoom必须打开一个
# warning: One of the fancybox or mediumZoom below must be turned on before turning on
lightbox: false
# fancybox
# https://fancyapps.com/fancybox/
fancybox: false
# mediumZoom
mediumZoom: false
# mermaid tags plugin
# https://mermaid.js.org/
mermaid: false
# Open Graph
# https://ogp.me/
# https://developers.facebook.com/docs/sharing/webmasters/
OpenGraph:
enable: false
options:
# twitter_card:
# twitter_image:
# twitter_id:
# twitter_site:
# google_plus:
# fb_admins:
# fb_app_id:
# 字数统计
# word count
# warning:开启前需要安装字数统计插件
# warning: You need to install the word count plugin before turning it on
wordcount: false
# 访问统计
# access statistics
busuanzi: false
busuanzi_use: 0 # 0: 原版 / 1: 青秸(other: 其它自定義的busuanzi平台)
# 搜索
# search
# warning:开启前需要安装搜索插件
# warning: You need to install the search plugin before turning it on
search:
enable: false
# algolia, local
type: local
# 推荐标签
# Recommended tags
tags:
# - Solitude
# - Hexo
algolia:
# hits:
# per_page: 6
local:
preload: false
CDN:
# Post Chat AI
# 后台地址:https://ai.tianli0.top/?InviteID=OZ3Z0V2R
tianli_talk:
enable: false
title: 智能客服与搜索
key: # https://ai.tianli0.top/?InviteID=OZ3Z0V2R
# 默认值
# backgroundColor: "var(--efu-main)",
# bottom: "60px",
option: #https://ai.tianli0.top/codeMaker.html
# defaultInput: false
# upLoadWeb: true
# userTitle: Efu Chat
# userDesc: 你好,我是 Efu 的智能客服,有什么可以帮助你的?
# showInviteLink: 'https://ai.tianli0.top/?InviteID=OZ3Z0V2R'
# blackDom:
# - .aplayer
# 文章摘要AI
# post abstract AI
post_ai:
enable: false
# 右侧显示的模型名称
# Model name displayed on the right
modelName: GPT 4
# key
# 具体获取方法见文档
# Specific acquisition method, see the document
key:
# 自介
# talk
talk: # 我是 Efu 开发的摘要生成助理EfuGPT,EfuGPT在静态部署时进行摘要的撰写,并且在访客访问时通过EfuCorrection转译后的文本摘要实现工具。我在这里只负责已经生成的摘要显示,你无法与我直接沟通,但我可以回答一些预设的问题。
# 随机文章按钮
# Random post button
randomPost: false
# 举报链接,不填不显示
# Report link, do not fill in and do not display
report: https://efu.me/
# 底部提示
# Bottom tip
tips: # 此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结
# latex 公式支持
# latex formula support
# docs: https://solitude.js.org/configuration/extra#数学公式
katex:
enable: false
per_page: false # 是否在每页都加载 / Whether to load on each page
copytex: false # 是否开启复制公式 / Whether to enable copy formula
# 评论
# comment
# getting start: https://solitude.js.org/comments/comment
comment:
use: # waline, twikoo, valine, artalk, giscus
commentBarrage: false # 热评开关 / Hot comment switch
lazyload: false # 懒加载
count: false # 评论数展示
pv: false # 是否使用評論統計頁面訪問
avatar: https://cravatar.cn # Gravatar link
# twikoo 配置信息
# twikoo settings
twikoo: # https://twikoo.js.org/
envId: # url: https://twikoo.sondy.top/
region: # 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填
style: true # Use custom styles when turned on / 开启后使用自定义样式
accessToken: # AccessToken
option: # twikoo option
# waline 配置信息
# waline settings
waline: # https://waline.js.org/
envId: # url: https://waline.wzsco.top
pageview: false # 是否开启页面访问量统计 / Whether to enable page access statistics
option: # waline配置项 / waline configuration item
# valine 配置信息
# valine settings
valine:
appId: # leancloud application app id
appKey: # leancloud application app key
serverURLs: # This configuration is suitable for domestic custom domain name users, overseas version will be automatically detected (no need to manually fill in)
avatar: # https://valine.js.org/avatar.html
visitor: false
style: true # Use custom styles when turned on / 开启后使用自定义样式
option: # options list
# artalk 配置信息
# artalk settings
artalk:
server: # server url / 后端地址
site: # site name / 站点名
option: # options
# gitalk 配置信息
# gitalk settings
giscus:
repo: # GitHub 仓库名称 / GitHub repository name
repo_id: # GitHub 仓库ID / GitHub repository ID
category_id: # GitHub 仓库分类ID / GitHub repository category ID
theme:
light: light
dark: dark
option:
# 中控台扩展 : 最新评论 + 标签 + 文章
console_plus: false
# 站点验证
# Site verification
# 仅需要填写验证代码即可,譬如:codeva-KReTIJu5us
# Only need to fill in the verification code, such as: codeva-KReTIJu5us
verify_site:
# - name: google-site-verification
# content: xxxxxx
# - name: baidu-site-verification
# content: xxxxxxx
# CSS 前缀
# CSS prefix
# 有些 CSS 并不是所有浏览器都支持,需要增加对应的前缀才会生效
# Some CSS is not supported by all browsers, and you need to add the corresponding prefix to take effect
# 开启 css_prefix 后,会自动为一些 CSS 增加前缀。(会增加 20%的体积)
# After opening css_prefix, some CSS will be automatically prefixed. (Will increase 20% of the volume)
css_prefix: false
# Font 字体
# Font
font:
font-size: 16px
code-font-size: 16px
font-family: "PingFang SC,Hiragino Sans GB,Microsoft YaHei"
code-font-family: "monospace, monospace"
# 插入代码到头部 </head> 之前 和 底部 </body> 之前
# Insert code before </head> and before </body>
# 插入额外代码 如:统计,广告等
# Insert additional code such as: statistics, advertising, etc.
extends:
head: # 在head中插入 / Insert in head
# - <script src="https://cdn.bootcdn.net/ajax/libs/pace/1.2.4/pace.min.js"></script>
body: # 在body中插入 / Insert in body
# PWA
# https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps
# docs: https://solitude.js.org/configuration/extra#pwa
pwa:
enable: false
manifest: /manifest.json # manifest.json 文件路径
theme_color: "#006a73" # 主题颜色
mask_icon: /img/pwa/favicon.ico # 遮罩图标
apple_touch_icon: /img/pwa/favicon.ico # 苹果触摸图标
bookmark_icon: /img/pwa/favicon.ico # 书签图标
favicon_32_32: /img/pwa/favicon_32.ico # 32x32图标
favicon_16_16: /img/pwa/favicon_16.ico # 16x16图标
# 谷歌广告 (Google Adsense)
google_adsense:
enable: false
auto_ads: false # 自动广告关闭后则为手动广告 / After auto ads are turned off, it is manual ads
enable_page_level_ads: true # 页面级广告 / Page-level ads
aside_card: true # 侧边栏卡片广告 / Sidebar card ads(开启后自行到需要添加的页面使用:ads)
post_card: true # 文章卡片广告 / Post card ads(首页文章列表)
post_content: true # 文章内容广告 / Post content ads(文章内容底部广告)
js: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js # 谷歌广告js / Google Adsense js
# client id
# 无论是否开启自动广告,都需要填写 client id
# Whether to enable auto ads or not, you need to fill in the client id
client: # ca-pub-XXXXXXXXXXXXXX
# slot id
# 只有关闭自动广告时才需要填写 slot id,可以在谷歌广告后台 按广告单元中创建广告位后获取
# Only when auto ads are turned off, you need to fill in the slot id, which can be obtained after creating an ad space in the Google Adsense background according to the ad unit
slot: # 4236388782
# 自定义右键菜单 (Custom Right Menu)
right_menu:
enable: false
commentBarrage: false # 是否显示热评开关 / Whether to display the hot comment switch.
# 翻译功能(仅支持简繁)
# Translation function (Simplified and Traditional Chinese only)
translate:
enable: false
defaultEncoding: 2 # 1: 默认繁体 2: 默认简体
translateDelay: 0 # 首次加载翻译迟疑时间
# 自定义菜单项列表
# Customize the list of menu items.
custom_list:
# - name: 随机短文
# click: toRandomPost()
# id: menu-randomPost
# class:
# icon: st-signal-tower-fill
# - name: 全部分类
# click: pjax.loadUrl('/categories/') # 外链用 window.open,pjax 无法请求跨域内容
# id:
# class:
# icon: st-checkbox-multiple-blank-fill
# - name: 全部标签
# click: pjax.loadUrl('/tags/')
# id:
# class:
# icon: st-price-tag-fill
# - name: 赞助主题
# click: window.open('https://afdian.net/a/efu0u0/', '_blank')
# id:
# class:
# icon: st-afdian-line
# 哀悼模式,网页黑白
# Mourning mode, web page black and white
memorial:
enable: false
# 日期, (M-D)
# Date, (M-D)
# eg: 7-8, 9-18, 12-13 ...
date:
- "7-8" #七八卢沟桥事变
- "9-18" #九一八事变/建军节
- "12-13" #南京国家公祭日
# CDN
# Don't modify the following settings unless you know how they work
# 非必要请不要修改
CDN:
# The CDN provider of internal scripts (主题内 js 的 cdn 配置)
# option: local/jsdelivr/unpkg/cdnjs/custom
# Dev version can only choose. ( dev版本只能为 local )
internal: local
# The CDN provider of third party scripts (第三方 js 的 cdn 配置)
# option: jsdelivr/unpkg/cdnjs/custom
third_party: cdnjs
# Add version number to url, true or false
version: true
# Custom format
# For example: //open.lightxi.com/cdnjs/ajax/libs/${cdnjs_name}/${version}/${min_cdnjs_file}
custom_format: //open.lightxi.com/cdnjs/ajax/libs/${cdnjs_name}/${version}/${min_cdnjs_file}
option:
solitude_css: https://cdn2.codesign.qq.com/icons/7pOrz0WXB5ZWJPX/latest/iconfont.css
# algolia_search:
# instantsearch:
# pjax:
# twikoo:
# waline_js:
# waline_css:
# katex:
# katex_copytex:
# lazyload:
# aplayer_css:
# aplayer_js:
# meting_js:
# pace_js:
# swiper_css:
# swiper_js:
# busuanzi_js:
# snackbar_js:
+227
View File
@@ -0,0 +1,227 @@
more: More
star: Behold, those who found delight in this piece also perused
random: Random
upload: 'datetime: '
totalk: You don't need to delete blank lines, just type in your comments.
loading: Loading...
day: ' days'
theme:
dark: Dark
light: Light
copy:
success: Copied
error: Copy failed
copy_copyright:
author: Author
link: Link
source: 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.
time:
day: " days ago"
hour: " hours ago"
just: "just"
min: " minutes ago"
month: " months ago"
page:
tag: Tags
category: Categories
tags: All tags
categories: All categories
archives: Archives
404: Page not found
home:
home: Home
sticky: Sticky
new: New
read: Unread
recommendmore: More
archives: All articles
post:
reprint: Reprint
original: Original
cc: This article is a ${cc} article, pay attention to the copyright.
posted: Posted on
updated: Last updated on
wordcount: Word count
minread: Reading time
ip: The author's IP belongs to
pv: PV
comment: Comments
copyright:
reprint: This article is a reproduction or translation, and the copyright belongs to the original author. Please contact the original author for permission to republish this article.
original: This piece of writing is an original article, utilizing the
original_end: Agreement. For complete reproduction, please acknowledge the source as Courtesy of
share:
qq: Share to QQ
weibo: Share to Weibo
telegram: Share to Telegram
twitter: Share to Twitter
linkedin: Share to LinkedIn
facebook: Share to Facebook
link: Share to Link
qrcode: Share to QR code
whatsapp: Share to WhatsApp
ai:
title: Article Summary
tip: Complaints
nav:
next: Next
prev: Previous
nav:
site_name_title: Back to home
backtop: Back to top
travellings: Traveling - Friends Link
search: Search
randompost: Random post
console: Console
award:
thanks: Thanks
tipping: Sponsor
title: List of appreciation
search:
empty: No results found
hit: Found ${query} results for you
placeholder: Enter keywords to quickly search
count: Total <b>${count}</b> results.
head:
noscript: Please enable JavaScript to view the site
aside:
postcount: 'Posts :'
pv: 'PV :'
uv: 'UV :'
runtime: 'Runtime :'
updatetime: 'Last update :'
wordcount: 'Word count :'
toc: Table of contents
tagmore: View all
avatar: Avatar
hello: Long time no see,
back: Welcome back again,
sticker: Mood sticker
newpost: New posts
newcomment: New comments
card:
posts: 'Posts:'
tags: 'Tags:'
categories: 'Categories:'
console:
comment_tip: Interaction
comment_title: Latest comments
tag_tip: Tags
tag_title: Find interesting areas
switch_darkmode: Day and night switching
switch_hideAside: Sidebar display control
switch_keyboard: Keyboard operation
switch_music: Music switch
archive_unit: Posts
recent_comment_more: Recent comments
newest_comment:
image: Image
link: Link
code: Code
emoji: Emoji
sidebar:
function: Function
darkmode: Display mode
footer:
description: Article from ${title}
learnmore: Learn more
randomlink: Links
rss: Subscribe
theme: Theme
cookies:
title: Agreement reminder assistant
tip: Check out the efforts we make to protect your privacy
privacy: How this site protects your privacy
music:
hit: Paused
404:
button: Back to home
link:
banner:
toComment: Application link
random: Random Visit
random: 'Click the button to visit a random link. The safety and availability of the destination website are not guaranteed. The random link for this visit is: ⌈ ${name} ⌋ '
to: To
keyboard:
title: Blog shortcuts
newest_comment:
error: Unable to get a comment, please confirm that the relevant configuration is correct.
zero: No comments.
comment:
title: ' Comment'
commentBarrage:
title: Hot
f12: Developer mode is turned on, please follow the GPL.
right_menu:
copy: Copy
paste: Paste
comment: ToTalk
new: Open
link: Copy
img: Copy
downloadImg: Download
search: Search
dark: Light
light: Dark
chs_to_cht: 轉為繁體
cht_to_chs: 转为简体
img_error: This image cannot be copied or downloaded.
barrage:
open: OpenBarrage
close: CloseBarrage
music:
start: Play
stop: Pause
back: Back
forward: Forward
copyMusicName: CopyName
pagination:
prev: Prev
next: Next
to: To page
about:
other:
oneself:
map_title: I live in
info_title1: Born
info_title2: Current occupation
tj:
tip: Data
title: Access statistics
post_tip: 'Stats from:'
personalities:
tip1: At
tip2: 'Learn more:'
message:
close: Hide message
open: Show message
+226
View File
@@ -0,0 +1,226 @@
more: More
star: Behold, those who found delight in this piece also perused
random: Random
upload: 'datetime: '
totalk: You don't need to delete blank lines, just type in your comments.
loading: Loading...
day: ' days'
theme:
dark: Dark
light: Light
copy:
success: Copied
error: Copy failed
copy_copyright:
author: Author
link: Link
source: 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.
time:
day: " days ago"
hour: " hours ago"
just: "just"
min: " minutes ago"
month: " months ago"
page:
tag: Tags
category: Categories
tags: All tags
categories: All categories
archives: Archives
404: Page not found
home:
home: Home
sticky: Sticky
new: New
read: Unread
recommendmore: More
archives: All articles
post:
reprint: Reprint
original: Original
cc: This article is a ${cc} article, pay attention to the copyright.
posted: Posted on
updated: Last updated on
wordcount: Word count
minread: Reading time
ip: The author's IP belongs to
pv: PV
comment: Comments
copyright:
reprint: This article is a reproduction or translation, and the copyright belongs to the original author. Please contact the original author for permission to republish this article.
original: This piece of writing is an original article, utilizing the
original_end: Agreement. For complete reproduction, please acknowledge the source as Courtesy of
share:
qq: Share to QQ
weibo: Share to Weibo
telegram: Share to Telegram
twitter: Share to Twitter
linkedin: Share to LinkedIn
facebook: Share to Facebook
link: Share to Link
qrcode: Share to QR code
whatsapp: Share to WhatsApp
ai:
title: Article Summary
tip: Complaints
nav:
next: Next
prev: Previous
nav:
site_name_title: Back to home
backtop: Back to top
travellings: Traveling - Friends Link
search: Search
randompost: Random post
console: Console
award:
thanks: Thanks
tipping: Sponsor
title: List of appreciation
search:
empty: No results found
hit: Found ${query} results for you
placeholder: Enter keywords to quickly search
count: Total <b>${count}</b> results.
head:
noscript: Please enable JavaScript to view the site
aside:
postcount: 'Posts :'
pv: 'PV :'
uv: 'UV :'
runtime: 'Runtime :'
updatetime: 'Last update :'
wordcount: 'Word count :'
toc: Table of contents
tagmore: View all
avatar: Avatar
hello: Long time no see,
back: Welcome back again,
sticker: Mood sticker
newpost: New posts
newcomment: New comments
card:
posts: 'Posts:'
tags: 'Tags:'
categories: 'Categories:'
console:
comment_tip: Interaction
comment_title: Latest comments
tag_tip: Tags
tag_title: Find interesting areas
switch_darkmode: Day and night switching
switch_hideAside: Sidebar display control
switch_keyboard: Keyboard operation
switch_music: Music switch
archive_unit: Posts
recent_comment_more: Recent comments
newest_comment:
image: Image
link: Link
code: Code
emoji: Emoji
sidebar:
function: Function
darkmode: Display mode
footer:
description: Article from ${title}
learnmore: Learn more
randomlink: Links
rss: Subscribe
theme: Theme
cookies:
title: Agreement reminder assistant
tip: Check out the efforts we make to protect your privacy
privacy: How this site protects your privacy
music:
hit: Paused
404:
button: Back to home
link:
banner:
toComment: Application link
random: Random Visit
random: 'Click the button to visit a random link. The safety and availability of the destination website are not guaranteed. The random link for this visit is: ⌈ ${name} ⌋ '
to: To
keyboard:
title: Blog shortcuts
newest_comment:
error: Unable to get a comment, please confirm that the relevant configuration is correct.
zero: No comments.
comment:
title: ' Comment'
commentBarrage:
title: Hot
f12: Developer mode is turned on, please follow the GPL.
right_menu:
copy: Copy
paste: Paste
comment: ToTalk
new: Open
link: Copy
img: Copy
downloadImg: Download
search: Search
dark: Light
light: Dark
chs_to_cht: 轉為繁體
cht_to_chs: 转为简体
img_error: This image cannot be copied or downloaded.
barrage:
open: OpenBarrage
close: CloseBarrage
music:
start: Play
stop: Pause
back: Back
forward: Forward
copyMusicName: CopyName
pagination:
prev: Prev
next: Next
to: To page
about:
other:
oneself:
map_title: I live in
info_title1: Born
info_title2: Current occupation
tj:
tip: Data
title: Access statistics
post_tip: 'Stats from:'
personalities:
tip1: At
tip2: 'Learn more:'
message:
close: Hide message
open: Show message
+228
View File
@@ -0,0 +1,228 @@
more: 更多
star: 喜欢这篇的人也看了
random: 随便逛逛
upload: 发布时间:
totalk: 无需删除空行,直接输入评论即可
loading: 加载中...
day: ' 天'
# Language: 简体中文
theme:
dark: 已切换至深色模式
light: 已切换至浅色模式
copy:
success: 复制成功
error: 复制失败
copy_copyright:
author: 作者
link: 链接
source: 来源
info: 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。
time:
day: "天前"
hour: "小时前"
just: "刚刚"
min: "分钟前"
month: "个月前"
page:
tag: 标签
category: 分类
tags: 全部标签
categories: 全部分类
archives: 文章
404: 页面没有找到
nav:
site_name_title: 返回博客主页
backtop: 返回顶部
travellings: 开往-友链接力
search: 搜索
randompost: 随机一篇文章
console: 中控台
home:
home: 首页
sticky: 置顶
new: 最新
read: 未读
recommend: 荐
recommendmore: 更多推荐
archives: 全部文章
post:
reprint: 转载或翻译
original: 原创
cc: 该文章为${cc}文章,注意版权协议
posted: 发布于
updated: 最后更新于
wordcount: 文章字数
minread: 阅读耗时
ip: 作者IP归属地为
pv: 文章热度
comment: 评论数
copyright:
reprint: 本文是转载或翻译文章,版权归原作者所有。转载本文请联系原作者。
original: 本文是原创文章,采用
original_end: 协议,完整转载请注明来自
share:
qq: 分享到QQ
weibo: 分享到微博
telegram: 分享到Telegram
twitter: 分享到Twitter
linkedin: 分享到LinkedIn
facebook: 分享到Facebook
link: 复制文章链接
qrcode: 使用手机扫码阅读这篇文章
whatsapp: 分享到WhatsApp
ai:
title: 文章摘要
tip: 投诉
nav:
next: 下一篇
prev: 上一篇
award:
thanks: 致谢
tipping: 赞赏作者
title: 赞赏名单
search:
empty: 找不到你查询的内容:${query}
hit: 找到 ${hits} 条结果,用时 ${time} 毫秒
placeholder: 输入关键词快速查找
count: 共 <b>${count}</b> 条结果。
head:
noscript: 开启JavaScript才能访问本站哦~
aside:
postcount: '文章总数 :'
pv: '总访问数 :'
uv: '总访客数 :'
runtime: '建站天数 :'
updatetime: '最后更新 :'
wordcount: '全站字数 :'
toc: 文章目录
tagmore: 查看全部
avatar: 头像
hello: 好久不见,
back: 欢迎再次回来,
sticker: 心情贴纸
newpost: 最近发布
newcomment: 最新评论
card:
posts: '累计文章数:'
tags: '标签总数:'
categories: '分类总数:'
console:
comment_tip: 互动
comment_title: 最新评论
tag_tip: 标签
tag_title: 寻找感兴趣的领域
switch_darkmode: 昼夜切换
switch_hideAside: 边栏显示控制
switch_keyboard: 键盘快捷键
switch_music: 音乐开关
archive_unit: 篇
recent_comment_more: 最近评论
newest_comment:
image: 图片
link: 链接
code: 代码
emoji: 表情
sidebar:
function: 功能
darkmode: 显示模式
footer:
description: 来自${title}的文章
learnmore: 了解更多
randomlink: 友链
rss: 订阅
theme: 主题
cookies:
title: 协议提醒助手
tip: 查看本站为你的个人隐私做出的努力
privacy: 本站如何保护你的隐私
music:
hit: 音乐已暂停
404:
button: 返回首页
link:
banner:
toComment: 申请友链
random: 随机访问
random: 点击前往按钮进入随机一个友链,不保证跳转网站的安全性和可用性。本次随机到的是本站友链:⌈ ${name} ⌋
to: 前往
keyboard:
title: 博客快捷键
newest_comment:
error: 无法获取评论,请确认相关配置是否正确。
zero: 没有评论
comment:
title: 评论
commentBarrage:
title: 热评
f12: 开发者模式已打开,请遵循GPL协议。
right_menu:
copy: 复制选中文本
paste: 粘贴文本
comment: 引用到评论
new: 新窗口打开
link: 复制链接地址
img: 复制此图片
downloadImg: 下载此图片
search: 站内搜索
dark: 浅色模式
light: 深色模式
chs_to_cht: 轉為繁體
cht_to_chs: 转为简体
img_error: 此图片无法复制与下载
barrage:
open: 显示热评
close: 关闭热评
music:
start: 播放音乐
stop: 暂停音乐
back: 切换到上一首
forward: 切换到下一首
copyMusicName: 复制歌名
pagination:
prev: 上一页
next: 下一页
to: 跳转到指定页面
about:
other:
oneself:
map_title: 我现在住在
info_title1: 生于
info_title2: 现在职业
tj:
tip: 数据
title: 访问统计
post_tip: 统计信息来自
personalities:
tip1: 在
tip2: 了解更多关于
message:
close: 隐藏弹幕
open: 显示弹幕
+226
View File
@@ -0,0 +1,226 @@
more: 更多
star: 喜歡這篇的人也看了
random: 随便逛逛
upload: 發佈時間:
totalk: 無需刪除空行,直接輸入評論即可
loading: 加載中...
day: ' 天'
# Language: 繁體中文 (台灣)
theme:
dark: 已切換至深色模式
light: 已切換至淺色模式
copy:
success: 複製成功
error: 複製失敗
copy_copyright:
author: 作者
link: 連結
source: 來源
info: 著作權歸作者所有。 商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
time:
day: "天前"
hour: "小時前"
just: "剛剛"
min: "分鐘前"
month: "個月前"
page:
tag: 標籤
category: 分類
tags: 全部標籤
categories: 全部分類
archives: 文章
404: 頁面沒有找到
nav:
site_name_title: 返回博客主頁
backtop: 返回頂部
travellings: 開往-友鏈接力
search: 搜索
randompost: 隨機一篇文章
console: 中控台
home:
home: 首頁
sticky: 置頂
new: 最新
read: 未讀
recommend: 荐
recommendmore: 更多推薦
archives: 全部文章
post:
reprint: 轉載或翻譯
original: 原創
cc: 該文章為${cc}文章,注意版權協議
posted: 發布於
updated: 最後更新於
wordcount: 文章字數
minread: 閱讀耗時
ip: 作者IP歸屬地為
pv: 文章熱度
comment: 評論數
copyright:
reprint: 本文是转载或翻译文章,版权归原作者所有。转载本文请联系原作者。
original: 本文是原创文章,采用
original_end: 协议,完整转载请注明来自
share:
qq: 分享到QQ
weibo: 分享到微博
telegram: 分享到Telegram
twitter: 分享到Twitter
linkedin: 分享到LinkedIn
facebook: 分享到Facebook
link: 复制文章链接
qrcode: 使用手机扫码阅读这篇文章
whatsapp: 分享到WhatsApp
ai:
title: 文章摘要
tip: 投訴
nav:
next: 下一篇
prev: 上一篇
award:
thanks: 致謝
tipping: 贊助作者
title: 讚賞名單
search:
empty: 找不到你查詢的內容:${query}
hit: 找到 ${hits} 條結果,用時 ${time} 毫秒
placeholder: 輸入關鍵詞快速查找
count: 共 <b>${count}<b> 條結果。
head:
noscript: 開啟JavaScript才能訪問本站哦~
aside:
postcount: '文章數:'
pv: '瀏覽量:'
uv: '訪客數:'
runtime: '運行時間:'
updatetime: '最後更新:'
wordcount: '字數統計:'
toc: 文章目錄
tagmore: 查看全部
avatar: 头像
hello: 好久不見,
back: 歡迎再次回來,
sticker: 心情贴纸
newpost: 最近发布
newcomment: 最新评论
card:
posts: '累計文章數:'
tags: '標籤總數:'
categories: '分類總數:'
console:
comment_tip: 互動
comment_title: 評論
tag_tip: 標籤
tag_title: 標籤
switch_darkmode: 昼夜切換
switch_hideAside: 边栏显示控制
switch_keyboard: 鍵盤快捷鍵
switch_music: 音樂開關
archive_unit: 篇
recent_comment_more: 最近評論
newest_comment:
image: 圖片
link: 連結
code: 代碼
emoji: 表情
sidebar:
function: 功能
darkmode: 顯示模式
footer:
description: 來自${title}的文章
learnmore: 了解更多
randomlink: 友鏈
rss: 訂閱
theme: 主題
cookies:
title: 協議提醒助手
tip: 查看本站為你的個人隱私做出的努力
privacy: 本站如何保護你的隱私
music:
hit: 音樂已暫停
404:
button: 返回首頁
link:
banner:
toComment: 申請友鏈
random: 點擊前往按鈕進入隨機一個友鏈,不保證跳轉網站的安全性和可用性。本次隨機到的是本站友鏈:⌈ ${name} ⌋
to: 前往
keyboard:
title: 博客快捷鍵
newest_comment:
error: 無法獲取評論,請確認相關配置是否正確。
zero: 沒有評論
comment:
title: 評論
commentBarrage:
title: 熱評
f12: 開發者模式已打開,請遵循GPL協定。
right_menu:
copy: 複製選中文本
paste: 粘貼文本
comment: 引用到評論
new: 新窗口打開
link: 複製連結位址
img: 複製此圖片
downloadImg: 下載此圖片
search: 站內搜索
dark: 淺色模式
light: 深色模式
chs_to_cht: 轉為繁體
cht_to_chs: 转为简体
img_error: 此圖片無法複製與下載
barrage:
open: 顯示熱評
close: 關閉熱評
music:
start: 播放音樂
stop: 暫停音樂
back: 切換到上一首
forward: 切換到下一首
copyMusicName: 複製歌名
pagination:
prev: 上一頁
next: 下一頁
to: 跳轉到指定頁面
about:
other:
oneself:
map_title: 我現在住在
info_title1: 生於
info_title2: 現在職業
tj:
tip: 數據
title: 訪問統計
post_tip: 統計信息來自
personalities:
tip1: 在
tip2: 瞭解更多關於
message:
close: 隱藏彈幕
open: 顯示彈幕
+24
View File
@@ -0,0 +1,24 @@
extends includes/layout.pug
block content
#error-wrap
.error-content
.error-img(style=`background-image: url(${url_for(theme.errorpage.img)})`)
.error-info
h1.error_title 404
.error_subtitle= theme.errorpage.text
a.button--animated(href=url_for("/"))
i.solitude.st-external-link
=_p('404.button')
if theme.errorpage.recommendList
.aside-list
.aside-list-group
each post, index in site.posts.sort('-date').data.slice(0, 6)
if index >= 5
break
.aside-list-item
a.thumbnail(href=url_for(post.path), title=post.title)
img(src=post.cover, alt=post.title)
.content
a.title(href=url_for(post.path), title=post.title)= post.title
+10
View File
@@ -0,0 +1,10 @@
extends includes/layout.pug
block content
main.layout#content-inner
#archive
.article-sort-title #{__('page.archives')}<sup>#{site.posts.find({ parent: { $exists: false } }).length}</sup>
.article-sort
include includes/mixins/articleSort
include includes/mixins/pagination
include includes/widgets/aside/aside
+12
View File
@@ -0,0 +1,12 @@
extends includes/layout.pug
block content
main.layout#content-inner
#category
#category-bar
include includes/widgets/home/categoryBar
.recent-posts#recent-posts
each post,index in page.posts.find({ parent: { $exists: false } }).data
include includes/widgets/home/postList
include includes/mixins/pagination
include includes/widgets/aside/aside
@@ -0,0 +1,9 @@
if theme.google_adsense && theme.google_adsense.enable
script(async src=theme.google_adsense.js onerror="document.querySelectorAll('.google-ads-warp').forEach(i => i.style.display='none')")
if theme.google_adsense.auto_ads
script.
(adsbygoogle = window.adsbygoogle || []).push({
google_ad_client: '!{theme.google_adsense.client}',
enable_page_level_ads: !{theme.google_adsense.enable_page_level_ads},
});
@@ -0,0 +1,38 @@
case theme.display_mode.type
when "auto"
script.
initTheme = () => {
let isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
const cachedMode = utils.saveToLocal.get('theme');
if (cachedMode === undefined) {
const nowMode =
isDarkMode ? 'dark' : 'light'
document.documentElement.setAttribute('data-theme', nowMode);
} else {
document.documentElement.setAttribute('data-theme', cachedMode);
}
typeof rm === 'object' && rm.mode(cachedMode === 'dark' && isDarkMode)
}
initTheme()
when "dark"
script.
initTheme = () => {
const cachedMode = utils.saveToLocal.get('theme');
if (cachedMode === undefined)
document.documentElement.setAttribute('data-theme', 'dark');
else
document.documentElement.setAttribute('data-theme', cachedMode);
typeof rm === 'object' && rm.mode(cachedMode === undefined || cachedMode === 'dark')
}
initTheme()
when "light"
script.
initTheme = () => {
const cachedMode = utils.saveToLocal.get('theme');
if (cachedMode === undefined)
document.documentElement.setAttribute('data-theme', 'light');
else
document.documentElement.setAttribute('data-theme', cachedMode);
typeof rm === 'object' && rm.mode(cachedMode === 'dark')
}
initTheme()
@@ -0,0 +1,51 @@
div#console
div.close-btn(onclick="sco.hideConsole()")
i.solitude.st-close-fill
if theme.console_plus
div.console-card-group
if theme.recent_comments.enable && theme.recent_comments.img
div.console-card-group-left
div.console-card#card-newest-comments(onclick="sco.hideConsole()")
div.card-content
div.author-content-item-tips= _p('console.comment_tip')
div.author-content-item-title
| #{_p('console.comment_title')}
if theme.recent_comments.enable
a.recent-comment-more(href=url_for(theme.recent_comments.page) title=_p('console.recent_comment_more'))
i.solitude.st-right-btn-fill
a.recent-comment-image(href=url_for(theme.recent_comments.page))
img(src=theme.recent_comments.img)
div.console-card-group-right
div.console-card.tags(onclick="sco.hideConsole()")
div.card-content
div.author-content-item-tips= _p('console.tag_tip')
div.author-content-item-title= _p('console.tag_title')
div.card-tag-cloud
each tag in site.tags.find({ parent: { $exists: false } }).data
a(href=url_for(tag.path))= tag.name
sup= tag.length
div.console-card.history(onclick="sco.hideConsole()")
include ./widgets/aside/asideArchive.pug
div.button-group
div.console-btn-item
span.darkmode_switchbutton(onclick="sco.switchDarkMode()", title=_p('console.switch_darkmode'))
i.solitude.st-moon-clear-fill
div.console-btn-item#consoleHideAside
span.asideSwitch(onclick="sco.switchHideAside()", title=_p('console.switch_hideAside'))
i.solitude.st-side-bar-fill
if theme.keyboard.enable
div.console-btn-item#consoleKeyboard(onclick="sco.switchKeyboard()")
span.keyboardSwitch(title=_p('console.switch_keyboard'))
i.solitude.st-keyboard-box-fill
if theme.capsule.enable
div.console-btn-item#consoleMusic(onclick="sco.musicToggle()")
span.music-switch(title=_p('console.switch_music'))
i.solitude.st-disc-fill
if theme.comment.use && theme.comment.commentBarrage
div.console-btn-item.on#consoleCommentBarrage(onclick="sco.switchCommentBarrage()")
span.commentBarrage
i.solitude.st-chat-fill
div.console-mask(onclick="sco.hideConsole()")
@@ -0,0 +1,72 @@
if theme.post.footer.enable && is_post()
div#st-footer-bar
div.footer-logo
if theme.site.name.class === 'i_class'
i.solitude(class=theme.site.name.custom)
else if theme.site.name.class === 'img'
img.solitude.nolazyload(src=url_for(theme.site.name.custom))
else if theme.site.name.class === 'text'
span= theme.site.name.custom
div.footer-bar-description=theme.post.footer.desc
if theme.post.footer.button.enable
a.footer-bar-link(href=url_for(theme.post.footer.button.url))= theme.post.footer.button.name
div#footer_deal
- var leftInfo = theme.footer && theme.footer.information && theme.footer.information.left || {}
- var rightInfo = theme.footer && theme.footer.information && theme.footer.information.right || {}
each value, label in leftInfo
- var array = value.split('||')
a.deal_link(href=url_for(trim(array[0])), title=label)
i.solitude(class=array[1])
if theme.footer.information.author
div#footer_mini_logo.nolazyload.footer_mini_logo(title=_p('nav.backtop'), onclick="sco.toTop()")
img(src=theme.site.icon, alt=_p('nav.backtop'))
each value, label in rightInfo
- var array = value.split('||')
a.deal_link(href=url_for(trim(array[0])), title=label)
i.solitude(class=array[1])
div#st-footer
- var group = theme.footer && theme.footer.group ? theme.footer.group : {}
each value, x in group
div.footer-group
h3.footer-title= x
div.footer-links
each url, y in value
a.footer-item(href=url_for(url), title=y)= y
if theme.footer && theme.footer.randomlink
div.footer-group
div.footer-title-group
h3.footer-title= _p('footer.randomlink')
button.random-friends-btn(onclick='randomLinksList()', title=_p('footer.randomlink'))
i.solitude.st-refresh-line
div.footer-links#friend-links-in-footer
div#footer-bar
div.footer-bar-links
div.footer-bar-left
if moment(theme.aside.siteinfo.runtime).year() === new Date().getFullYear()
div.copyright © #{moment(theme.aside.siteinfo.runtime).year()} By&nbsp;
a.footer-bar-link(href=url_for("/"))= config.author
else
div.copyright © #{moment(theme.aside.siteinfo.runtime).year()} - #{new Date().getFullYear()} By&nbsp;
a.footer-bar-link(href=url_for("/"))= config.author
div.footer-bar-right
each item in theme.footer.links
a.footer-bar-link(href=url_for(item.url), alt=item.name)!= item.name
a.footer-bar-link.cc(href=url_for(theme.footer.license), aria-label = 'copyright')
i.solitude.st-copyright-line
i.solitude.st-creative-commons-by-line
i.solitude.st-creative-commons-nc-line
i.solitude.st-creative-commons-nd-line
if theme.footer.privacy
div.needEndHide#cookies-window
div.cookies-window-title= __('cookies.title')
div.cookies-window-content
span.cookies-tip= __('cookies.tip')
a.cookies-link(href=url_for(theme.footer.privacy), title=_p('cookies.privacy'))
i.solitude.st-right-btn-fill
if theme.comment.use && theme.comment.commentBarrage
div.comment-barrage.needEndHide
+32
View File
@@ -0,0 +1,32 @@
- let title = page.title, subtitle =''
- if (is_home()) title = config.title
- else if (is_archive()) title = _p('page.archives') + (page.year || "")
- else if (is_tag()) title = _p('page.tag')+': ' + page.tag
- else if (is_category()) title = _p('page.category') +': ' + page.category
- else if (page.type === '404') title = _p('page.404')
- else if (page.type === 'tags') title = _p('page.tags')
- else if (page.type === 'categories') title = _p('page.categories')
- else if (is_post() || is_page()) title = page.title
- if (is_home()) subtitle = config.subtitle ? ' - ' + config.subtitle : ''
- else subtitle = title ? ' | ' + config.title : config.title
meta(charset="utf-8")
meta(http-equiv="X-UA-Compatible", content="IE=edge")
meta(name="viewport" content="width=device-width, initial-scale=1")
title= title + subtitle
noscript= _p('head.noscript')
link(rel="icon", href=url_for(theme.site.siteIcon))
// index.css
link(rel="stylesheet", href=url_for(theme.cdn.main_css))
// inject head
include ./inject/head.pug
// global head
include ./head/config.pug
// page-config head
include ./head/page_config
@@ -0,0 +1,166 @@
-
if (theme.search.enable) {
var localSearch = 'undefined';
var algolia = 'undefined';
switch (theme.search.type) {
case 'local':
localSearch = JSON.stringify({
preload: theme.search.local.preload,
path: theme?.search?.local?.CDN || '/search.xml'
});
break;
case 'algolia':
algolia = JSON.stringify({
appId: config.algolia.appId || config.algolia.applicationID,
apiKey: config.algolia.apiKey,
indexName: config.algolia.indexName,
hits: {
per_page: theme?.search?.algolia?.hits?.per_page || 10
}
});
break;
}
}
const sayhello2 = theme.aside?.card?.sayhello2?.map(item => `"${item}"`) || [];
const [hello_prefix, hello_back] = [_p('aside.hello'), _p('aside.back')];
let comment = false
if (theme.comment.use && theme.comment.commentBarrage) {
comment = {
avatar: theme.comment.avatar,
commentBarrage: theme.comment.commentBarrage,
}
}
let post_ai = false
if (theme.post_ai.enable) {
post_ai = JSON.stringify({
key: theme.post_ai.key,
talk: theme.post_ai.talk,
randomPost: theme.post_ai.randomPost,
})
}
let copyright = false;
if (theme.copy.enable && theme.copy.copyright.enable) {
copyright = JSON.stringify({
limit: theme.copy.copyright.limit,
author: _p("copy_copyright.author") + ': ' + config.author,
link: _p("copy_copyright.link") + ': ',
source: _p("copy_copyright.source") + ': ' + config.title,
info: _p("copy_copyright.info")
})
}
let lang = false
lang = {
theme: {
dark: _p('theme.dark'),
light: _p('theme.light'),
},
copy: {
success: _p('copy.success'),
error: _p('copy.error'),
},
backtop: _p('nav.backtop'),
time: {
day: _p('time.day'),
hour: _p('time.hour'),
just: _p('time.just'),
min: _p('time.min'),
month: _p('time.month')
},
day: _p('day'),
f12: _p('f12'),
totalk: _p('totalk')
}
if (theme.search.enable) {
lang.search = {
empty: _p('search.empty'),
hit: _p('search.hit'),
placeholder: _p('search.placeholder'),
count: _p('search.count')
}
}
if (theme.comment.use && theme.comment.commentBarrage) {
lang.barrage = {
title: _p('commentBarrage.title'),
}
}
let rightMenu = false
if (theme.right_menu.enable) {
rightMenu = {
mode: {
dark: _p('right_menu.light'),
light: _p('right_menu.dark'),
},
img_error: _p('right_menu.img_error')
}
if (theme.capsule.enable) {
rightMenu.music = {
start: _p('right_menu.music.start'),
stop: _p('right_menu.music.stop'),
}
}
if (theme.comment.use && theme.comment.commentBarrage) {
rightMenu.barrage = {
open: _p('right_menu.barrage.open'),
close: _p('right_menu.barrage.close')
}
}
if (theme.right_menu.translate.enable) {
rightMenu.translate = {
translateDelay: theme.right_menu.translate.translateDelay,
defaultEncoding: theme.right_menu.translate.defaultEncoding
}
}
}
script.
const GLOBAL_CONFIG = {
root: '!{config.root}',
algolia: !{algolia ? algolia : 'undefined'},
localsearch: !{localSearch ? localSearch : 'undefined'},
runtime: '!{theme.aside.siteinfo.runtimeenable ? theme.aside.siteinfo.runtime : false}',
lazyload: {
enable: !{theme.lazyload.enable},
error: '!{theme.lazyload.errorimg}'
},
copyright: !{copyright},
highlight: {
enable: !{theme.highlight.enable},
limit: !{theme.highlight.limit},
expand: !{theme.highlight.expand},
copy: !{theme.highlight.copy},
syntax: '!{config.syntax_highlighter}'
},
randomlink: !{theme.footer.randomlink},
lang: !{JSON.stringify(lang)},
aside: {
sayhello: {
morning: '!{theme.aside.card.sayhello.morning}',
noon: '!{theme.aside.card.sayhello.noon}',
afternoon: '!{theme.aside.card.sayhello.afternoon}',
night: '!{theme.aside.card.sayhello.night}',
goodnight: '!{theme.aside.card.sayhello.goodnight}',
},
sayhello2: [!{sayhello2}],
sayhello3: {
prefix: '!{hello_prefix}',
back: '!{hello_back}',
},
},
covercolor: {
enable: !{theme.post.covercolor.enable}
},
comment: !{comment ? JSON.stringify(comment) : false},
lightbox: '!{ theme.mediumZoom ? "mediumZoom" : (theme.fancybox ? "fancybox" : "null")}',
post_ai: !{post_ai},
right_menu: !{rightMenu ? JSON.stringify(rightMenu) : false},
};
@@ -0,0 +1,13 @@
if theme.OpenGraph.enable
-
const coverVal = page.cover || theme.site.siteIcon
let ogOption = {
type: is_post() ? 'article' : 'website',
image: coverVal ? full_url_for(coverVal) : '',
...theme.OpenGraph.options
}
-
!= open_graph(ogOption)
meta(name="description" content=page_description())
else
meta(name="description" content=page_description())
@@ -0,0 +1,10 @@
script#config-diff.
var PAGE_CONFIG = {
is_post: !{is_post()},
is_page: !{!is_post() && !is_home()},
is_home: !{is_home()},
page: '!{page.type}',
toc: !{!!page.toc},
comment: !{!!page.comment},
ai_text: !{is_post && page.ai_text ? "'"+ page.ai_text+"'" : false}
}
@@ -0,0 +1,22 @@
if theme.pwa.enable
meta(name="theme-color", content=theme.pwa.theme_color)
meta(name="apple-mobile-web-app-status-bar-style", content=theme.pwa.theme_color)
link(rel="manifest" href=url_for(theme.pwa.manifest))
if theme.pwa.theme_color
meta(name="msapplication-TileColor" content=theme.pwa.theme_color)
if theme.pwa.mask_icon
link(rel="mask-icon", href=url_for(theme.pwa.mask_icon), color=theme.pwa.theme_color)
if theme.pwa.apple_touch_icon
link(rel="apple-touch-icon" sizes="180x180" href=url_for(theme.pwa.apple_touch_icon))
if theme.pwa.favicon_16_16
link(rel="icon", type="image/png", sizes="16x16", href=url_for(theme.pwa.favicon_16_16))
if theme.pwa.favicon_32_32
link(rel="icon", type="image/png", sizes="32x32", href=url_for(theme.pwa.favicon_32_32))
if theme.pwa.bookmark_icon
link(rel="bookmark", href=url_for(theme.pwa.bookmark_icon))
else
meta(name="apple-mobile-web-app-capable", content=config.title)
meta(name="theme-color", content="var(--efu-main)")
meta(name="apple-mobile-web-app-status-bar-style", content="var(--efu-main)")
link(rel="bookmark", href=url_for(theme.site.siteIcon))
link(rel="apple-touch-icon", href=url_for(theme.site.siteIcon), sizes="180x180")
@@ -0,0 +1,4 @@
header#page-header(class=is_post() ? 'post-bg' : 'not-top-img')
include ./nav.pug
if is_post()
include ./widgets/post/postMeta.pug
@@ -0,0 +1,117 @@
- page.type = is_post() ? 'post' : page.type
mixin katex
if theme.katex.copytex
script(src=url_for(theme.cdn.katex_copytex))
script.
(() => {
document.querySelectorAll('#article-container span.katex-display').forEach(item => {
utils.wrap(item, 'div', {class: 'katex-wrap'})
})
})();
div
script(src=url_for(theme.cdn.utils))
script(src=url_for(theme.cdn.main))
script(src=url_for(theme.cdn.waterfall))
script(src=url_for(theme.cdn.pjax))
if theme.mermaid
script(src=url_for(theme.cdn.mermaid_js))
if theme.post.share.enable && theme.post.share.list && theme.post.share.list.includes('qrcode')
script(src=url_for(theme.cdn.qrcode))
if theme.display_mode.universe
script(src=url_for(theme.cdn.universe_js))
script.
dark()
if theme.right_menu.enable && theme.right_menu.translate.enable
script(src=url_for(theme.cdn.translate_js))
if theme.katex && theme.katex.enable
if theme.katex.per_page && (is_post() || is_page())
+katex
else if page.katex
+katex
if theme.lazyload.enable
script(src=url_for(theme.cdn.lazyload))
script(src=url_for(theme.cdn.snackbar))
if theme.lightbox
if theme.mediumZoom
script(src=url_for(theme.cdn.medium_zoom))
if theme.fancybox
script(src=url_for(theme.cdn.fancyapps_ui))
if (theme.says.home_mini && theme.says.enable) || theme.carousel
script(src=url_for(theme.cdn.swiper_js))
if theme.post_ai.enable
script(src=url_for(theme.cdn.efu_ai))
if theme.capsule.enable || theme.music.enable || theme.says.enable
script.
var meting_api = '!{theme.meting_api}';
script(src=url_for(theme.cdn.aplayer_js))
script(src=url_for(theme.cdn.meting_js))
if theme.post.covercolor.enable
case theme.post.covercolor.mode
when 'local'
script(src=url_for(theme.cdn.cover_local))
when 'api'
script.
const coverColorConfig = {
api: '!{theme.post.covercolor.api}',
time: !{theme.post.covercolor.time}
}
script(src=url_for(theme.cdn.cover_api))
if theme.loading.pace
script(src=url_for(theme.cdn.pace_js))
if theme.search.enable && theme.search.type === "algolia"
script(src=url_for(theme.cdn.instantsearch))
script(src=url_for(theme.cdn.algolia_search))
if theme.right_menu.enable
script(src=url_for(theme.cdn.right_menu_js))
if theme.extends.body
each item in theme.extends.body
!= item
.js-pjax
if is_home() && theme.says.enable && theme.says.home_mini
script.
sco.initbbtalk()
if page.type === 'says' && theme.says.enable
script.
GLOBAL_CONFIG.lightbox && utils.lightbox(document.querySelectorAll(".bber-content-img img"));
sco.changeTimeFormat(document.querySelectorAll('.bber-info-time time'))
if comment_js
include ../widgets/third-party/comments/js
if theme.mermaid
script.
mermaid.run();
if is_home() && theme.carousel && site.posts.data.filter(item => item.recommend === true).slice(0, 6) || false
script.
carousel_swiper()
if theme.busuanzi && (theme.aside.siteinfo.uv || theme.aside.siteinfo.pv)
if theme.busuanzi_use === 0
script(defer pjax src=url_for(theme.cdn.busuanzi_js))
else
script(defer pjax src=url_for(theme.cdn.busuanzi_qj_js))
if theme.footer.randomlink
include ../widgets/randomlink.pug
// pjax
!= partial("includes/widgets/third-party/pjax", {}, {cache: true})
// theme
include ../body/mode
// google adsense
include ../body/gadsense
@@ -0,0 +1,52 @@
each item in theme.verify_site || []
meta(name=item.name, content=item.content)
link(rel="canonical" href=urlNoIndex())
link(rel="stylesheet", href=url_for(theme.cdn.solitude_css))
// aplayer
if theme.capsule.enable || theme.music.enable
link(rel="stylesheet", href=url_for(theme.cdn.aplayer_css))
// swiper
if (theme.says.home_mini && theme.says.enable) || theme.carousel
link(rel="stylesheet", href=url_for(theme.cdn.swiper_css))
// fancybox ui
if theme.lightbox && theme.fancybox
link(rel="stylesheet", href=url_for(theme.cdn.fancyapps_css))
// katex
if theme.katex && theme.katex.enable
link(rel="stylesheet", href=url_for(theme.cdn.katex))
// Open Graph
include ../head/opengraph.pug
// pwa
include ../head/pwa.pug
script.
console.log(
"%c Program: Hexo %c Theme: Solitude %c Version: v1.12.2",
"border-radius:5px 0 0 5px;padding: 5px 10px;color:white;background:#ff3842;",
"padding: 5px 10px;color:white;background:#3e9f50;",
"padding: 5px 10px;color:white;background:#0084ff;border-radius:0 5px 5px 0",
)
if theme.memorial.enable
script.
let mdate = "!{theme.memorial.date}";
mdate = (mdate.split(","));
let ndate = new Date();
for (let i of mdate) {
if (i === (ndate.getMonth()+1) + "-" + (ndate.getDate())) {
document.documentElement.classList.add('memorial');
}
}
if theme.extends.head
each item in theme.extends.head
!= item
!=fragment_cache('injectHeadJs', function(){return inject_head_js()})
@@ -0,0 +1,65 @@
- const list = theme.keyboard.list || []
#keyboard-tips
.keyboardTitle=_p('keyboard.title')
.keyboardList
each item in list
.keyboardItem
.keyGroup
.key= 'Shift'
.key= item.key
.keyContent
.content= item.name
script.
const keyboard_addKeyup = (e) => {
if (e.key === 'Shift') {
document.getElementById('keyboard-tips').classList.remove('show');
}
}
const keyboard_addKeydown = (e) => {
const keyboards = !{JSON.stringify(list)};
if (e.keyCode === 16) {
document.getElementById('keyboard-tips').classList.add('show');
}
for (let i = 0; i < keyboards.length; i++) {
if (keyboards[i].url) {
if (keyboards[i].url.startsWith('http')) {
if (e.key === keyboards[i].key) {
window.open(keyboards[i].url);
}
} else {
if (e.key === keyboards[i].key) {
pjax.loadUrl(keyboards[i].url);
}
}
} else if (keyboards[i].sco) {
if (e.key === keyboards[i].key) {
sco[keyboards[i].sco]();
}
} else if (keyboards[i].func) {
if (e.key === keyboards[i].key) {
window[keyboards[i].func]();
}
}
}
}
function openKeyboard() {
window.addEventListener('keyup', keyboard_addKeyup);
window.addEventListener('keydown', keyboard_addKeydown);
}
function closeKeyboard() {
window.removeEventListener('keyup', keyboard_addKeyup);
window.removeEventListener('keydown', keyboard_addKeydown);
}
var sco_keyboards = localStorage.getItem('keyboard') === 'true'
if (sco_keyboards) {
openKeyboard();
document.getElementById('consoleKeyboard').classList.add('on');
}
@@ -0,0 +1,54 @@
- page.type = is_home() ? 'solitude' : page.type
doctype html
html(lang=config.language, data-theme="light")
head
include ./head.pug
body#body(data-type=page.type)
// universe
if theme.display_mode.universe
canvas#universe
// loading
if theme.loading.fullpage
include ./loading.pug
// console
include ./console.pug
// sidebar
include ./sidebar.pug
// keyboard
if theme.keyboard.enable
include ./keyboard.pug
#body-wrap(class = is_post() ? 'post' : 'page')
include ./header.pug
if(page.type !== '404')
block content
footer#footer
include ./footer.pug
else
.error#body-wrap
block content
// right_menu
if theme.right_menu.enable
include rightmenu
// inject body
include ./inject/body.pug
// search
include ./widgets/third-party/search/index.pug
// Tianli-Talk
if theme.tianli_talk.enable
include ./widgets/third-party/tianli-talk.pug
// music
if theme.capsule.enable
include ./widgets/third-party/music.pug
@@ -0,0 +1,25 @@
div(id="loading-box" onclick="preloader.endLoading();" style="zoom:1")
div.loading-bg
img.loading-img.nolazyload(src=url_for(theme.site.icon), alt="loading image")
script.
const preloader = {
endLoading: () => {
document.getElementById('loading-box').classList.toggle('loaded');
},
initLoading: () => {
document.getElementById('loading-box').classList.remove('loaded');
},
removePaceDone: () => {
document.getElementById('body').classList = 'pace-done';
}
}
window.addEventListener('load', () => {
preloader.endLoading();
});
window.addEventListener('pjax:send', () => {
preloader.initLoading();
});
document.addEventListener('pjax:complete', () => {
preloader.endLoading();
});
@@ -0,0 +1,14 @@
- let year
each post in page.posts.find({ parent: { $exists: false } }).data
if(year !== post.date.year())
- year = post.date.year()
.article-sort-item.year #{year}
.article-sort-item
a.article-sort-item-img(href=url_for(post.path) title=post.title)
img(src=post.cover alt=post.title)
.article-sort-item-info
a.article-sort-item-title(href=url_for(post.path) title=post.title onclick="window.event.cancelBubble=true;") #{post.title}
.article-sort-item-tags
each tags in post.tags.data
a.article-meta__tags(href=url_for(tags.path) onclick="window.event.cancelBubble=true;")
span.tags-punctuation #{tags.name}
@@ -0,0 +1,8 @@
nav#pagination
div.pagination
- var options = {mid_size: 1,escape: false,next_text: `<div class="pagination_tips_next">${_p("pagination.next")}</div> <i class="solitude st-arrow-right-bold"></i>`,prev_text: `<i class="solitude st-arrow-left-bold"></i> <div class="pagination_tips_prev">${_p("pagination.prev")}</div>`}
!=paginator(options)
div.toPageGroup
input#toPageText(oninput="value=value.replace(/[^0-9]/g,'')" maxlength="3" title=_p('pagination.to') onkeyup="if (this.value === '0') this.value = ''")
a#toPageButton(onclick="sco.toPage()")
i.solitude.st-show-right-line
+22
View File
@@ -0,0 +1,22 @@
nav#nav.show
#nav-group
#blog_name
if theme.nav.group
.back-home-button(tabindex="-1")
i.back-home-button-icon.solitude.st-more-fill
include ./widgets/nav/group
a#site-name(href=url_for("/"), title=_p('nav.site_name_title'))
if theme.site.name.class === 'i_class'
i.solitude(class=theme.site.name.custom, style="font-size: 16px;")
else if theme.site.name.class === 'img'
img(src=theme.site.name.custom, alt=config.title)
else if theme.site.name.class === 'text'
span.title= theme.site.name.custom
#page-name-mask
#page-name
a#page-name-text(onclick="sco.toTop()")= title || config.title
#menus
include ./widgets/nav/menu.pug
#nav-left
#nav-right
include ./widgets/nav/right.pug
@@ -0,0 +1,11 @@
if site.data.about
#about-page
include ../widgets/page/about/authorinfo
include ../widgets/page/about/contentinfo
include ../widgets/page/about/skillsinfo
include ../widgets/page/about/personalities
include ../widgets/page/about/motto
include ../widgets/page/about/hobbies
include ../widgets/page/about/other
include ../widgets/page/about/tenyear
include ../widgets/page/about/award
@@ -0,0 +1,8 @@
h1.page-title= _p('page.category')
.category-lists
.tag-cloud-list.is-center
each item in site.categories.find({ parent: { $exists: false } }).data
a(href=url_for(item.path))
span.tags-punctuation
= item.name
span.tagsPageCount= item.length
@@ -0,0 +1,2 @@
#article-container
!= page.content
@@ -0,0 +1,2 @@
include ../widgets/page/banner
include ../widgets/page/equipment/content
@@ -0,0 +1,14 @@
.flink#banners
include ../widgets/page/links/banner
.flink#article-container
each data in site.data.links.links
h2= data.class_name + " (" + data.link_list.length + ")"
.flink-desc= data.descr
case data.type
when 'card'
include ../widgets/page/links/linksCard
when 'item'
include ../widgets/page/links/linksItem
when 'discn'
include ../widgets/page/links/linksDiscn
!= page.content
@@ -0,0 +1,5 @@
- const { line,speed,hover,loop,enable } = theme.envelope
include ../widgets/page/message/content
if enable
include ../widgets/page/message/js
@@ -0,0 +1,11 @@
if theme.music.enable
#Music-bg
#Music-page
meting-js(id=theme.music.id server=theme.music.server type=theme.music.type mutex=theme.music.mutex ? "true" : "false" volume=theme.music.volume preload="none" data-lrctype="0" order="random")
.Music-loading
div APlayer加载中...
script(pjax).
(async function () {
if (typeof initializeMusicPlayer === "undefined") await utils.getScript('!{url_for(theme.cdn.music_js)}').then(() => initializeMusicPlayer())
else initializeMusicPlayer()
})()
@@ -0,0 +1,16 @@
- const { enable, limit, cache } = theme.recent_comments
- const {use, avatar} = theme.comment
include ../widgets/page/banner
if enable && use
#comments-page
case use[0]
when 'Twikoo'
include ../widgets/page/recentcomment/twikoo
when 'Valine'
include ../widgets/page/recentcomment/valine
when 'Waline'
include ../widgets/page/recentcomment/waline
when 'Artalk'
include ../widgets/page/recentcomment/artalk
@@ -0,0 +1,58 @@
include ../widgets/page/banner
if theme.says.enable
#bber
section.timeline.page-1
ul.list.waterfall
each item in site.data.essay.essay_list.slice(0, theme.says.strip)
li.item
if theme.says.style === 2
.meta
img.avatar(src=theme.aside.card.author.img)
.info
span.bber_nick= config.author
time.datetime.bber_date(datetime=moment(item.date).format())
if item.content
a.bber-reply.goComment(onclick=`sco.toTalk('${item.content}')`)
i.solitude.st-chat-fill
#bber-content
p.datacont= item.content
if item.image
.bber-content-img
each img in item.image
img(src=img alt="image")
if item.aplayer
.bber-music
meting-js(server=item.aplayer.server type="song" id=item.aplayer.id mutex="true" preload="none" theme="var(--efu-main)" data-lrctype="0")
if item.video
.bber-video
if item.video.player
video(src=item.video.player controls="controls" style="object-fit: cover;")
if item.video.bilibili
iframe(src='//player.bilibili.com/player.html?autoplay=0&bvid=' + item.video.bilibili scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true")
if theme.says.style === 1
hr
.bber-bottom
.bber-info
.bber-info-time
i.solitude.st-calendar-todo-fill
time.datetime(datetime=moment(item.date).format())
if item.location
.bber-info-location
i.solitude.st-map-pin-fill
| #{item.location}
if item.link
a.bber-content-link(href=url_for(item.link) target="_blank")
i.solitude.st-link-m-line
| 链接
if item.content
a.bber-reply(onclick=`sco.toTalk('${item.content}')`)
i.solitude.st-chat-fill
#bber-tips
if theme.says.strip === -1
| - 已展开所有短文 -
else
| - 只展示最近 #{theme.says.strip} 条短文 -
@@ -0,0 +1,8 @@
h1.page-title= __('page.tag')
.category-lists
.tag-cloud-list.is-center
each tag in site.tags.find({ parent: { $exists: false } }).data
a(href=url_for(tag.path))
span.tags-punctuation
= tag.name
span.tagsPageCount= tag.length
@@ -0,0 +1,13 @@
include ../widgets/page/banner
.flink#article-container
each data in site.data.tlink.links
h2= data.class_name + " (" + data.link_list.length + ")"
.flink-desc= data.descr
case data.type
when 'card'
include ../widgets/page/links/linksCard
when 'item'
include ../widgets/page/links/linksItem
when 'discn'
include ../widgets/page/links/linksDiscn
!= page.content
@@ -0,0 +1,80 @@
- let custom_list = theme.right_menu.custom_list || []
div#rightMenu
div.rightMenu-group.rightMenu-small
div.rightMenu-item#menu-backward
i.solitude.st-arrow-left-line
div.rightMenu-item#menu-forward
i.solitude.st-arrow-right-line
div.rightMenu-item#menu-refresh
i.solitude.st-restart-line
div.rightMenu-item#menu-top
i.solitude.st-arrow-up-line
div.rightMenu-group.rightMenu-line.rightMenuPlugin
div.rightMenu-item#menu-copytext
i.solitude.st-copy-fill
span= _p('right_menu.copy')
div.rightMenu-item#menu-pastetext
i.solitude.st-clipboard-fill
span= _p('right_menu.paste')
if theme.comment.use
div.rightMenu-item#menu-commenttext
i.solitude.st-chat-new-fill
span= _p('right_menu.comment')
div.rightMenu-item#menu-newwindow
i.solitude.st-window-fill
span= _p('right_menu.new')
div.rightMenu-item#menu-copylink
i.solitude.st-link-line
span= _p('right_menu.link')
div.rightMenu-item#menu-copyimg
i.solitude.st-copy-fill
span= _p('right_menu.img')
div.rightMenu-item#menu-downloadimg
i.solitude.st-download-cloud-fill
span= _p('right_menu.downloadImg')
if theme.search.enable
div.rightMenu-item#menu-search
i.solitude.st-search-line
span= _p('right_menu.search')
if theme.capsule.enable
div.rightMenu-item#menu-music-toggle
i.solitude.st-play-fill
span= _p('right_menu.music.start')
div.rightMenu-item#menu-music-back
i.solitude.st-skip-back-fill
span= _p('right_menu.music.back')
div.rightMenu-item#menu-music-forward
i.solitude.st-skip-forward-fill
span= _p('right_menu.music.forward')
div.rightMenu-item#menu-music-copyMusicName
i.solitude.st-copy-fill
span= _p('right_menu.music.copyMusicName')
div.rightMenu-group.rightMenu-line.rightMenuOther
each item,index in custom_list
div.rightMenu-item(id=item.id class=item.class onclick=item.click+'||rm.hideRightMenu()')
i.solitude(class=item.icon)
span= item.name
div.rightMenu-group.rightMenu-line.rightMenuOther
if theme.right_menu.commentBarrage && theme.comment.use && theme.comment.commentBarrage
div.rightMenu-item#menu-commentBarrage(onclick="sco.switchCommentBarrage()")
i.solitude.st-chat-fill
span.menu-commentBarrage-text= _p('right_menu.barrage.close')
div.rightMenu-item#menu-darkmode(onclick="sco.switchDarkMode()")
i.solitude.st-moon-clear-fill
case theme.display_mode.type
when 'auto'
when 'light'
span.menu-darkmode-text= _p('right_menu.light')
when 'dark'
span.menu-darkmode-text= _p('right_menu.dark')
if theme.right_menu.translate.enable
div.rightMenu-item#menu-translate
case theme.right_menu.translate.defaultEncoding
when 2
i.solitude.st-panben-line
span= _p('right_menu.chs_to_cht')
when 1
i.solitude.st-jianben-line
span= _p('right_menu.cht_to_chs')
div#rightmenu-mask
@@ -0,0 +1,32 @@
div#sidebar(style="zoom: 1;")
div#menu-mask(style="display: none;")
div#sidebar-menus
.site-data
.data-item.is-center
.data-item-link
a(href=url_for('/archives/'))
.headline=_p('page.archives')
.length-num=site.posts.find({ parent: { $exists: false } }).length
.data-item.is-center
.data-item-link
a(href=url_for('/categories/'))
.headline=_p('page.category')
.length-num=site.categories.find({parent: {$exists: false}}).length
.data-item.is-center
.data-item-link
a(href=url_for('/tags/'))
.headline=_p('page.tag')
.length-num=site.tags.find({parent: {$exists: false}}).length
span.sidebar-menu-item-title= __('sidebar.function')
div.sidebar-menu-item
span.darkmode_switchbutton.menu-child(onclick="sco.switchDarkMode()")
i.solitude.st-moon-clear-fill
span= __('sidebar.darkmode')
include ./widgets/nav/group
include ./widgets/nav/menu.pug
span.sidebar-menu-item-title= __('page.tag')
div.card-widget.card-tags.card-archives.card-webinfo.card-allinfo
div.card-tag-cloud
each tag in site.tags.find({ parent: { $exists: false } }).data
a(href=url_for(tag.path))= tag.name
sup= tag.length
@@ -0,0 +1,18 @@
.aside-content#aside-content
- var noSticky, Sticky
if(is_home())
- noSticky = theme.aside.home.noSticky.split(',')
- Sticky = theme.aside.home.Sticky.split(',')
else if(is_post())
- noSticky = theme.aside.post.noSticky.split(',')
- Sticky = theme.aside.post.Sticky.split(',')
else if(is_page() || is_archive() || is_tag() || is_category())
- noSticky = theme.aside.page.noSticky.split(',')
- Sticky = theme.aside.page.Sticky.split(',')
each item in noSticky
include ./asideSwitch.pug
.sticky_layout
if page.toc
include ./asideToc.pug
each item in Sticky
include ./asideSwitch.pug
@@ -0,0 +1,5 @@
if theme.google_adsense.enable && !theme.google_adsense.auto_ads && theme.google_adsense.aside_card
.card-widget.card-adsense
ins.adsbygoogle(style="display:block; text-align:center; min-height:120px; min-width: 100%", data-ad-layout="in-article", data-ad-format="fluid", hide-unfilled="true", data-ad-client=theme.google_adsense.client, data-ad-slot=theme.google_adsense.slot)
script.
(adsbygoogle = window.adsbygoogle || []).push({});
@@ -0,0 +1,8 @@
.card-widget.card-tags.card-archives.card-webinfo.card-allinfo
if theme.aside.tags.enable
include ./asideTag
hr
if theme.aside.archive.enable
include ./asideArchive
hr
include ./asideWebInfo
@@ -0,0 +1,11 @@
- var archive = theme.aside.archive
ul.card-archive-list
- var type = archive.type ? archive.type : 'year'
each value, key in getArchiveLength(type)
li.card-archive-list-item
a.card-archive-list-link(href=`/archives/${key}/`)
span.card-archive-list-date= key
.card-archive-list-count-group
span.card-archive-list-count= value
span.card-archive-list-count-unit= __('console.archive_unit')
@@ -0,0 +1,7 @@
.card-widget(class=custom.class, id=custom.id)
if !custom.no_head
.item-headline
i(class=custom.icon)
span=custom.title
div(class=custom.content_class ||'item-content', id=custom.content_id, style=custom.content_css)
!= custom.content_html
@@ -0,0 +1,5 @@
.card-widget.card-platform
#flip-wrapper
#flip-content
.face
.back.face
@@ -0,0 +1,86 @@
- const {style ,url} = theme.aside.card
.card-widget.card-info
.card-content
case style
when 0
.card-info-avatar.is-center
.author-info__top-group
.author-info__sayhi#author-info__sayhi(onclick="sco.changeSayHelloText()")= _p('sayhello.morning')
.avatar-img-group
img.avatar-img(alt=_p('aside.avatar'), src=theme.aside.card.author.img)
if theme.aside.card.author.sticker
.avatar-sticker
img.avatar-sticker-img(src=theme.aside.card.author.sticker, alt=_p('aside.sticker'))
.author-info__description_group
.author-info__description!= theme.aside.card.content
.author-info__description2!= theme.aside.card.content2
.author-info__bottom-group
a.author-info__bottom-group-left(href=url_for(theme.aside.card.url))
.author-info__name= config.author
.author-info__desc!= config.subtitle
.card-info-social-icons.is-center
each value, label in theme.aside.card.information || {}
- var array = value.split('||')
a.social-icon(href=url_for(trim(array[0])), title=label)
i.solitude(class=array[1])
when 1
.card-info-bg-top
.is-center
.author-info__top-group
.author-info__sayhi#author-info__sayhi(onclick="sco.changeSayHelloText()")= _p('sayhello.morning')
a.card-info-avatar(href=url_for(theme.aside.card.url) title=_p('aside.avatar'))
.avatar-img
img(src=theme.aside.card.author.img alt=_p('aside.avatar'))
if theme.aside.card.author.sticker
.avatar-sticker
img.avatar-sticker-img(src=theme.aside.card.author.sticker, alt=_p('aside.sticker'))
.card-info__desc_group
.author-info__name= config.author
.author-info__desc!= config.subtitle
.card-info__data.is-center
a(href=url_for('/archives/') title=_p('aside.card.posts') + site.posts.length)
.length-num= site.posts.length
.headline= _p('page.archives')
a(href=url_for('/tags/') title=_p('aside.card.tags') + site.tags.length)
.length-num= site.tags.length
.headline= _p('page.tag')
a(href=url_for('/categories/') title=_p('aside.card.categories') + site.categories.length)
.length-num= site.categories.length
.headline= _p('page.category')
.card-info-social-icons.is-center
each value, label in theme.aside.card.information || {}
- var array = value.split('||')
a.social-icon(href=url_for(trim(array[0])), title=label)
i.solitude(class=array[1])
when 2
.card-info-bg-top
.author-info-social
.social-icons
each value, label in theme.aside.card.information || {}
- var array = value.split('||')
a.social-icon(href=url_for(trim(array[0])), title=label)
i.solitude(class=array[1])
span.more-info(onclick="document.querySelector('.social-icons').classList.toggle('show')")
i.solitude.st-more-2-fill
a.card-info-avatar(href=url_for(theme.aside.card.url) title=_p('aside.avatar'))
.avatar-img
img(src=theme.aside.card.author.img alt=_p('aside.avatar'))
if theme.aside.card.author.sticker
.avatar-sticker
img.avatar-sticker-img(src=theme.aside.card.author.sticker, alt=_p('aside.sticker'))
.author-info__name= config.author
.card-info__data.is-center
a(href=url_for('/archives/') title=_p('aside.card.posts') + site.posts.length)
.length-num= site.posts.length
.headline= _p('page.archives')
a(href=url_for('/tags/') title=_p('aside.card.tags') + site.tags.length)
.length-num= site.tags.length
.headline= _p('page.tag')
a(href=url_for('/categories/') title=_p('aside.card.categories') + site.categories.length)
.length-num= site.categories.length
.headline= _p('page.category')
.card-info__desc_group
.author-info__description!= theme.aside.card.content
.author-info__description2!= theme.aside.card.content2
@@ -0,0 +1,16 @@
.card-widget.card-recent-post
.item-headline
i.solitude.st-map-line
span= _p('aside.newpost')
.aside-list
- let index = 1
each post in site.posts.data.sort((a, b) => b.date < a.date ? -1 : 1)
if index <= 5
.aside-list-item
a.thumbnail(href=url_for(post.path) title=post.title)
img(alt=post.title src=post.cover)
.content
a.title(href=url_for(post.path) title=post.title)= post.title
if post.categories.data[0]
a.article-recent_post_categories(href=url_for(post.path))= post.categories.data[0].name
- index++
@@ -0,0 +1,9 @@
.card-widget.card-recent-comment
.item-headline
i.solitude.st-chat-fill
span= _p('aside.newcomment')
if theme.recent_comments.enable
a.recent-comment-more(href=url_for(theme.recent_comments.page) title=_p('console.recent_comment_more'))
i.solitude.st-right-btn-fill
.aside-list
include ../third-party/news-comment/newest-comment.pug
@@ -0,0 +1,19 @@
case item
when 'about'
include ./asideInfoCard.pug
when 'flip'
include ./asideFlipCard.pug
when 'newestPost'
include ./asideNewestPost.pug
when 'allInfo'
include ./asideAllInfo.pug
when 'ads'
include ./asideAdsense.pug
when 'newest_comment'
include ./asideNewstComments.pug
default
- const custom = site.data?.aside?.find((i) => i.name === item)
if custom
include ./asideCustom.pug
else
include ../../page/default.pug
@@ -0,0 +1,16 @@
- const highlight = theme.aside.tags.highlight_list || []
.card-tag-cloud
each tag in site.tags.find({ parent: { $exists: false } }).data
if highlight.includes(tag.name)
a.highlight(href=url_for(tag.path))= tag.name
sup= tag.length
else
a(href=url_for(tag.path))= tag.name
sup= tag.length
if site.tags.length >= theme.aside.tags.limit
span#more-tags-btn(onclick="sco.openAllTags()")= __('aside.tagmore')
else
style.
.card-tag-cloud::after {
display: none !important;
}
@@ -0,0 +1,5 @@
.card-widget#card-toc
.item-headline
i.solitude.st-menu-line
span= __('aside.toc')
.toc-content#toc-content!= toc(page.content, { list_number: false })
@@ -0,0 +1,48 @@
.webinfo
if theme.aside.siteinfo.postcount
.webinfo-item
.webinfo-item-title
i.item-icon.solitude.st-folder-fill
.item-name= __('aside.postcount')
.item-count= site.posts.length
if theme.busuanzi
if theme.aside.siteinfo.pv
.webinfo-item
.webinfo-item-title
i.item-icon.solitude.st-visitor-line
.item-name= __('aside.pv')
if theme.busuanzi_use === 0
span#busuanzi_value_site_pv
i.solitude.st-loading-line
else
span#busuanzi_site_pv
i.solitude.st-loading-line
if theme.aside.siteinfo.uv
.webinfo-item
.webinfo-item-title
i.item-icon.solitude.st-team-fill
.item-name= __('aside.uv')
if theme.busuanzi_use === 0
span#busuanzi_value_site_uv
i.solitude.st-loading-line
else
span#busuanzi_site_uv
i.solitude.st-loading-line
if theme.aside.siteinfo.runtimeenable
.webinfo-item
.webinfo-item-title
i.item-icon.solitude.st-calendar-todo-fill
.item-name= __('aside.runtime')
.item-count#runtimeshow
if theme.aside.siteinfo.updatetime
.webinfo-item
.webinfo-item-title
i.item-icon.solitude.st-loop-left-fill
.item-name= __('aside.updatetime')
time.item-count(datetime=new Date())
if theme.wordcount && theme.aside.siteinfo.wordcount
.webinfo-item
.webinfo-item-title
i.item-icon.solitude.st-word-fill
.item-name= __('aside.wordcount')
.item-count= totalcount(site)
@@ -0,0 +1,23 @@
div.banners-title
div.banners-title-big!= theme.hometop.banner.title
div.banners-title-small= theme.hometop.banner.url
- var group = theme.hometop.group
if group
div.banners-links
each value,label in group
- var array = value.split('||')
a.banners-link-btn(href=url_for(trim(array[0])) style=`background-image: ${array[2]} `)
if array[1]
i.solitude(class=array[1])
.banners-link-title= label
div.tags-group-all
.tags-group-wrapper
each i in [1,2]
- var keys = Object.keys(theme.hometop.banner.icon)
- var pairs = keys.map((val, i) => i % 2 ? [keys[i - 1], val] : []).filter(x => x.length)
each pair in pairs
.tags-group-icon-pair
each key in pair
.tags-group-icon(style=`background: ${theme.hometop.banner.icon[key].color}`)
img.nolazyload(src=theme.hometop.banner.icon[key].img, title=key)
@@ -0,0 +1,18 @@
.bbTimeList.container#bbTimeList(class=is_home_first_page() ? '' : 'more-page')
i.bber-logo.solitude.st-bblogo(onclick=`pjax.loadUrl('/essay/')`)
.swiper-container.swiper-no-swiping.swiper-container-initialized.swiper-container-vertical.swiper-container-pointer-events#bbtalk(tabindex="-1" onclick=`pjax.loadUrl('/essay/')`)
.swiper-wrapper#bber-talk
each item, i in site.data.essay.essay_list.slice(0, 10)
.li-style.swiper-slide
| #{item.content}
if item.image
i.solitude.st-image-fill
else if item.aplayer
i.solitude.st-disc-fill
else if item.video
i.solitude.st-video-fill
else if item.bilibili
i.solitude.st-bilibili-line
else if item.link
i.solitude.st-links
i.bber-gotobb.solitude.st-right-btn-fill(title=_p('home.bbtime.text') onclick=`pjax.loadUrl('/essay/')`)
@@ -0,0 +1,72 @@
- let recommends = site.posts.data.filter(item => item.recommend === true).slice(0,6) || false
if recommends
.recent-post-item#swiperBox
div.blog-slider.swiper-container-fade.swiper-container-horizontal#swiper_container
.blog-slider__wrp.swiper-wrapper
each item,index in recommends
.blog-slider__item.swiper-slide(onclick="pjax.loadUrl('"+item.path+"')")
.blog-slider__img
img(src=item.cover, alt=item.title)
.blog-slider__content
span.blog-slider__title=item.title
case theme.index_post_list.content
when false
break
when 1
span.blog-slider__desc= item.description
when 2
if item.description
span.blog-slider__desc= item.description
else
- const content = strip_html(item.content)
- let expert = content.substring(0, theme.index_post_list.length).replace(/\d+/g, '').replace(/&#xF/g, '').replace(/&#x/g, '')
- content.length > theme.index_post_list.length ? expert += ' ...' : ''
.span.blog-slider__desc= expert
default
- const content = strip_html(item.content)
- let expert = content.substring(0, theme.index_post_list.length).replace(/\d+/g, '').replace(/&#xF/g, '').replace(/&#x/g, '')
- content.length > theme.index_post_list.length ? expert += ' ...' : ''
.span.blog-slider__desc= expert
div.article-meta-wrap
span.article-meta.tags
each tag in item.tags.data
a.article-meta__tags(href=url_for(tag.path), onclick="event.stopPropagation();")
span.tags-punctuation=tag.name
span.post-meta-date
time(datetime=moment(item.date))
.blog-slider__pagination.swiper-pagination-clickable.swiper-pagination-bullets
script.
function carousel_swiper() {
let e = new Swiper(".blog-slider", {
direction: "vertical",
passiveListeners: true,
loop: true,
autoplay: {
disableOnInteraction: true,
delay: 5e3
},
pagination: {
el: ".blog-slider__pagination",
clickable: true
},
effect: 'fade',
fadeEffect: {
crossFade: true
},
passiveListeners: true,
spaceBetween: 30,
watchSlidesProgress: true,
mousewheel: true
})
, t = document.getElementById("swiper_container");
null !== t && (t.onmouseenter = () => {
e.autoplay.stop()
}
,
t.onmouseleave = () => {
e.autoplay.start()
}
)
}
@@ -0,0 +1,15 @@
.category-bar-items#category-bar-items(class=is_home() ? 'home' : '')
.category-bar-item(class=is_home() ? 'select' : '', id="category-bar-home")
a(href=url_for('/'))= __('home.home')
.category-bar-item
a(href=url_for('/archives/'))= __('home.archives')
each item in site.categories.find({ parent: { $exists: false } }).data
.category-bar-item(class=select ? (select === item.name ? 'select' : '') : '', id=item.name)
a(href=url_for(item.path))= item.name
div.category-bar-right
- let categories = site.categories.find({parent: {$exists: false}})
- let wordcount = categories.map(category => category.name).join('').length
if wordcount > 40 || categories.data.length > 10
.category-bar-next#category-bar-next(onclick="sco.scrollCategoryBarToRight()")
i.solitude.st-show-right-line
a.category-bar-more(href=url_for('/categories/'))= __('more')
@@ -0,0 +1,7 @@
.recent-top-post-group#recent-top-post-group
.recent-post-top#recent-post-top
#bannerGroup
#banners
include ./banner.pug
.topGroup
include ./topGroup.pug
@@ -0,0 +1,81 @@
mixin cover
a(href=url_for(post.path), title=post.title)
img.post_bg(src=url_for(post.cover), alt=post.title)
mixin info
div.recent-post-info-top
div.recent-post-info-top-tips
if post.sticky && is_home()
span.article-meta.sticky-warp
i.solitude.st-thumbtack-solid.sticky.orange
span.sticky.orange= _p('home.sticky')
each category in post.categories.data
span.original= category.name
if post.prev == null && is_home()
span.original= _p('home.new')
a.unvisited-post(href=url_for(post.path))= _p('home.read')
a.article-title(href=url_for(post.path), title=post.title)= post.title
case theme.index_post_list.content
when false
break
when 1
.content!= post.description
when 2
if post.description
.content!= post.description
else
- const content = strip_html(post.content)
- let expert = content.substring(0, theme.index_post_list.length).replace(/\d+/g, '').replace(/&#xF/g, '').replace(/&#x/g, '')
- content.length > theme.index_post_list.length ? expert += ' ...' : ''
.content!= expert
default
- const content = strip_html(post.content)
- let expert = content.substring(0, theme.index_post_list.length).replace(/\d+/g, '').replace(/&#xF/g, '').replace(/&#x/g, '')
- content.length > theme.index_post_list.length ? expert += ' ...' : ''
.content!= expert
div.article-meta-wrap
span.article-meta.tags
each tag in post.tags.data
a.article-meta__tags(href=url_for(tag.path), onclick="event.stopPropagation();")
span.tags-punctuation=tag.name
span.post-meta-date
time(datetime=moment(post.date))
- const { direction, cover } = theme.index_post_list
if direction === 'row'
- var position = cover === 'both' ? index % 2 === 0 ? 0 : 1 : cover === 'left' ? 0 : 1
div.recent-post-item(onclick="pjax.loadUrl('" + url_for(post.path) + "')")
if direction === 'column'
div.post_cover
+cover()
div.recent-post-info
+info()
else
case position
when 0
div.post_cover
+cover()
div.recent-post-info
+info()
when 1
div.recent-post-info
+info()
div.post_cover
+cover()
if theme.google_adsense && theme.google_adsense.enable && theme.google_adsense.auto_ads === false && theme.google_adsense.post_card
- var ads_height = theme.index_post_list.direction === 'column' ? '401px;' : '280px;'
if (index + 1) % 3 === 0
div.recent-post-item.google-ads-warp
ins.adsbygoogle(style="display:block; text-align:center; min-width: 100%; height:" + ads_height, data-ad-layout="in-article", data-ad-format="fluid", hide-unfilled="true", data-ad-client=theme.google_adsense.client, data-ad-slot=theme.google_adsense.slot)
script.
(adsbygoogle = window.adsbygoogle || []).push({});
@@ -0,0 +1,32 @@
- var filteredPosts = site.posts.data.filter(item => item.recommend === true).slice(0,6)
.recent-post-group
each post in filteredPosts
.recent-post-item
.post_cover
a(href=url_for(post.path), title=post.title)
span.recent-post-top-text= _p('home.recommend')
img.post_bg(alt=post.title, src=post.cover)
.recent-post-info
a.article-title(href=url_for(post.path), title=post.title)= post.title
mixin todayCardContent
.todayCard-info
.todayCard-tips= theme.hometop.recommendList.sup
.todayCard-title= theme.hometop.recommendList.title
.todayCard-cover.nolazyload(style=`background: url('${theme.hometop.recommendList.img}') no-repeat center /cover`)
.banner-button-group
a.banner-button(onclick="window.event.cancelBubble=true;sco.hideTodayCard();")
i.solitude.st-add-fill
span.banner-button-text= _p('home.recommendmore')
case theme.hometop.recommendList.url.startsWith('/')
when true
.todayCard#todayCard(onclick=`pjax.loadUrl('${theme.hometop.recommendList.url}')`)
+todayCardContent()
when false
script.
function GoTodayCard() {
window.open("#{theme.hometop.recommendList.url}", "_blank");
}
.todayCard#todayCard(onclick="GoTodayCard()")
+todayCardContent()
@@ -0,0 +1,13 @@
- var menu = theme.nav.group
if menu
.back-menu-list-groups
each value, label in menu
.back-menu-list-group
.back-menu-list-title= label
.back-menu-list
each data, label in value
- var array = data.split('||')
a.back-menu-item(href=url_for(trim(array[0])), title=label)
if array[1]
img.nolazyload.back-menu-item-icon(src=trim(array[1]), alt=label)
span.back-menu-item-text= label
@@ -0,0 +1,20 @@
- var menu = theme.nav.menu
if menu
.menus_items
each value, label in menu
.menus_item
if typeof value !== 'object'
a.site-page(href=url_for(value))
span= label
else
a.site-page(href="javascript:void(0);")
span= label
ul.menus_item_child
each childValue, childLabel in value
li
- var array = childValue.split('||')
a.site-page.child(href=url_for(trim(array[0])))
if array[1]
i.solitude(class=array[1])
span= childLabel
@@ -0,0 +1,24 @@
- var custom = theme.nav.right.custom || []
each item in custom
.nav-button(id=item.id)
a.site-page(href=url_for(item.url) || 'javascript:void(0);', onclick=item.onclick, title=item.title || '')
i.solitude(class=item.icon || '')
if theme.nav.right.random
.nav-button#randomPost_button
a.site-page(onclick="toRandomPost()", title=_p('nav.randompost'), href="javascript:void(0);")
i.solitude.st-dice-line
if theme.search.enable
.nav-button#search-button
a.site-page.social-icon.search(href="javascript:void(0);", title=_p('nav.search'))
i.solitude.st-search-line
if theme.nav.right.console
.nav-button#nav-console
a.console_switchbutton(onclick="sco.showConsole()", title=_p('nav.console'), href="javascript:void(0);")
i.solitude.st-dashboard-fill
.nav-button#nav-totop(onclick="sco.toTop()")
a.totopbtn
i.solitude.st-arrow-up-line
span#percent= "0"
#toggle-menu
a.site-page
i.solitude.st-menu-line
@@ -0,0 +1,13 @@
- const authorinfo = site.data.about.authorinfo
if authorinfo
.author-info
.author-tag-left
each tag in authorinfo.leftTags
span.author-tag= tag
.author-img
img(src=authorinfo.image)
.author-tag-right
each tag in authorinfo.rightTags
span.author-tag= tag
.author-title= site.data.about.title
@@ -0,0 +1,39 @@
- award = site.data.about.award
- var sum = 0
if site.data.about.rewardList
.author-content
.author-content-item.single.reward
.author-content-item-tips= _p('award.thanks')
span.author-content-item-title= _p('award.title')
.author-content-item-description
!= award.description
.reward-list-all
each reward in site.data.about.rewardList
- sum += reward.money
.reward-list-item
.reward-list-item-name= reward.name
.reward-list-bottom-group
.reward-list-item-money(style=(reward.vip ? "background: var(--efu-vip);color: var(--efu-white)" : ""))
if reward.icon
i.solitude(class=reward.icon)
| ¥ #{reward.money}
time.datatime.reward-list-item-time(datetime=moment(reward.time).format())
if theme.post.award.enable
.post-reward
.post-reward(onclick="AddRewardMask()")
.reward-button(title=_p('award.tipping'))
i.solitude.st-hand-heart-fill
= _p('award.tipping')
.reward-main
ul.reward-all
span.reward-title= theme.post.award.title
ul.reward-group
- var rewards = theme.post.award.list
each reward in rewards
li.reward-item
a(href=url_for(reward.url))
img.post-qr-code-img(alt=reward.name, src=reward.qcode, style="border-color:" + reward.color)
.post-qr-code-desc= reward.name
.reward-list-tips
p= award.tips.replace('{sum}', sum.toFixed(2))
@@ -0,0 +1,39 @@
- const contentinfo = site.data.about.contentinfo
if contentinfo
.author-content
.author-content-item.myInfoAndSayHello
.title1= contentinfo.sup
.title2
span.inline-word= contentinfo.name
.title1= contentinfo.title
.aboutsiteTips.author-content-item
.author-content-item-tips= contentinfo.tip
h2
span.inline-word!= contentinfo.slogan
.mask
each item,index in contentinfo.mask
if index === 0
span.first-tips(data-show='')= item
else if index === contentinfo.mask.length - 1
span(data-up='')= item
else
span= item
script.
var pursuitInterval = null;
pursuitInterval = setInterval(function () {
const show = document.querySelector('span[data-show]')
const next = show.nextElementSibling || document.querySelector('.first-tips')
const up = document.querySelector('span[data-up]')
if (up) {
up.removeAttribute('data-up')
}
show.removeAttribute('data-show')
show.setAttribute('data-up', '')
next.setAttribute('data-show', '')
}, 2000)
document.addEventListener('pjax:send', function () {
clearInterval(pursuitInterval);
});
@@ -0,0 +1,37 @@
- var game1 = site.data.about.game1
- var game2 = site.data.about.game2
if game1 || game2
.author-content
if game1
.author-content-item.game-apex(style=`background: url(${game1.img}) no-repeat top; background-size: cover;`)
.card-content
.author-content-item-tips= game1.title
span.author-content-item-title= game1.subtitle
.content-bottom
.tips= game1.tips_left
.tips= game1.tips_right
if game2
.author-content-item.game-jl(style=`background: url(${game2.img}) no-repeat top; background-size: cover;`)
.card-content
.author-content-item-tips= game2.title
span.author-content-item-title= game2.subtitle
.content-bottom
.tips= game2.tips_left
.tips= game2.tips_right
if site.data.about.likes
- const likes = site.data.about.likes
.author-content
each like in likes
.author-content-item(class=like.type, style=`background: url(${like.bg}) no-repeat center;`)
.card-content
.author-content-item-tips= like.tips
span.author-content-item-title= like.title
.content-bottom
.tips= like.subtips
if like.button
.banner-button-group
a.banner-button(href=url_for(like.button_link))
i.solitude.st-right-btn-fill
span.banner-button-text= like.button_text
@@ -0,0 +1,22 @@
- const motto = site.data.about.motto
- const expertise = site.data.about.expertise
if motto || expertise
.author-content
if motto
.author-content-item.maxim
.author-content-item-tips= motto.title
span.maxim-title
span= motto.prefix
span= motto.content
if expertise
.author-content-item.buff
.card-content
.author-content-item-tips= expertise.title
span.buff-title
span
| #{expertise.prefix}
span.inline-word= expertise.specialist
span
| #{expertise.content}
span.inline-word= expertise.level
@@ -0,0 +1,89 @@
- var tj = site.data.about.tj
- var oneself = site.data.about.oneself
if tj || oneself
.author-content
if tj
.about-statistic.author-content-item(style=`background: url(${tj.img});`)
.card-content
.author-content-item-tips=_p('about.other.tj.tip')
span.author-content-item-title=_p('about.other.tj.title')
#statistic
.post-tips
= _p('about.other.tj.post_tip')
case tj.provider
when '51la'
a(href="https://v6.51.la/") 51la网站统计
when 'baidu'
a(href="https://tongji.baidu.com/") 百度统计
if tj.button
.banner-button-group
a.banner-button(href=url_for(tj.button_link))
i.solitude.st-right-btn-fill
span.banner-button-text= tj.button_text
case tj.provider
when '51la'
script.
fetch("#{tj.url}")
.then(res => res.text())
.then(data => {
const title = ["最近活跃", "今日人数", "今日访问", "昨日人数", "昨日访问", "本月访问", "总访问量"];
let num = data.match(/(<\/span><span>).*?(\/span><\/p>)/g);
num = num.map(el => {
let val = el.replace(/(<\/span><span>)/g, "");
return val.replace(/(<\/span><\/p>)/g, "");
});
const s = document.getElementById("statistic");
let html = '';
for (let i = 0; i < num.length; i++) {
if (i === 0 || i === num.length - 1) continue;
html += `<div><span>${title[i]}</span><span id="${title[i]}">${num[i]}</span></div>`;
}
s.innerHTML = html;
});
when 'baidu'
script.
fetch("#{tj.url}")
.then(res => res.json())
.then(data => {
const title = {"today_uv": "今日人数", "today_pv": "今日访问", "yesterday_uv": "昨日人数", "yesterday_pv": "昨日访问", "last_month_pv": "最近月访问", "last_year_pv": "最近年访问"};
let s = document.getElementById("statistic");
for (let key in data) {
if (data.hasOwnProperty(key) && title[key]) {
s.innerHTML += `<div><span>${title[key]}</span><span id="${key}">${data[key]}</span></div>`;
}
}
});
if oneself
style.
:root {
--site-about-oneself-map--light: url(#{oneself.map.light});
--site-about-oneself-map--dark: url(#{oneself.map.dark});
}
.author-content-item-group.column.mapAndInfo
.author-content-item.map.single
span.map-title=_p('about.other.oneself.map_title') + oneself.location
.author-content-item.selfInfo.single
div
span.selfInfo-title=_p('about.other.oneself.info_title1')
span.selfInfo-content(style="color: #43a6c6;")= oneself.birthYear
div
span.selfInfo-title= oneself.university
span.selfInfo-content(style="color: #c69043;")= oneself.major
div
span.selfInfo-title=_p('about.other.oneself.info_title2')
span.selfInfo-content(style="color: #b04fe6;")= oneself.occupation
- var cause = site.data.about.cause
if cause
.author-content
.create-site-post.author-content-item.single
.author-content-item-tips= cause.tip
span.author-content-item-title= cause.title
!= cause.content
@@ -0,0 +1,17 @@
- const personalities = site.data.about.personalities
if personalities
.author-content
.author-content-item.personalities
.author-content-item-tips= personalities.tips
span.author-content-item-title= personalities.title
.title2(style=`color:${personalities.color}`)= personalities.type
.image
img.nolazyload(src=personalities.image)
.post-tips
= _p('about.personalities.tip1') + ' '
a(href='https://www.16personalities.com/')= personalities.linkText + ' '
= _p('about.personalities.tip2') + ' '
a(href=personalities.typeLink)= personalities.typeName
.author-content-item.myphoto
img.author-content-img(src=personalities.myphoto, alt="my photo")
@@ -0,0 +1,42 @@
- var skills = site.data.about.skills
- var careers = site.data.about.careers
if skills || careers
.author-content
if skills
.author-content-item.skills
.card-content
.author-content-item-tips= skills.title
span.author-content-item-title= skills.subtitle
.skills-style-group
.tags-group-all
.tags-group-wrapper
each i in [1,2]
- var pair = []
each tag, index in skills.tags
- pair.push(tag)
if pair.length === 2 || index === skills.tags.length - 1
.tags-group-icon-pair
each item in pair
.tags-group-icon(style=`background:${item.color}`)
img(src=item.icon, title=item.title)
- pair = []
.skills-list
each tag in skills.tags
.skill-info
.skill-icon(style=`background:${tag.color}`)
img(src=tag.icon, title=tag.title)
.skill-name
span= tag.title
.etc ...
if careers
.author-content-item.careers
.card-content
.author-content-item-tips= careers.title
span.author-content-item-title= careers.subtitle
.careers-group
each item in careers.items
.careers-item
.circle(style=`background:${item.color}`)
.name= `${item.school}, ${item.major}`
img.author-content-img(src=careers.image, alt=careers.title)
@@ -0,0 +1,48 @@
- var tenyear = site.data.about.tenyear
if tenyear
.author-content#tenyear
.create-site-post.author-content-item.single
.author-content-item-tips=tenyear.tips
.author-content-item-title=tenyear.title
p=tenyear.text
.tenyear-timeline
.progress
.past-time
.percentage-label
.time-labels
.start-time#tenyear-start-time= tenyear.start
.end-time#tenyear-end-time= tenyear.end
script.
function parseDateString(e) {
return e.replace(/年|月/g, '-').replace(/日/g, '');
}
function tenYear() {
let progressElement = document.querySelector(".progress");
let pastTimeElement = document.querySelector(".past-time");
let percentageLabelElement = document.querySelector(".percentage-label");
let startTimeElement = document.getElementById("tenyear-start-time");
let endTimeElement = document.getElementById("tenyear-end-time");
let startTime = new Date(parseDateString(startTimeElement.textContent)).getTime();
let endTime = new Date(parseDateString(endTimeElement.textContent)).getTime();
function updateProgress() {
let currentTime = new Date().getTime();
let progress = ((currentTime - startTime) / (endTime - startTime) * 100);
let progressPercentage = progress <= 100 ? progress + "%" : "100%";
pastTimeElement.style.setProperty("--past-time-percentage", progress + "%");
progressElement.style.setProperty("--progress-percentage", progressPercentage);
if(progress > 5){
percentageLabelElement.textContent = `${progress.toFixed(0)}%`;
percentageLabelElement.style.left = `calc(${progress}% - 35px)`;
}
}
percentageLabelElement.style.visibility = "visible";
updateProgress();
}
document.getElementById("tenyear") && tenYear() && window.Pjax.on('complete', tenYear)
@@ -0,0 +1,15 @@
.author-content.author-content-item.single.sharePage(style=`background: url(${page.cover}) no-repeat center; background-size: cover;`)
.card-content
.author-content-item-tips= page.desc
span.author-content-item-title= page.title
.content-bottom
if page.leftend
.tips= page.leftend
if page.rightend
.tips= page.rightend
if page.rightbtn
.banner-button-group
- const isInternalLink = page.rightbtnlink.startsWith('/')
a.banner-button(onclick=isInternalLink ? `pjax.loadUrl("${page.rightbtnlink}")`: null, href=isInternalLink ? null : url_for(page.rightbtnlink), target=isInternalLink ? null : "_blank")
i.solitude.st-right-btn-fill
span.banner-button-text= page.rightbtn
@@ -0,0 +1,23 @@
#equipment
if site.data.equipment
each i in site.data.equipment
.equipment-item
h2.equipment-item-title= i.class_name
.equipment-item-description= i.description
.equipment-item-content
each item in i.equipment_list
.equipment-item-content-item
.equipment-item-content-item-cover
img.equipment-item-content-item-image(src=item.image, alt=item.name)
.equipment-item-content-item-info
.equipment-item-content-item-name(onclick='utils.copy("' + item.name + '")')= item.name
.equipment-item-content-item-specification= item.specification
.equipment-item-content-item-description= item.description
if item.link
.equipment-item-content-item-toolbar
if item.link.includes('https://') || item.link.includes('http://')
a.equipment-item-content-item-link(href=item.link, target="_blank") 详情
else
a.equipment-item-content-item-link(href=item.link, target="_blank") 查看文章
a.bber-reply(onclick=`sco.toTalk('${item.description}')`)
i.solitude.st-chat-fill(style="font-size: 1rem;")
@@ -0,0 +1,31 @@
.banners-title
.banners-title-small= page.title
.banners-title-big= page.desc
.banner-button-group
if theme.footer.randomlink
a.banner-button.secondary(onclick="travelling()")
i.solitude.st-signal-tower-fill
span.banner-button-text=_p('link.banner.random')
if theme.comment.use
a.banner-button(onclick="sco.scrollToComment()")
i.solitude.st-right-btn-fill
span.solitude.banner-button-text=_p('link.banner.toComment')
.tags-group-all.nowrapMove
.tags-group-wrapper
- const data = site.data.links.links
- for (let i = 0; i < 2; i++)
each x in data
if x.type === "item"
- var pairs = []
each y, index in x.link_list
if (index % 2 === 0)
- pairs.push([y])
else
- pairs[pairs.length - 1].push(y)
each pair in pairs
.tags-group-icon-pair
each y in pair
a.tags-group-icon(href=url_for(y.link), title=y.name)
img(src=y.avatar + (site.data.links.banner_suffix || ''), title=y.name)
@@ -0,0 +1,15 @@
.site-card-group
each item in data.link_list
.site-card
if item.tag
span.site-card-tag(class=item.color)= item.tag
i.light
a.img(title=item.name, href=url_for(item.link))
img.flink-avatar(src=item.topimg + (data.topimg_suffix || ''), alt=item.name)
a.info.cf-friends-link(title=item.name, href=url_for(item.link))
.site-card-avatar
img.flink-avatar.cf-friends-avatar(src=item.avatar + (data.suffix || ''), alt=item.name)
.img-alt.is-center= item.name
.site-card-text
span.title.cf-friends-name= item.name
span.desc(title=item.descr)= item.descr
@@ -0,0 +1,8 @@
.flink-list.cf-friends-lost-contact.mini
each item in data.link_list
.flink-list-item
a.cf-friends-link(href="javascript:void(0);", title=item.name)
img.flink-avatar.cf-friends-avatar(alt=item.name, src=item.avatar + (data.suffix || ''))
.flink-item-info
span.flink-item-name.cf-friends-name= item.name
span.flink-item-desc(title=item.descr)= item.descr
@@ -0,0 +1,11 @@
.flink-list
each item in data.link_list
.flink-list-item
if item.tag
span.site-card-tag(class=item.color)= item.tag
i.light
a.cf-friends-link(href=url_for(item.link), title=item.name)
img.flink-avatar.cf-friends-avatar(alt=item.name, src=item.avatar + (data.suffix || ''))
.flink-item-info
span.flink-item-name.cf-friends-name= item.name
span.flink-item-desc(title=item.descr)= item.descr
@@ -0,0 +1,45 @@
- const { server, site, option } = theme.artalk
script(pjax).
(async () => {
const emojiReg = /<img [^>]+ atk-emoticon="[^"]+">/g
if (typeof EasyDanmaku === "undefined") await utils.getScript('!{url_for(theme.cdn.envelope_js)}')
const envel = new EasyDanmaku({
page: '!{theme.envelope.page}',
el: '#barrage',
line: !{line},
speed: !{speed},
hover: !{hover},
loop: !{loop},
})
const data = utils.saveToLocal.get('enevlope')
if (data) {
envel.batchSend(data, true)
return
}
const searchParams = new URLSearchParams({'site_name': "!{site}", 'limit': '100'})
await fetch(`!{server}/api/v2/stats/latest_comments?${searchParams}`, {method: 'GET'}).then(async res => res.json())
.then(async data => {
let ls = []
for (const i of data.data) {
ls.push({
content: i.nick + ': ' + formatDanmaku(i.content),
avatar: '!{avatar}' + '/avatar/' + i.email_encrypted,
url: i.page_key + '#atk-comment-' + i.id,
})
}
envel.batchSend(ls, true)
utils.saveToLocal.set('enevlope', ls, .02)
}).catch(error => {
console.error("An error occurred while fetching comments: ", error)
})
function formatDanmaku(str) {
str = str.replace(emojiReg, '[!{__("console.newest_comment.emoji")}]')
str = str.replace(/!\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.image")}]')
str = str.replace(/\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.link")}]')
str = str.replace(/```.*?```/g, '[!{__("console.newest_comment.code")}]')
return str
}
})()
@@ -0,0 +1,9 @@
#article-container
!= page.content
if theme.envelope.enable
.switch_message
button.open(type='button' onclick="document.getElementById('barrage').classList.remove('hide')")
span(aria-hidden='true')= __('message.open')
button.close(type='button' onclick="document.getElementById('barrage').classList.add('hide')")
span(aria-hidden='true')= __('message.close')
#barrage

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