|
@ -1,6 +1,8 @@
|
|||
.DS_Store
|
||||
Thumbs.db
|
||||
node_modules
|
||||
/.github/FUNDING.yml
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
.github/*
|
||||
.vscode/*
|
||||
.idea/*
|
||||
|
|
143
LICENSE
|
@ -1,5 +1,5 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
|
@ -7,17 +7,15 @@
|
|||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
|
@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
|
|||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
@ -72,7 +60,7 @@ modification follow.
|
|||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
|
|||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
|
@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
it under the terms of the GNU Affero General Public License as published
|
||||
by the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
|
|
|
@ -67,10 +67,10 @@ Install the latest version throuth npm:
|
|||
```sh
|
||||
# recommend
|
||||
$ cd hexo-site
|
||||
$ npm update hexo-theme-keep
|
||||
$ npm install hexo-theme-keep@latest
|
||||
```
|
||||
|
||||
Or update to latest master branch:
|
||||
Or update to the latest master branch:
|
||||
|
||||
```sh
|
||||
$ cd themes/keep
|
||||
|
|
55
_config.yml
|
@ -1,12 +1,13 @@
|
|||
## ======================================================================================
|
||||
## Keep v3.5.2
|
||||
## Keep v3.6.0
|
||||
## Preview: https://xpoet.cn
|
||||
## Document: https://keep-docs.xpoet.cn
|
||||
## Documents: https://keep-docs.xpoet.cn
|
||||
## Repository: https://github.com/XPoet/hexo-theme-keep
|
||||
## ======================================================================================
|
||||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Your basic info
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/base_info.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
base_info:
|
||||
# Your blog website title
|
||||
|
@ -17,13 +18,14 @@ base_info:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Theme style settings
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/style.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
style:
|
||||
# Theme primary color
|
||||
primary_color: "#0066cc"
|
||||
|
||||
# Your blog website logo image
|
||||
# You can use local image, image external link or don’t fill
|
||||
# You can use local image, image external link or don't fill
|
||||
logo: /images/logo.svg
|
||||
|
||||
# Favicon (You can use local image or image external link)
|
||||
|
@ -42,16 +44,16 @@ style:
|
|||
|
||||
# Mouse hover style settings
|
||||
hover:
|
||||
# Shadow effect when the mouse hover.
|
||||
# Shadow effect when the mouse hover
|
||||
shadow: false # Option values: true | false
|
||||
# Scale effect when the mouse hovers.
|
||||
# Scale effect when the mouse hovers
|
||||
scale: false # Option values: true | false
|
||||
|
||||
# First screen style settings
|
||||
first_screen:
|
||||
enable: false # Option values: true | false
|
||||
|
||||
# Set transparent background for header.
|
||||
# Set transparent background for header
|
||||
header_transparent: false # Option values: true | false
|
||||
|
||||
# First screen background image (You can use local image or image external link)
|
||||
|
@ -78,6 +80,7 @@ style:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Navigation menu
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/menu.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# If you want to enable Categories and Tags, you need to create categories and tags pages
|
||||
# e.g. `hexo new page categories` or `hexo new page tags`
|
||||
|
@ -93,6 +96,7 @@ menu:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Social contact link
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/social_contact.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
social_contact:
|
||||
enable: false # Option values: true | false
|
||||
|
@ -112,26 +116,28 @@ social_contact:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Home page article block display settings
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/home_article.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
home_article:
|
||||
# Show category in home page article block.
|
||||
# Show category in home page article block
|
||||
category:
|
||||
enable: false # Option values: true | false
|
||||
limit: 3 # Max number of categories shown in home page article block
|
||||
# Show tags in home page article block.
|
||||
# Show tags in home page article block
|
||||
tag:
|
||||
enable: false # Option values: true | false
|
||||
limit: 5 # Max number of tags shown in home page article block
|
||||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Post page Settings
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/post.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
post:
|
||||
# Author label in the post
|
||||
author_label:
|
||||
enable: true # Option values: true | false
|
||||
|
||||
# If true, show Lv1, Lv2, Lv3...
|
||||
# If true, show Lv1, Lv2, Lv3 ...
|
||||
# If false, show custom_label_list
|
||||
auto: true # Option values: true | false
|
||||
|
||||
|
@ -154,6 +160,7 @@ post:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Code block
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/code_block.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
code_block:
|
||||
# Toolbar include: "code copy", "code block collapse" and "code language"
|
||||
|
@ -164,11 +171,12 @@ code_block:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Table of Contents in the Sidebar
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/toc.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
toc:
|
||||
enable: false # Option values: true | false
|
||||
|
||||
# Automatically add list number to toc.
|
||||
# Automatically add list number to toc
|
||||
number: false # Option values: true | false
|
||||
|
||||
# If true, all level of TOC in a post will be displayed, rather than the activated part of it.
|
||||
|
@ -179,6 +187,7 @@ toc:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Website count
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/website_count.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
website_count:
|
||||
# busuanzi
|
||||
|
@ -191,6 +200,7 @@ website_count:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Local Search
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/local_search.html
|
||||
# Dependencies: hexo-generator-searchdb (`npm install hexo-generator-searchdb`)
|
||||
# See: https://github.com/theme-next/hexo-generator-searchdb
|
||||
# ---------------------------------------------------------------------------------------
|
||||
|
@ -200,6 +210,7 @@ local_search:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Comment plugin
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/comment.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
comment:
|
||||
enable: false # Option values: true | false
|
||||
|
@ -211,6 +222,7 @@ comment:
|
|||
valine:
|
||||
appid: # Your leancloud application appid
|
||||
appkey: # Your leancloud application appkey
|
||||
server_urls: # Your Server URL
|
||||
placeholder: # Input box placeholder
|
||||
|
||||
# Gitalk
|
||||
|
@ -218,18 +230,19 @@ comment:
|
|||
# https://gitalk.github.io
|
||||
gitalk:
|
||||
github_id: # GitHub repo owner
|
||||
github_admins: # GitHub Admins (in Array type), optional.
|
||||
github_admins: # GitHub Admins (in Array type), optional
|
||||
repository: # Repository name to store issues
|
||||
client_id: # GitHub Application Client ID
|
||||
client_secret: # GitHub Application Client Secret
|
||||
proxy: # GitHub oauth request reverse proxy for CORS
|
||||
|
||||
# Twikoo
|
||||
# See: https://github.com/imaegoo/twikoo
|
||||
# https://twikoo.js.org
|
||||
twikoo:
|
||||
env_id: # Tencent Cloud environment id
|
||||
region: # Environment region. If select Guangzhou, fill in "ap-guangzhou".
|
||||
version: 1.6.7 # Twikoo version, default use v1.6.7
|
||||
region: # Environment region. If select Guangzhou, fill in "ap-guangzhou"
|
||||
version: 1.6.8 # Twikoo version, default use v1.6.8
|
||||
|
||||
# Waline
|
||||
# See: https://github.com/walinejs/waline
|
||||
|
@ -241,7 +254,8 @@ comment:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# RSS
|
||||
# Dependencies: hexo-generator-feed
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/rss.html
|
||||
# Dependencies: hexo-generator-feed (`npm install hexo-generator-feed`)
|
||||
# See: https://github.com/hexojs/hexo-generator-feed
|
||||
# ---------------------------------------------------------------------------------------
|
||||
rss:
|
||||
|
@ -249,12 +263,14 @@ rss:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Lazyload image
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/lazyload.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
lazyload:
|
||||
enable: false # Option values: true | false
|
||||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# CDN
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/cdn.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
cdn:
|
||||
enable: false # Option values: true | false
|
||||
|
@ -262,14 +278,19 @@ cdn:
|
|||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# PJAX
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/pjax.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
pjax:
|
||||
enable: false # Option values: true | false
|
||||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# Footer settings
|
||||
# Docs: https://keep-docs.xpoet.cn/tutorial/configuration-guide/footer.html
|
||||
# ---------------------------------------------------------------------------------------
|
||||
footer:
|
||||
since: 2020 # the starting year of your website. Can be null
|
||||
icp: # ICP record number of your website. Can be null
|
||||
upyun: # If your site is deployed on upyun, your can fill the upyun url. Can be null
|
||||
since: 2020 # The starting year of your website, Can be null
|
||||
icp: # ICP record number of your website, Can be null
|
||||
site_deploy:
|
||||
enable: false # Option values: true | false
|
||||
provider: github # Option values: github | vercel | netlify | gitee | aliyun | tencent_cloud | upyun
|
||||
url: # Your deployment provider url, Can be null
|
||||
|
|
|
@ -66,7 +66,7 @@ theme: keep
|
|||
```sh
|
||||
# 推荐
|
||||
$ cd hexo-site
|
||||
$ npm update hexo-theme-keep
|
||||
$ npm install hexo-theme-keep@latest
|
||||
```
|
||||
|
||||
或者通过 git 更新到最新的 master 分支:
|
||||
|
|
|
@ -67,7 +67,7 @@ theme: keep
|
|||
```sh
|
||||
# 推薦
|
||||
$ cd hexo-site
|
||||
$ npm update hexo-theme-keep
|
||||
$ npm install hexo-theme-keep@latest
|
||||
```
|
||||
|
||||
或者透過 git 更新到最新的 master 分支:
|
||||
|
|
|
@ -10,7 +10,6 @@ page: Page %d
|
|||
recent_posts: Recent Posts
|
||||
share: Share
|
||||
powered_by: "Powered by %s"
|
||||
footer_upyun: "CDN acceleration and Cloud storage services are provided by %s"
|
||||
theme: Theme
|
||||
rss_feed: RSS Feed
|
||||
category: Category
|
||||
|
@ -51,13 +50,20 @@ code_block:
|
|||
copied: Copied
|
||||
fold: Fold code block
|
||||
folded: Folded
|
||||
copy_copyright:
|
||||
copy: Copy copyright info
|
||||
copied: Copied
|
||||
title: Original article title
|
||||
author: Original article author
|
||||
link: Original article link
|
||||
copyright:
|
||||
author: Post author
|
||||
title: Post title
|
||||
link: Post link
|
||||
create_time: Create time
|
||||
license_title: Copyright Notice
|
||||
license_title: Copyright notice
|
||||
license_content: "All articles in this blog are licensed under %s unless stating additionally."
|
||||
article-aging: "It has been %s days since the last update of this article. Some contents may be outdated. Please pay attention to screening."
|
||||
ago:
|
||||
second: "%s seconds ago"
|
||||
minute: "%s minutes ago"
|
||||
|
@ -66,3 +72,12 @@ ago:
|
|||
week: "%s weeks ago"
|
||||
month: "%s months ago"
|
||||
year: "%s years ago"
|
||||
footer_deploy: "This site is provided with deployment services by %s"
|
||||
deploy_provider:
|
||||
github: GitHub Pages
|
||||
vercel: Vercel
|
||||
netlify: Netlify
|
||||
gitee: Gitee Pages
|
||||
aliyun: Alibaba Cloud
|
||||
tencent_cloud: Tencent Cloud
|
||||
upyun: UPYUN
|
||||
|
|
|
@ -10,7 +10,6 @@ page: 第 %d 页
|
|||
recent_posts: 最新文章
|
||||
share: 分享
|
||||
powered_by: "由 %s 驱动"
|
||||
footer_upyun: "本站由 %s 提供 CDN 加速和云存储服务"
|
||||
theme: 主题
|
||||
rss_feed: RSS Feed
|
||||
category: 分类
|
||||
|
@ -51,6 +50,12 @@ code_block:
|
|||
copied: 已复制
|
||||
fold: 折叠代码块
|
||||
folded: 已折叠
|
||||
copy_copyright:
|
||||
copy: 复制版权信息
|
||||
copied: 已复制
|
||||
title: 原文标题
|
||||
author: 原文作者
|
||||
link: 原文链接
|
||||
copyright:
|
||||
title: 本文标题
|
||||
author: 本文作者
|
||||
|
@ -58,6 +63,7 @@ copyright:
|
|||
create_time: 创建时间
|
||||
license_title: 版权声明
|
||||
license_content: "本博客所有文章除特别声明外,均采用 %s 许可协议。转载请注明出处!"
|
||||
article-aging: "本文距离上次更新已过去 %s 天,部分内容可能已经过时,请注意甄别。"
|
||||
ago:
|
||||
second: "%s 秒前"
|
||||
minute: "%s 分钟前"
|
||||
|
@ -66,3 +72,12 @@ ago:
|
|||
week: "%s 周前"
|
||||
month: "%s 个月前"
|
||||
year: "%s 年前"
|
||||
footer_deploy: "本站由 %s 提供部署服务"
|
||||
deploy_provider:
|
||||
github: GitHub Pages
|
||||
vercel: Vercel
|
||||
netlify: Netlify
|
||||
gitee: Gitee Pages
|
||||
aliyun: 阿里云
|
||||
tencent_cloud: 腾讯云
|
||||
upyun: 又拍云
|
||||
|
|
|
@ -10,7 +10,6 @@ page: 第 %d 頁
|
|||
recent_posts: 之前的文章
|
||||
share: 分享
|
||||
powered_by: "%s 框架"
|
||||
footer_upyun: "本站由 %s 提供 CDN 加速和雲存儲服務"
|
||||
theme: 主題
|
||||
rss_feed: RSS 訂閱
|
||||
category: 分類
|
||||
|
@ -51,6 +50,12 @@ code_block:
|
|||
copied: 已復製
|
||||
fold: 折疊代碼塊
|
||||
folded: 已折疊
|
||||
copy_copyright:
|
||||
copy: 復製版權信息
|
||||
copied: 已復製
|
||||
title: 原文標題
|
||||
author: 原文作者
|
||||
link: 原文鏈接
|
||||
copyright:
|
||||
author: 文章作者
|
||||
title: 文章標題
|
||||
|
@ -58,6 +63,7 @@ copyright:
|
|||
create_time: 撰寫時間
|
||||
license_title: 版權宣告
|
||||
license_content: "這個網站所有文章均使用 %s 授權"
|
||||
article-aging: "本文距離上次更新已過去 %s 天,部分內容可能已經過時,請註意甄別。"
|
||||
ago:
|
||||
second: "%s 秒前"
|
||||
minute: "%s 分鐘前"
|
||||
|
@ -66,3 +72,12 @@ ago:
|
|||
week: "%s 周前"
|
||||
month: "%s 個月前"
|
||||
year: "%s 年前"
|
||||
footer_deploy: "本站由 %s 提供部署服務"
|
||||
deploy_provider:
|
||||
github: GitHub Pages
|
||||
vercel: Vercel
|
||||
netlify: Netlify
|
||||
gitee: Gitee Pages
|
||||
aliyun: 阿裏雲
|
||||
tencent_cloud: 騰訊雲
|
||||
upyun: 又拍雲
|
||||
|
|
|
@ -1,19 +1,25 @@
|
|||
<%
|
||||
const colon = config.language === 'en' ? ': ' : ':'
|
||||
%>
|
||||
<div class="article-copyright-info-container">
|
||||
<ul class="copyright-info-content">
|
||||
<li>
|
||||
<span class="type"><%- __('copyright.title') %></span>:<span class="content"><%= page.title %></span>
|
||||
<li class="post-title">
|
||||
<span class="type"><%- __('copyright.title') %></span><%= colon %><span class="content"><%= page.title %></span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="type"><%- __('copyright.author') %></span>:<span class="content"><%= theme.base_info.author || config.author %></span>
|
||||
<li class="post-author">
|
||||
<span class="type"><%- __('copyright.author') %></span><%= colon %><span class="content"><%= theme.base_info.author || config.author %></span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="type"><%- __('copyright.create_time') %></span>:<span class="content"><%= date(page.date, 'YYYY-MM-DD HH:mm:ss') %></span>
|
||||
<li class="post-time">
|
||||
<span class="type"><%- __('copyright.create_time') %></span><%= colon %><span class="content"><%= date(page.date, 'YYYY-MM-DD HH:mm:ss') %></span>
|
||||
</li>
|
||||
<li class="post-link">
|
||||
<span class="type"><%- __('copyright.link') %></span>:<span class="content"><%= page.path %></span>
|
||||
<span class="type"><%- __('copyright.link') %></span><%= colon %><span class="content"><%= page.path %></span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="type"><%- __('copyright.license_title') %></span>:<span class="content"><%- __('copyright.license_content', '<a class="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">BY-NC-SA</a>') %></span>
|
||||
<li class="post-license">
|
||||
<span class="type"><%- __('copyright.license_title') %></span><%= colon %><span class="content"><%- __('copyright.license_content', '<a class="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">BY-NC-SA</a>') %></span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="copy-copyright-info flex-center tooltip" data-content="<%= __('copy_copyright.copy') %>" data-offset-y="-2px">
|
||||
<i class="fa-solid fa-copy"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -5,7 +5,8 @@ const {
|
|||
client_secret,
|
||||
repository,
|
||||
github_id,
|
||||
github_admins
|
||||
github_admins,
|
||||
proxy
|
||||
} = theme.comment?.gitalk
|
||||
let cdn_css = '//cdn.jsdelivr.net/npm/gitalk/dist/gitalk.css'
|
||||
let cdn_js = '//cdn.jsdelivr.net/npm/gitalk/dist/gitalk.min.js'
|
||||
|
@ -46,6 +47,7 @@ if (t_cdn_enable === true) {
|
|||
owner: '<%= github_id %>',
|
||||
admin: '<%= github_admins || [github_id] %>',
|
||||
id: __gitalk__pathname,
|
||||
proxy: '<%= proxy %>',
|
||||
language: '<%= config.language %>'
|
||||
}).render('gitalk-container');
|
||||
} catch (e) {
|
||||
|
|
|
@ -3,6 +3,7 @@ const { enable: pjax_enable } = theme?.pjax
|
|||
const {
|
||||
appid,
|
||||
appkey,
|
||||
server_urls,
|
||||
placeholder
|
||||
} = theme.comment?.valine
|
||||
let cdn_url = '//cdn.jsdelivr.net/npm/valine@latest/dist/Valine.min.js'
|
||||
|
@ -25,7 +26,8 @@ if (t_cdn_enable === true) {
|
|||
<div id="vcomments"></div>
|
||||
<script <%= pjax_enable === true ? 'data-pjax' : '' %>>
|
||||
function loadValine() {
|
||||
new Valine({
|
||||
|
||||
const config = {
|
||||
el: '#vcomments',
|
||||
appId: '<%= appid %>',
|
||||
appKey: '<%= appkey %>',
|
||||
|
@ -34,48 +36,54 @@ if (t_cdn_enable === true) {
|
|||
enableQQ: true,
|
||||
placeholder: '<%= placeholder %>',
|
||||
lang: '<%= config.language %>'.toLowerCase()
|
||||
});
|
||||
}
|
||||
|
||||
if ('<%= server_urls %>') {
|
||||
config.serverURLs = '<%= server_urls %>'
|
||||
}
|
||||
|
||||
new Valine(config)
|
||||
|
||||
function getAuthor(language) {
|
||||
switch (language) {
|
||||
case 'en':
|
||||
return 'Author';
|
||||
return 'Author'
|
||||
case 'zh-CN':
|
||||
return '博主';
|
||||
return '博主'
|
||||
default:
|
||||
return 'Master';
|
||||
return 'Master'
|
||||
}
|
||||
}
|
||||
|
||||
// Add "Author" identify
|
||||
const getValineDomTimer = setInterval(() => {
|
||||
const vcards = document.querySelectorAll('#vcomments .vcards .vcard');
|
||||
const vcards = document.querySelectorAll('#vcomments .vcards .vcard')
|
||||
if (vcards.length > 0) {
|
||||
let author = '<%= theme.base_info.author || config.author %>';
|
||||
let author = '<%= theme.base_info.author || config.author %>'
|
||||
|
||||
if (author) {
|
||||
for (let vcard of vcards) {
|
||||
const vnick_dom = vcard.querySelector('.vhead .vnick');
|
||||
const vnick = vnick_dom.innerHTML;
|
||||
const vnick_dom = vcard.querySelector('.vhead .vnick')
|
||||
const vnick = vnick_dom.innerHTML
|
||||
if (vnick === author) {
|
||||
vnick_dom.innerHTML = `${vnick} <span class="author">${getAuthor(KEEP.hexo_config.language)}</span>`
|
||||
}
|
||||
}
|
||||
}
|
||||
clearInterval(getValineDomTimer);
|
||||
clearInterval(getValineDomTimer)
|
||||
} else {
|
||||
clearInterval(getValineDomTimer);
|
||||
clearInterval(getValineDomTimer)
|
||||
}
|
||||
}, 2000);
|
||||
}, 2000)
|
||||
}
|
||||
|
||||
if ('<%= pjax_enable %>' === 'true') {
|
||||
const loadValineTimeout = setTimeout(() => {
|
||||
loadValine();
|
||||
clearTimeout(loadValineTimeout);
|
||||
}, 1000);
|
||||
loadValine()
|
||||
clearTimeout(loadValineTimeout)
|
||||
}, 1000)
|
||||
} else {
|
||||
window.addEventListener('DOMContentLoaded', loadValine);
|
||||
window.addEventListener('DOMContentLoaded', loadValine)
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
<%
|
||||
const { since: f_since, icp: f_icp, upyun: f_upyun } = theme.footer
|
||||
const {
|
||||
since: f_since,
|
||||
icp: f_icp,
|
||||
site_deploy: f_site_deploy
|
||||
} = theme.footer
|
||||
const { author: bi_author } = theme.base_info
|
||||
const { author: hexo_author } = config
|
||||
const { site_uv: bsz_site_uv, site_pv: bsz_site_pv, enable: bsz_enable } = theme.website_count.busuanzi_count
|
||||
|
@ -30,7 +34,7 @@ const { site_uv: bsz_site_uv, site_pv: bsz_site_pv, enable: bsz_enable } = theme
|
|||
</div>
|
||||
<% } %>
|
||||
<div class="theme-info info-item">
|
||||
<%- __('powered_by', '<a target="_blank" href="https://hexo.io">Hexo</a>') %> | <%- __('theme') %> <a class="theme-version" target="_blank" href="https://github.com/XPoet/hexo-theme-keep">Keep v3.5.2</a>
|
||||
<%- __('powered_by', '<a target="_blank" href="https://hexo.io">Hexo</a>') %> | <%- __('theme') %> <a class="theme-version" target="_blank" href="https://github.com/XPoet/hexo-theme-keep">Keep v3.6.0</a>
|
||||
</div>
|
||||
<% if (f_icp) { %>
|
||||
<div class="icp-info info-item">
|
||||
|
@ -41,11 +45,18 @@ const { site_uv: bsz_site_uv, site_pv: bsz_site_pv, enable: bsz_enable } = theme
|
|||
</a>
|
||||
</div>
|
||||
<% } %>
|
||||
<% if (f_upyun) { %>
|
||||
<div class="ypyun-info info-item">
|
||||
<a target="_blank" rel="nofollow" href="<%= f_upyun %>">
|
||||
<%- __('footer_upyun', '<img src="/images/upyun.png" height="20">') %>
|
||||
<% if (f_site_deploy?.enable === true && f_site_deploy?.provider !== '') { %>
|
||||
<div class="deploy-info info-item">
|
||||
<% if (f_site_deploy?.url) { %>
|
||||
<a target="_blank" rel="nofollow" href="<%= f_site_deploy?.url %>">
|
||||
<% } %>
|
||||
<%- __(
|
||||
'footer_deploy',
|
||||
'<span class="tooltip" data-content="' + __('deploy_provider.' + f_site_deploy?.provider) + '"><img src="/images/deploy-provider/' + f_site_deploy?.provider + '.png"></span>'
|
||||
) %>
|
||||
<% if (f_site_deploy?.url) { %>
|
||||
</a>
|
||||
<% } %>
|
||||
</div>
|
||||
<% } %>
|
||||
</div>
|
||||
|
|
|
@ -29,10 +29,10 @@
|
|||
</title>
|
||||
<%- css('css/style') %>
|
||||
<%- favicon_tag(theme.style.favicon) %>
|
||||
<%- __css('fontawesome/css/fontawesome.min.css') %>
|
||||
<%- __css('fontawesome/css/regular.min.css') %>
|
||||
<%- __css('fontawesome/css/solid.min.css') %>
|
||||
<%- __css('fontawesome/css/brands.min.css') %>
|
||||
<%- export_config() %>
|
||||
<%- __css('font/css/fontawesome.min.css') %>
|
||||
<%- __css('font/css/regular.min.css') %>
|
||||
<%- __css('font/css/solid.min.css') %>
|
||||
<%- __css('font/css/brands.min.css') %>
|
||||
<%- exportConfig() %>
|
||||
</head>
|
||||
|
||||
|
|
|
@ -32,6 +32,12 @@
|
|||
<% } %>
|
||||
|
||||
<div class="article-content keep-markdown-body">
|
||||
<% if (page?.aging === true) { %>
|
||||
<div class="article-aging-tips" data-update-date="<%= page.updated %>" data-aging-days="<%= page?.agingDays %>">
|
||||
<i class="fa-solid fa-circle-exclamation"></i><%- __('article-aging', '<span class="days">0</span>') %>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<%- page.content %>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "hexo-theme-keep",
|
||||
"version": "3.5.2",
|
||||
"version": "3.6.0",
|
||||
"private": false,
|
||||
"description": "A simple and elegant theme for Hexo.",
|
||||
"scripts": {
|
||||
|
|
|
@ -10,7 +10,7 @@ const yaml = require('js-yaml')
|
|||
/**
|
||||
* Export theme config to js
|
||||
*/
|
||||
hexo.extend.helper.register('export_config', function () {
|
||||
hexo.extend.helper.register('exportConfig', function () {
|
||||
const { config, theme } = this
|
||||
|
||||
// ------------------------ export language to js ------------------------
|
||||
|
@ -50,10 +50,11 @@ hexo.extend.helper.register('export_config', function () {
|
|||
}
|
||||
|
||||
return `<script id="hexo-configurations">
|
||||
let KEEP = window.KEEP || {};
|
||||
KEEP.hexo_config = ${JSON.stringify(hexo_config)};
|
||||
KEEP.theme_config = ${JSON.stringify(theme_config)};
|
||||
KEEP.language_ago = ${JSON.stringify(languageContent['ago'])};
|
||||
KEEP.language_code_block = ${JSON.stringify(languageContent['code_block'])};
|
||||
let KEEP = window.KEEP || {}
|
||||
KEEP.hexo_config = ${JSON.stringify(hexo_config)}
|
||||
KEEP.theme_config = ${JSON.stringify(theme_config)}
|
||||
KEEP.language_ago = ${JSON.stringify(languageContent['ago'])}
|
||||
KEEP.language_code_block = ${JSON.stringify(languageContent['code_block'])}
|
||||
KEEP.language_copy_copyright = ${JSON.stringify(languageContent['copy_copyright'])}
|
||||
</script>`
|
||||
})
|
||||
|
|
|
@ -261,6 +261,7 @@ button {
|
|||
padding 0.2rem 0.6rem
|
||||
color var(--text-color-6)
|
||||
font-size 0.8rem
|
||||
letter-spacing 0.8px
|
||||
white-space nowrap
|
||||
background var(--text-color-1)
|
||||
border-radius 0.3rem
|
||||
|
|
|
@ -103,12 +103,18 @@ $scrollbar-background-color = darken($background-color-1, 10%)
|
|||
$toc-scrollbar-color = alpha($text-color-3, 0.1)
|
||||
|
||||
$copyright-info-color = #cc0033
|
||||
|
||||
$avatar-background-color = $primary-color-dark-1
|
||||
|
||||
$header-transparent-background-1 = alpha($background-color-1, 0.28)
|
||||
$header-transparent-background-2 = alpha($background-color-1, 0.58)
|
||||
$header-transparent-background-2 = alpha($background-color-1, 0.4)
|
||||
|
||||
$pjax-progress-bar-color = linear-gradient(45deg, #f10006, #ef5b00, #e59c01, #19ca05, #00cab5, #0264c8, #c303c3)
|
||||
|
||||
$article-aging-tips-color = #b78d0f
|
||||
$article-aging-tips-background-color = alpha($article-aging-tips-color, 0.1)
|
||||
$article-aging-tips-border-color = alpha($article-aging-tips-color, 0.6)
|
||||
|
||||
|
||||
// ==============================================================================================
|
||||
// theme dark mode color set
|
||||
|
@ -141,13 +147,18 @@ $dark-scrollbar-background-color = lighten($dark-background-color-1, 20%)
|
|||
$dark-toc-scrollbar-color = alpha($dark-text-color-3, 0.1)
|
||||
|
||||
$dark-copyright-info-color = darken($copyright-info-color, 20%)
|
||||
|
||||
$dark-avatar-background-color = darken($avatar-background-color, 20%)
|
||||
|
||||
$dark-header-transparent-background-1 = alpha($dark-background-color-1, 0.28)
|
||||
$dark-header-transparent-background-2 = alpha($dark-background-color-1, 0.58)
|
||||
$dark-header-transparent-background-2 = alpha($dark-background-color-1, 0.4)
|
||||
|
||||
$dark-pjax-progress-bar-color = linear-gradient(45deg, #ea404a, #ea722f, #e9a71f, #67e559, #18ecec, #1b85f1, #ee1dee)
|
||||
|
||||
$dark-article-aging-tips-color = #ecc34d
|
||||
$dark-article-aging-tips-background-color = alpha($dark-article-aging-tips-color, 0.1)
|
||||
$dark-article-aging-tips-border-color = alpha($dark-article-aging-tips-color, 0.6)
|
||||
|
||||
|
||||
// ==============================================================================================
|
||||
// font settings
|
||||
|
@ -210,13 +221,23 @@ root-color(mode) {
|
|||
--scrollbar-background-color mode == 'light' ? $scrollbar-background-color : $dark-scrollbar-background-color
|
||||
--toc-scrollbar-color mode == 'light' ? $toc-scrollbar-color : $dark-toc-scrollbar-color
|
||||
|
||||
// copyright info left side color
|
||||
--copyright-info-color mode == 'light' ? $copyright-info-color : $dark-copyright-info-color
|
||||
|
||||
// avatar background color
|
||||
--avatar-background-color mode == 'light' ? $avatar-background-color : $dark-avatar-background-color
|
||||
|
||||
// header transparent background color
|
||||
--header-transparent-background-1 mode == 'light' ? $header-transparent-background-1 : $dark-header-transparent-background-1
|
||||
--header-transparent-background-2 mode == 'light' ? $header-transparent-background-2 : $dark-header-transparent-background-2
|
||||
|
||||
// pjax progress bar color
|
||||
--pjax-progress-bar-color mode == 'light' ? $pjax-progress-bar-color : $dark-pjax-progress-bar-color
|
||||
|
||||
// article aging tips primary color
|
||||
--article-aging-tips-color mode == 'light' ? $article-aging-tips-color : $dark-article-aging-tips-color
|
||||
--article-aging-tips-background-color mode == 'light' ? $article-aging-tips-background-color : $dark-article-aging-tips-background-color
|
||||
--article-aging-tips-border-color mode == 'light' ? $article-aging-tips-border-color : $dark-article-aging-tips-border-color
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
position relative
|
||||
box-sizing border-box
|
||||
width 100%
|
||||
overflow hidden
|
||||
padding 0.8rem 0.8rem 0.8rem 1.3rem
|
||||
font-size 1rem
|
||||
background var(--background-color-2)
|
||||
|
||||
|
@ -17,15 +17,21 @@
|
|||
}
|
||||
|
||||
|
||||
&:hover {
|
||||
.copy-copyright-info {
|
||||
visibility visible
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.copyright-info-content {
|
||||
position relative
|
||||
box-sizing border-box
|
||||
padding 0.8rem 0.8rem 0.8rem 1.3rem
|
||||
overflow-x auto
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
width 0.4rem
|
||||
height 0.4rem
|
||||
width 0.3rem
|
||||
height 0.3rem
|
||||
transition all 0.2s ease
|
||||
}
|
||||
|
||||
|
@ -56,4 +62,20 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.copy-copyright-info {
|
||||
position absolute
|
||||
top 0.4rem
|
||||
right 0.4rem
|
||||
box-sizing border-box
|
||||
padding 0.3rem
|
||||
visibility hidden
|
||||
cursor pointer
|
||||
transition-t("visibility", "0", "0.2", "ease-in-out")
|
||||
|
||||
i {
|
||||
color var(--text-color-3)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,6 @@ $first-screen-font-color = $temp-font-color ? convert($temp-font-color) : var(--
|
|||
|
||||
if (!(hexo-config('style.first_screen.header_transparent') == true)) {
|
||||
background-position-y $header-height
|
||||
}
|
||||
|
||||
+keep-tablet() {
|
||||
background-position-y $header-height * 0.9
|
||||
|
@ -26,6 +25,7 @@ $first-screen-font-color = $temp-font-color ? convert($temp-font-color) : var(--
|
|||
+keep-mobile() {
|
||||
background-position-y $header-height * 0.8
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
position relative
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
color var(--text-color-4)
|
||||
font-size 1rem
|
||||
|
||||
|
||||
a {
|
||||
color var(--text-color-4)
|
||||
|
||||
|
@ -12,24 +11,33 @@
|
|||
}
|
||||
|
||||
.info-container {
|
||||
padding-bottom 1rem
|
||||
text-align center
|
||||
}
|
||||
|
||||
.info-item {
|
||||
margin 0.3rem 0
|
||||
color var(--text-color-4)
|
||||
|
||||
&.ypyun-info a {
|
||||
display flex
|
||||
flex-direction column
|
||||
align-items center
|
||||
justify-content center
|
||||
padding-bottom 1rem
|
||||
|
||||
.info-item {
|
||||
margin 0.2rem 0
|
||||
color var(--text-color-4)
|
||||
|
||||
&.deploy-info {
|
||||
display flex
|
||||
|
||||
a
|
||||
.tooltip {
|
||||
display flex
|
||||
align-items center
|
||||
}
|
||||
|
||||
img {
|
||||
margin 0 0.3rem
|
||||
height 1.2rem
|
||||
margin 0 0.4rem
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.icon-animate {
|
||||
animation icon-animate 1.2s ease-in-out infinite
|
||||
|
|
|
@ -145,6 +145,28 @@ $toc-container-width = 15rem
|
|||
color var(--text-color-3)
|
||||
word-wrap break-word
|
||||
|
||||
.article-aging-tips {
|
||||
position relative
|
||||
display none
|
||||
box-sizing border-box
|
||||
margin-bottom 1.8rem
|
||||
padding 1rem
|
||||
color var(--article-aging-tips-color)
|
||||
line-height 1.6
|
||||
background var(--article-aging-tips-background-color)
|
||||
border 0.1rem solid var(--article-aging-tips-border-color)
|
||||
border-radius 0.4rem
|
||||
|
||||
i {
|
||||
margin-right 0.4rem
|
||||
color var(--article-aging-tips-color)
|
||||
}
|
||||
|
||||
.days {
|
||||
color var(--article-aging-tips-color)
|
||||
}
|
||||
}
|
||||
|
||||
if (hexo-config('post.copyright_info') == true || hexo-config('copyright_info.enable') == true) {
|
||||
border-bottom 0.1rem dashed var(--border-color)
|
||||
}
|
||||
|
|
|
@ -5,11 +5,6 @@
|
|||
height auto
|
||||
background var(--background-color-1)
|
||||
|
||||
+keep-tablet() {
|
||||
padding-left 0 !important
|
||||
}
|
||||
|
||||
|
||||
.page-main-content {
|
||||
position relative
|
||||
box-sizing border-box
|
||||
|
@ -18,13 +13,18 @@
|
|||
&.is-home {
|
||||
.transparent-1 {
|
||||
background var(--header-transparent-background-1)
|
||||
-webkit-backdrop-filter blur(4px)
|
||||
backdrop-filter blur(4px)
|
||||
}
|
||||
|
||||
.transparent-2 {
|
||||
background var(--header-transparent-background-2)
|
||||
-webkit-backdrop-filter blur(5px)
|
||||
backdrop-filter blur(5px)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.header-shrink & {
|
||||
padding-top $header-shrink-height
|
||||
|
||||
|
@ -78,7 +78,6 @@
|
|||
|
||||
+keep-tablet() {
|
||||
height $header-height * 0.9
|
||||
padding-left 0 !important
|
||||
}
|
||||
|
||||
|
||||
|
|
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 4.5 KiB |
|
@ -114,14 +114,74 @@ function initToggleShowToc() {
|
|||
observer.observe(commentsCountDom, config)
|
||||
},
|
||||
|
||||
// set post link
|
||||
initSetPostLink() {
|
||||
const postLinkContentDom = document.querySelector(
|
||||
'.copyright-info-content .post-link .content'
|
||||
)
|
||||
postLinkContentDom && (postLinkContentDom.innerHTML = decodeURI(window.location.href))
|
||||
},
|
||||
|
||||
// copy copyright info
|
||||
copyCopyrightInfo() {
|
||||
const cicDom = document.querySelector('.copyright-info-content')
|
||||
const copyDom = document.querySelector('.copy-copyright-info')
|
||||
const copyIcon = copyDom.querySelector('i')
|
||||
|
||||
const ccLang = KEEP.language_copy_copyright
|
||||
const colon = KEEP.hexo_config.language === 'en' ? ': ' : ':'
|
||||
|
||||
let isCopied = false
|
||||
|
||||
const setCopyDomContent = (class1, class2, content, copied) => {
|
||||
if (copyIcon) {
|
||||
copyIcon.classList.remove(class1)
|
||||
copyIcon.classList.add(class2)
|
||||
}
|
||||
const tooltipDom = copyDom.querySelector('.tooltip-content')
|
||||
tooltipDom && (tooltipDom.innerHTML = content)
|
||||
isCopied = copied
|
||||
}
|
||||
|
||||
copyDom.addEventListener('click', () => {
|
||||
if (!isCopied) {
|
||||
const author = cicDom.querySelector('.post-author .content').innerHTML
|
||||
const link = cicDom.querySelector('.post-link .content').innerHTML
|
||||
const tgtTxt = `${ccLang.author}${colon}${author}\n${ccLang.link}${colon}${link}`
|
||||
navigator.clipboard.writeText(tgtTxt).then(() => {
|
||||
setCopyDomContent('fa-copy', 'fa-check', ccLang.copied, true)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
copyDom.addEventListener('mouseleave', () => {
|
||||
setTimeout(() => {
|
||||
setCopyDomContent('fa-check', 'fa-copy', ccLang.copy, false)
|
||||
}, 500)
|
||||
})
|
||||
},
|
||||
|
||||
// set article aging tips
|
||||
setArticleAgingDays() {
|
||||
const agingTipsDom = document.querySelector('.article-content .article-aging-tips')
|
||||
if (agingTipsDom) {
|
||||
const daysDom = agingTipsDom.querySelector('.days')
|
||||
const nowTimestamp = Date.now()
|
||||
const tmpTimeLength = 24 * 60 * 60 * 1000
|
||||
const agingDaysTimestamp = (agingTipsDom.dataset?.agingDays || 30) * tmpTimeLength
|
||||
const postUpdateTimestamp = new Date(agingTipsDom.dataset.updateDate).getTime()
|
||||
const timeDifference = nowTimestamp - postUpdateTimestamp
|
||||
const timeDifferenceDays = (timeDifference / tmpTimeLength).toFixed(0)
|
||||
if (timeDifference >= agingDaysTimestamp) {
|
||||
daysDom.innerHTML = timeDifferenceDays
|
||||
agingTipsDom.style.display = 'block'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
KEEP.utils.postHelper.initSetPostToolsLeft()
|
||||
KEEP.utils.postHelper.setArticleAgingDays()
|
||||
|
||||
if (KEEP.theme_config.toc?.enable === true) {
|
||||
KEEP.utils.postHelper.initToggleToc()
|
||||
}
|
||||
|
@ -131,6 +191,7 @@ function initToggleShowToc() {
|
|||
}
|
||||
if (KEEP.theme_config.post?.copyright_info === true) {
|
||||
KEEP.utils.postHelper.initSetPostLink()
|
||||
KEEP.utils.postHelper.copyCopyrightInfo()
|
||||
}
|
||||
}
|
||||
|
||||
|
|