Compare commits

...

38 Commits
0.5.6 ... main

Author SHA1 Message Date
浪子 18bf403848 0.6.1 2024-10-08 17:01:31 +08:00
浪子 b0b20298b5
0.6.1 2024-09-28 23:51:56 +08:00
浪子 15b7523b18
0.6.1 2024-09-28 23:34:36 +08:00
浪子 59f1d27e27
0.6.1 2024-09-28 23:28:10 +08:00
浪子 b3c8ea001f
0.6.1 2024-09-28 23:25:27 +08:00
浪子 5c3fd36980 0.6.1
更改部分代码
2024-09-28 13:38:22 +08:00
浪子 c9be23aea0 去除fancybox 2024-09-28 13:38:00 +08:00
浪子 9c40556f6e 0.6.1
删除部分
2024-09-08 14:33:37 +08:00
浪子 8c9dd30c52 0.6.0 2024-08-31 10:57:54 +08:00
浪子 74b7bcecff 静态资源本地化
静态资源本地化
2024-08-29 18:26:30 +08:00
浪子 b4c55168b4 0.6.0
置顶不能为空
2024-08-13 10:33:58 +08:00
浪子 0e343d704f 0.6.0
略微调整页脚显示
2024-08-08 12:13:45 +08:00
浪子 e8b1f941b4 0.5.8
fix 置顶文章翻页显示的问题
2024-08-01 11:34:58 +08:00
浪子 044fff9185 0.5.8
fix
2024-07-30 14:18:22 +08:00
浪子 c5c5b94f4f 0.5.8
给作者加个标签
2024-07-29 19:06:39 +08:00
浪子 5dd748cb53 0.5.8
是否在文章页面显示文章分类
2024-07-29 15:22:46 +08:00
浪子 f205c3f37e 0.5.8
说明
2024-07-27 09:32:47 +08:00
浪子 1c18ec0593 0.5.8
识别豆瓣观影的链接并解析
2024-07-27 09:13:57 +08:00
浪子 52f8e45de0 0.5.8
过滤非中文评论
2024-07-26 17:19:35 +08:00
浪子 acb3f7e9e5 0.5.8 2024-07-26 15:57:19 +08:00
浪子 92cf4296f2 0.5.8
删除无用的说说
2024-07-26 13:50:11 +08:00
浪子 19a3934e6b 0.5.8
更改部分说明
2024-07-25 10:05:55 +08:00
浪子 c7d947e313 0.5.8
留言url换行
2024-07-25 10:02:12 +08:00
浪子 98defefd96 0.5.8
分类图片获取
2024-07-25 09:49:31 +08:00
浪子 53b3cf13a2 0.5.8
使用链接方式获取分类图片
2024-07-25 09:40:58 +08:00
浪子 6ee130ce3d 0.5.8
更改页码显示
去除不必要的设置
2024-07-25 08:21:49 +08:00
浪子 8c696e028c 0.5.8
del 暂无评论
2024-07-24 17:11:11 +08:00
浪子 641c487916 0.5.8
后台编辑器添加引用文章的按钮
2024-07-24 16:59:58 +08:00
浪子 2970fc745e 0.5.8
增加部分说明 刷新版本号
2024-07-24 16:23:37 +08:00
浪子 70979cdb94 0.5.8
增加了段代码的功能,以适配原版使用`[article id="123"]`或者`[article url="https://your-site.com/your-article-url"]`
2024-07-24 16:19:21 +08:00
浪子 4c6e080c4d 0.5.7
增加置顶文章的设置,样式来自于wordpress版本的主题样式
2024-07-24 12:05:54 +08:00
浪子 b480c78344 0.5.7 2024-07-23 14:18:21 +08:00
浪子 0e216a2a2a 0.5.7 2024-07-23 14:15:04 +08:00
浪子 5fa7c00a23 0.5.7 2024-07-23 13:44:04 +08:00
浪子 9a5d995ca5
0.5.7 2024-07-23 13:14:33 +08:00
浪子 5d8d1cbfc8
Update index.php 2024-07-23 12:44:11 +08:00
浪子 b2bb437f59
0.5.7 2024-07-23 12:43:33 +08:00
浪子 907ade4b7f
Create style.min.css 2024-07-23 12:42:48 +08:00
33 changed files with 668 additions and 874 deletions

View File

@ -1,56 +1,21 @@
## 说明 ## 说明
移植自 `bigfa `大大的 `hugo-theme-farallon` 原汁原味,可以直接使用 原主题的CSS 移植自 `bigfa `大大的 `hugo-theme-farallon`
精简部分 JS.
- 2024.7.4 ## 更新日志 & 预览
把分类图片以`mid`.jpg 的形式在主题`/dist/img`目录下,自动匹配
- 2024.6.12
更新豆瓣API获取方式
[Docker 自动同步豆瓣书影音记录](https://fatesinger.com/103483)
主题设置处填入API
- 2024.6.7
用自带评论做的说说页面,来自
https://github.com/gogobody/typecho-whisper
删减部分内容只能发表文字
- 2024.6.5 v0.5.3
新增了好物的页面 还是通过memos来获取
- 2024.6.4 v0.5.1
更改了设置memos的方式
新增了Mastodon 的 说说 页面
- 2024.6.3 v0.5.0
还是抄了原版的豆瓣获取方式
- 2024.5.26 v0.4.1
抄了个网站统计页面
- 2024.5.24
新增了说说页面,基于memos 0.19 以下的版本
在后台设置memos的地址和memoID即可
默认获取最近20条公开的memo
## 原项目地址
https://github.com/bigfa/hugo-theme-farallon
https://www.imsun.org/archives/1640.html
## 功能 ## 功能
### 豆瓣观影 ### 豆瓣观影
更新 获取方式 更新豆瓣API获取方式
[Docker 自动同步豆瓣书影音记录](https://fatesinger.com/103483)
主题设置处填入API
### 友情链接 ### 友情链接
@ -84,9 +49,7 @@ https://github.com/bigfa/hugo-theme-farallon
在自定义字段中填入`memos`值为memos地址 在自定义字段中填入`memos`值为memos地址
在自定义字段中填入`memosID`默认值为`1`,不为`1`时才需要设置 在自定义字段中填入`memosID`默认值为`1`,不为`1`时才需要设置
在自定义字段中填入`memostag`默认值为`好物`,不为`好物`时才需要设置 在自定义字段中填入`memostag`默认值为`好物`,不为`好物`时才需要设置
## 预览地址
https://www.imsun.org
## 感谢 ## 感谢

View File

@ -46,20 +46,21 @@
</article> </article>
<?php endwhile; ?> <?php endwhile; ?>
</main> </main>
<?php <?php
$this->pagenav( $this->pageNav(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z" fill="var(--main)"></path></svg>', ' ',
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.1714 12.0007L8.22168 7.05093L9.63589 5.63672L15.9999 12.0007L9.63589 18.3646L8.22168 16.9504L13.1714 12.0007Z" fill="var(--main)"></path></svg>', ' ',
1, 1,
'...', '...',
array( array(
'wrapTag' => 'div', 'wrapTag' => 'nav',
'wrapClass' => 'pagination_page', 'wrapClass' => 'nav-links nav-links__comment',
'itemTag' => '', 'itemTag' => '',
'textTag' => 'a', 'textTag' => 'span',
'currentClass' => 'active', 'itemClass' => 'page-numbers',
'prevClass' => 'prev', 'currentClass' => 'page-numbers current',
'nextClass' => 'next' 'prevClass' => 'hidden',
'nextClass' => 'hidden'
) )
); );
?> ?>
@ -74,44 +75,4 @@
</header> </header>
</main> </main>
<?php endif; ?> <?php endif; ?>
<style>
/* 分页 */
.pagination_page{
display: flex;
align-items: center;
justify-content: center;
margin-top: var(--margin);
gap: 0.5rem;
}
.pagination_page li.active a {
background: var(--theme);
color: #fff;
font-weight: 500;
}
.pagination_page a{
display: flex;
padding: 0.5rem;
font-size: 0.9rem;
width: 1.75rem;
height: 1.75rem;
background: var(--background);
border-radius: 50%;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
transition: 0.2s;
-webkit-transition: 0.2s;
justify-content: center;
align-items: center;
letter-spacing: 0;
}
.pagination_page span.next{
cursor: pointer;
}
.pagination_page li.active a:hover{
cursor: not-allowed;
}
/* 分页 */
</style>
<?php $this->need('footer.php'); ?> <?php $this->need('footer.php'); ?>

View File

@ -1,47 +1,7 @@
<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?> <?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<style>
/* 分页 */
.pagination_page{
display: flex;
align-items: center;
justify-content: center;
margin-top: var(--margin);
gap: 0.5rem;
}
.pagination_page li.active a {
background: var(--theme);
color: #fff;
font-weight: 500;
}
.pagination_page a{
display: flex;
padding: 0.5rem;
font-size: 0.9rem;
width: 1.75rem;
height: 1.75rem;
background: var(--background);
border-radius: 50%;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
transition: 0.2s;
-webkit-transition: 0.2s;
justify-content: center;
align-items: center;
letter-spacing: 0;
}
.pagination_page span.next{
cursor: pointer;
}
.pagination_page li.active a:hover{
cursor: not-allowed;
}
/* 分页 */
</style>
<div class="post--ingle__comments"> <div class="post--ingle__comments">
<?php $this->comments()->to($comments); ?> <?php $this->comments()->to($comments); ?>
<?php if($this->allow('comment')): ?> <?php if($this->allow('comment') && stripos($_SERVER['HTTP_ACCEPT_LANGUAGE'], 'zh') > -1): ?>
<?php if ($this->is('attachment')) : ?> <?php if ($this->is('attachment')) : ?>
<?php else: ?> <?php else: ?>
<h3 class="comments--title" id="comments"> <h3 class="comments--title" id="comments">
@ -88,25 +48,27 @@
<?php endif; ?> <?php endif; ?>
<?php if ($comments->have()): ?> <?php if ($comments->have()): ?>
<?php $comments->listComments(); ?> <?php $comments->listComments(); ?>
<?php <?php
$comments->pageNav( $comments->pageNav(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z" fill="var(--main)"></path></svg>', ' ',
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.1714 12.0007L8.22168 7.05093L9.63589 5.63672L15.9999 12.0007L9.63589 18.3646L8.22168 16.9504L13.1714 12.0007Z" fill="var(--main)"></path></svg>', ' ',
1, 1,
'...', '...',
array( array(
'wrapTag' => 'div', 'wrapTag' => 'nav',
'wrapClass' => 'pagination_page', 'wrapClass' => 'nav-links nav-links__comment',
'itemTag' => '', 'itemTag' => '',
'textTag' => 'a', 'textTag' => 'span',
'currentClass' => 'active', 'itemClass' => 'page-numbers',
'prevClass' => 'prev', 'currentClass' => 'page-numbers current',
'nextClass' => 'next' 'prevClass' => 'hidden',
'nextClass' => 'hidden'
) )
); );
?> ?>
<?php else: ?> <?php else: ?>
<center><h3><?php _e('暂无评论'); ?></h3></center> <center><h3></h3></center>
<?php endif; ?> <?php endif; ?>
<?php $this->options->twikoo(); ?> <?php $this->options->twikoo(); ?>
</div> </div>
@ -140,7 +102,12 @@ function threadedComments($comments, $options) {
<?php endif; ?> <?php endif; ?>
</div> </div>
<div class="comment--meta"> <div class="comment--meta">
<div class="comment--author"><?php echo $comments->author; ?><span class="dot"></span> <div class="comment--author"><?php echo $comments->author; ?>
<?php if ($comments->authorId == $comments->ownerId): ?>
<span class="dot"></span> <span class="custom-span">作者</span>
<?php endif; ?>
<span class="dot"></span>
<div class="comment--time"><?php $comments->date('Y-m-d H:i'); ?></div> <div class="comment--time"><?php $comments->date('Y-m-d H:i'); ?></div>
<span class="comment-reply-link u-cursorPointer"> <span class="comment-reply-link u-cursorPointer">
<?php $comments->reply('<svg viewBox="0 0 24 24" width="14" height="14" aria-hidden="true" class="" ><g><path d="M12 3.786c-4.556 0-8.25 3.694-8.25 8.25s3.694 8.25 8.25 8.25c1.595 0 3.081-.451 4.341-1.233l1.054 1.7c-1.568.972-3.418 1.534-5.395 1.534-5.661 0-10.25-4.589-10.25-10.25S6.339 1.786 12 1.786s10.25 4.589 10.25 10.25c0 .901-.21 1.77-.452 2.477-.592 1.731-2.343 2.477-3.917 2.334-1.242-.113-2.307-.74-3.013-1.647-.961 1.253-2.45 2.011-4.092 1.78-2.581-.363-4.127-2.971-3.76-5.578.366-2.606 2.571-4.688 5.152-4.325 1.019.143 1.877.637 2.519 1.342l1.803.258-.507 3.549c-.187 1.31.761 2.509 2.079 2.629.915.083 1.627-.356 1.843-.99.2-.585.345-1.224.345-1.83 0-4.556-3.694-8.25-8.25-8.25zm-.111 5.274c-1.247-.175-2.645.854-2.893 2.623-.249 1.769.811 3.143 2.058 3.319 1.247.175 2.645-.854 2.893-2.623.249-1.769-.811-3.144-2.058-3.319z"></path></g></svg>'); ?> <?php $comments->reply('<svg viewBox="0 0 24 24" width="14" height="14" aria-hidden="true" class="" ><g><path d="M12 3.786c-4.556 0-8.25 3.694-8.25 8.25s3.694 8.25 8.25 8.25c1.595 0 3.081-.451 4.341-1.233l1.054 1.7c-1.568.972-3.418 1.534-5.395 1.534-5.661 0-10.25-4.589-10.25-10.25S6.339 1.786 12 1.786s10.25 4.589 10.25 10.25c0 .901-.21 1.77-.452 2.477-.592 1.731-2.343 2.477-3.917 2.334-1.242-.113-2.307-.74-3.013-1.647-.961 1.253-2.45 2.011-4.092 1.78-2.581-.363-4.127-2.971-3.76-5.578.366-2.606 2.571-4.688 5.152-4.325 1.019.143 1.877.637 2.519 1.342l1.803.258-.507 3.549c-.187 1.31.761 2.509 2.079 2.629.915.083 1.627-.356 1.843-.99.2-.585.345-1.224.345-1.83 0-4.556-3.694-8.25-8.25-8.25zm-.111 5.274c-1.247-.175-2.645.854-2.893 2.623-.249 1.769.811 3.143 2.058 3.319 1.247.175 2.645-.854 2.893-2.623.249-1.769-.811-3.144-2.058-3.319z"></path></g></svg>'); ?>
@ -160,3 +127,26 @@ function threadedComments($comments, $options) {
<?php } ?> <?php } ?>
</li> </li>
<?php } ?> <?php } ?>
<style>.custom-span {
display: inline-flex;
align-items: center;
font-weight: 500; /* Equivalent to font-medium */
border-radius: 0.375rem; /* Equivalent to rounded-md */
font-size: 0.75rem; /* Equivalent to text-xs */
padding-left: 1.5px; /* Equivalent to px-1.5 */
padding-right: 1.5px; /* Equivalent to px-1.5 */
padding-top: 0.5px; /* Equivalent to py-0.5 */
padding-bottom: 0.5px; /* Equivalent to py-0.5 */
border: 1px solid var(--farallon-border-color); /* ring-1 and ring-inset with ring-gray-300 */
color: var(--farallon-text-gray); /* text-gray-700 */
background: var(--farallon-background-gray); /* bg-gray-50 */
}
/* Dark mode styles */
@media (prefers-color-scheme: dark) {
.custom-span {
border-color: var(--farallon-hover-color); /* ring-gray-700 */
color: var(--farallon-hover-color); /* text-gray-200 */
background-color: var(--farallon-background-gray); /* bg-gray-800 */
}
}</style>

26
db.php Normal file
View File

@ -0,0 +1,26 @@
<?php
$movie_id = $_GET['id'];
$api_url = "https://api.loliko.cn/movies/{$movie_id}";
$context = stream_context_create([
'http' => [
'ignore_errors' => true,
'timeout' => 10 // 设置10秒超时
]
]);
$response = file_get_contents($api_url, false, $context);
if ($response === FALSE) {
header("HTTP/1.1 500 Internal Server Error");
echo json_encode(['error' => 'Failed to fetch data from API']);
} else {
$responseData = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE) {
header('Content-Type: application/json');
echo $response;
} else {
header("HTTP/1.1 500 Internal Server Error");
echo json_encode(['error' => 'Invalid JSON response from API']);
}
}

View File

@ -118,6 +118,18 @@
} }
} }
.post--title .sticky--post {
font-size: 12px;
color: #fff;
font-weight: 400;
background: linear-gradient(90deg, #8a63d2, #f81ce5);
padding: 3px 5px;
border-radius: 5px;
line-height: 1;
display: inline-block;
vertical-align: middle
}
.dark { .dark {
--farallon-main-color: rgba(253, 186, 116, 1); --farallon-main-color: rgba(253, 186, 116, 1);
--farallon-hover-color: rgba(255, 237, 213, 1); --farallon-hover-color: rgba(255, 237, 213, 1);
@ -223,7 +235,6 @@
border-color: #3f3f46 border-color: #3f3f46
} }
/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/ /*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/
html { html {
line-height: 1.15; line-height: 1.15;
@ -251,9 +262,7 @@ hr {
pre { pre {
font-family: monospace, monospace; font-family: monospace, monospace;
font-size: 1em; font-size: 1em
overflow: hide;
text-overflow: ellipsis
} }
a { a {
@ -1049,6 +1058,11 @@ textarea {
position: relative position: relative
} }
.nav-links a {
padding: 20px;
position: relative
}
.nav-links .page-numbers:hover, .nav-links .page-numbers:hover,
.nav-links .post-page-numbers:hover { .nav-links .post-page-numbers:hover {
color: var(--farallon-hover-color) color: var(--farallon-hover-color)
@ -1075,6 +1089,14 @@ textarea {
left: 0 left: 0
} }
.nav-links span {
color: var(--farallon-text-gray)
}
.hidden {
display: none !important;
}
.nav-links .page-numbers.dots, .nav-links .page-numbers.dots,
.nav-links .post-page-numbers.dots { .nav-links .post-page-numbers.dots {
color: var(--farallon-text-gray) color: var(--farallon-text-gray)
@ -1722,8 +1744,7 @@ textarea {
font-size: 75%; font-size: 75%;
padding: 2px 4px; padding: 2px 4px;
word-break: break-word; word-break: break-word;
color: var(--farallon-text-light); color: var(--farallon-text-light)
overflow: hidden;
} }
.graph pre { .graph pre {
@ -1737,18 +1758,14 @@ textarea {
line-height: 1.4; line-height: 1.4;
color: var(--farallon-text-light); color: var(--farallon-text-light);
margin-left: -3.5%; margin-left: -3.5%;
margin-right: -3.5%; margin-right: -3.5%
overflow: hidden;
text-overflow: ellipsis
} }
.graph pre code { .graph pre code {
background-color: transparent; background-color: transparent;
font-size: 100%; font-size: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0
overflow: hidden;
text-overflow: ellipsis
} }
.graph--mixtapeEmbed { .graph--mixtapeEmbed {
@ -2011,9 +2028,7 @@ textarea {
.graph pre { .graph pre {
margin-left: 0; margin-left: 0;
margin-right: 0; margin-right: 0
overflow: hidden;
text-overflow: ellipsis
} }
.graph h2, .graph h2,
@ -2250,15 +2265,7 @@ textarea {
border-radius: 100% border-radius: 100%
} }
div.cancel-comment-reply.cancel-comment-reply-link {
text-align: right;
}
.comment-content { .comment-content {
word-wrap: break-word !important;
overflow-wrap: break-word !important;
white-space: normal !important;
color: var(--farallon-text-light) color: var(--farallon-text-light)
} }
@ -2596,6 +2603,18 @@ div.cancel-comment-reply.cancel-comment-reply-link {
} }
} }
.db--container {
--db-item-width: 150px;
--db-item-height: 215px;
--db-music-width: 150px;
--db-music-height: 150px;
--db-primary-color: var(--farallon-hover-color);
--db-background-white: var(--farallon-background-white);
--db-background-gray: var(--farallon-background-gray);
--db-border-color: var(--farallon-border-color);
--db-text-light: var(--farallon-text-light)
}
.db--nav { .db--nav {
padding: 30px 0 20px; padding: 30px 0 20px;
display: flex; display: flex;
@ -2631,14 +2650,14 @@ div.cancel-comment-reply.cancel-comment-reply-link {
} }
.db--image { .db--image {
width: 150px; width: var(--db-item-width);
height: 215px; height: var(--db-item-height);
object-fit: cover; object-fit: cover;
border-radius: 4px border-radius: 4px
} }
.db--image:hover { .db--image:hover {
box-shadow: 0 0 10px var(--farallon-border-color) box-shadow: 0 0 10px var(--db-border-color)
} }
.db--title { .db--title {
@ -2648,12 +2667,12 @@ div.cancel-comment-reply.cancel-comment-reply-link {
} }
.db--title a:hover { .db--title a:hover {
color: var(--farallon-hover-color); color: var(--db-primary-color);
text-decoration: underline text-decoration: underline
} }
.db--genreItem { .db--genreItem {
background: var(--farallon-background-gray); background: var(--db-background-gray);
font-size: 12px; font-size: 12px;
padding: 5px 12px; padding: 5px 12px;
border-radius: 4px; border-radius: 4px;
@ -2664,13 +2683,13 @@ div.cancel-comment-reply.cancel-comment-reply-link {
} }
.db--genreItem.is-active { .db--genreItem.is-active {
background-color: var(--farallon-main-color); background-color: var(--db-primary-color);
color: var(--farallon-background-white) color: var(--db-background-white)
} }
.db--genreItem:hover { .db--genreItem:hover {
background-color: var(--farallon-hover-color); background-color: var(--db-primary-color);
color: var(--farallon-background-white) color: var(--db-background-white)
} }
.db--genres { .db--genres {
@ -2687,52 +2706,22 @@ div.cancel-comment-reply.cancel-comment-reply-link {
display: flex; display: flex;
align-items: center; align-items: center;
font-size: 14px; font-size: 14px;
color: var(--text-gray-lightest) color: var(--db-text-light)
} }
.db--item { .db--item {
width: 150px; width: var(--db-item-width);
margin-right: 20px; margin-right: 20px;
margin-bottom: 20px; margin-bottom: 20px;
position: relative position: relative
} }
.db--item__music img { .db--item__music img {
width: 150px; width: var(--db-music-width);
height: 150px; height: var(--db-music-height);
object-fit: cover object-fit: cover
} }
.db--item .top250 {
position: absolute;
left: 0;
top: 0;
background: #f5c518;
color: #000;
border-radius: 4px 4px 4px 0;
line-height: 1;
padding: 3px 10px 3px 5px;
font-size: 12px;
display: flex;
margin-bottom: 2px;
font-weight: 900
}
.db--item .top250:after {
content: "";
border-top-left-radius: 0;
border-bottom-left-radius: 0;
right: 0;
top: 0;
margin-right: -.2rem;
border-radius: 0 0 4px 4px;
background: inherit;
height: 100%;
position: absolute;
width: .75rem;
transform: skewX(-20deg)
}
.ipc-signpost { .ipc-signpost {
position: relative; position: relative;
background: #f5c518; background: #f5c518;
@ -3003,77 +2992,6 @@ div.cancel-comment-reply.cancel-comment-reply-link {
} }
} }
.project--headline {
font-size: 32px;
margin-top: 50px;
line-height: 1.5;
font-weight: 900
}
.project--subtitle {
font-size: 18px;
font-weight: 200;
color: var(--farallon-text-light)
}
.theme--item {
padding: 25px 0;
font-size: 20px;
border-bottom: 1px solid var(--farallon-border-color-light)
}
.theme--item:last-child {
border-bottom: 0
}
.theme--item h3 {
line-height: 1;
margin: 0
}
.theme--tags {
display: flex;
align-items: center;
margin-top: 20px
}
.theme--tags a {
border: 1px solid var(--farallon-main-color);
color: var(--farallon-main-color);
line-height: 1.2;
font-size: 12px;
padding: 3px 12px;
border-radius: 4px;
margin-right: 20px;
font-weight: 700
}
.theme--tags a:hover {
border-color: var(--farallon-hover-color);
background-color: var(--farallon-hover-color);
color: var(--farallon-background-white)
}
.plugin--item {
padding: 15px 0;
font-size: 20px;
border-bottom: 1px solid var(--farallon-border-color-light)
}
.plugin--item:last-child {
border-bottom: 0
}
.plugin--item a:hover {
color: var(--farallon-main-color);
text-decoration: underline
}
.plugin--item .desc {
font-size: 14px;
color: var(--faraallon-text-gray)
}
.category--list { .category--list {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
@ -3804,3 +3722,8 @@ div.cancel-comment-reply.cancel-comment-reply-link {
width: 80% width: 80%
} }
} }
/* 留言url 强制换行 */
.comment-body a {
word-wrap: break-word;
word-break: break-all;
}

BIN
dist/img/1.jpg vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

BIN
dist/img/2.jpg vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

BIN
dist/img/3.jpg vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

BIN
dist/img/4.jpg vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

BIN
dist/img/404.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

BIN
dist/img/477.jpg vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

BIN
dist/img/5.jpg vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

BIN
dist/img/6.jpg vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

6
dist/js/bundle.js vendored
View File

@ -17,7 +17,7 @@
is_single = false; is_single = false;
post_id = 0; post_id = 0;
is_archive = false; is_archive = false;
VERSION = "0.5.6"; VERSION = "0.6.1";
constructor() { constructor() {
super(); super();
this.initCopyright(); this.initCopyright();
@ -45,8 +45,8 @@
} }
} }
initCopyright() { initCopyright() {
const copyright = `<div class="site--footer__info"> const copyright = `<div class="site--footer__info">由<a href="https://www.typecho.org" target="_blank">Typecho</a> 驱动 <br>
Theme <a href="https://fatesinger.com/101971" target="_blank">farallon</a> by bigfa / version ${this.VERSION} Theme <a href="https://fatesinger.com/101971" target="_blank">farallon</a> by bigfa &nbsp;<br>Made with<a href="https://www.imsun.org" target="_blank"> Sun</a> / version ${this.VERSION}
</div>`; </div>`;
document.querySelector(".site--footer__content").insertAdjacentHTML("afterend", copyright); document.querySelector(".site--footer__content").insertAdjacentHTML("afterend", copyright);
document.querySelector(".icon--copryrights").addEventListener("click", () => { document.querySelector(".icon--copryrights").addEventListener("click", () => {

1
dist/js/chart.js vendored Normal file

File diff suppressed because one or more lines are too long

6
dist/js/marked.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/js/tex-mml-chtml.js vendored Normal file

File diff suppressed because one or more lines are too long

13
dist/js/view-image.min.js vendored Normal file
View File

@ -0,0 +1,13 @@
/**
* ViewImage.min.js 2.0.2
* MIT License - http://www.opensource.org/licenses/mit-license.php
* https://tokinx.github.io/ViewImage/
*/
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.createTemplateTagFirstArg=function(b){return b.raw=b};$jscomp.createTemplateTagFirstArgWithRaw=function(b,a){b.raw=a;return b};$jscomp.arrayIteratorImpl=function(b){var a=0;return function(){return a<b.length?{done:!1,value:b[a++]}:{done:!0}}};$jscomp.arrayIterator=function(b){return{next:$jscomp.arrayIteratorImpl(b)}};$jscomp.makeIterator=function(b){var a="undefined"!=typeof Symbol&&Symbol.iterator&&b[Symbol.iterator];return a?a.call(b):$jscomp.arrayIterator(b)};
$jscomp.arrayFromIterator=function(b){for(var a,d=[];!(a=b.next()).done;)d.push(a.value);return d};$jscomp.arrayFromIterable=function(b){return b instanceof Array?b:$jscomp.arrayFromIterator($jscomp.makeIterator(b))};
(function(){window.ViewImage=new function(){var b=this;this.target="[view-image] img";this.listener=function(a){if(!(a.ctrlKey||a.metaKey||a.shiftKey||a.altKey)){var d=String(b.target.split(",").map(function(g){return g.trim()+":not([no-view])"})),c=a.target.closest(d);if(c){var e=c.closest("[view-image]")||document.body;d=[].concat($jscomp.arrayFromIterable(e.querySelectorAll(d))).map(function(g){return g.href||g.src});b.display(d,c.href||c.src);a.stopPropagation();a.preventDefault()}}};this.init=
function(a){a&&(b.target=a);["removeEventListener","addEventListener"].forEach(function(d){document[d]("click",b.listener,!1)})};this.display=function(a,d){var c=a.indexOf(d),e=(new DOMParser).parseFromString('\n <div class="view-image">\n <style>.view-image{position:fixed;inset:0;z-index:500;padding:1rem;display:flex;flex-direction:column;animation:view-image-in 300ms;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}.view-image__out{animation:view-image-out 300ms}@keyframes view-image-in{0%{opacity:0}}@keyframes view-image-out{100%{opacity:0}}.view-image-btn{width:32px;height:32px;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:3px;background-color:rgba(255,255,255,0.2)}.view-image-btn:hover{background-color:rgba(255,255,255,0.5)}.view-image-close__full{position:absolute;inset:0;background-color:rgba(48,55,66,0.3);z-index:unset;cursor:zoom-out;margin:0}.view-image-container{height:0;flex:1;display:flex;align-items:center;justify-content:center;}.view-image-lead{display:contents}.view-image-lead img{position:relative;z-index:1;max-width:100%;max-height:100%;object-fit:contain;border-radius:3px}.view-image-lead__in img{animation:view-image-lead-in 300ms}.view-image-lead__out img{animation:view-image-lead-out 300ms forwards}@keyframes view-image-lead-in{0%{opacity:0;transform:translateY(-20px)}}@keyframes view-image-lead-out{100%{opacity:0;transform:translateY(20px)}}[class*=__out] ~ .view-image-loading{display:block}.view-image-loading{position:absolute;inset:50%;width:8rem;height:2rem;color:#aab2bd;overflow:hidden;text-align:center;margin:-1rem -4rem;z-index:1;display:none}.view-image-loading::after{content:"";position:absolute;inset:50% 0;width:100%;height:3px;background:rgba(255,255,255,0.5);transform:translateX(-100%) translateY(-50%);animation:view-image-loading 800ms -100ms ease-in-out infinite}@keyframes view-image-loading{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}.view-image-tools{position:relative;display:flex;justify-content:space-between;align-content:center;color:#fff;max-width:600px;position: absolute; bottom: 5%; left: 1rem; right: 1rem; backdrop-filter: blur(10px);margin:0 auto;padding:10px;border-radius:5px;background:rgba(0,0,0,0.1);margin-bottom:constant(safe-area-inset-bottom);margin-bottom:env(safe-area-inset-bottom);z-index:1}.view-image-tools__count{width:60px;display:flex;align-items:center;justify-content:center}.view-image-tools__flip{display:flex;gap:10px}.view-image-tools [class*=-close]{margin:0 10px}</style>\n <div class="view-image-container">\n <div class="view-image-lead"></div>\n <div class="view-image-loading"></div>\n <div class="view-image-close view-image-close__full"></div>\n </div>\n <div class="view-image-tools">\n <div class="view-image-tools__count">\n <span><b class="view-image-index">'+
(c+1)+"</b>/"+a.length+'</span>\n </div>\n <div class="view-image-tools__flip">\n <div class="view-image-btn view-image-tools__flip-prev">\n <svg width="20" height="20" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="48" height="48" fill="white" fill-opacity="0.01"/><path d="M31 36L19 24L31 12" stroke="white" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>\n </div>\n <div class="view-image-btn view-image-tools__flip-next">\n <svg width="20" height="20" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="48" height="48" fill="white" fill-opacity="0.01"/><path d="M19 12L31 24L19 36" stroke="white" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>\n </div>\n </div>\n <div class="view-image-btn view-image-close">\n <svg width="16" height="16" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="48" height="48" fill="white" fill-opacity="0.01"/><path d="M8 8L40 40" stroke="white" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M8 40L40 8" stroke="white" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>\n </div>\n </div>\n </div>\n ',
"text/html").body.firstChild,g=function(f){var h={Escape:"close",ArrowLeft:"tools__flip-prev",ArrowRight:"tools__flip-next"};h[f.key]&&e.querySelector(".view-image-"+h[f.key]).click()},l=function(f){var h=new Image,k=e.querySelector(".view-image-lead");k.className="view-image-lead view-image-lead__out";setTimeout(function(){k.innerHTML="";h.onload=function(){setTimeout(function(){k.innerHTML='<img src="'+h.src+'" alt="ViewImage" no-view/>';k.className="view-image-lead view-image-lead__in"},100)};
h.src=f},300)};document.body.appendChild(e);l(d);window.addEventListener("keydown",g);e.onclick=function(f){f.target.closest(".view-image-close")?(window.removeEventListener("keydown",g),e.onclick=null,e.classList.add("view-image__out"),setTimeout(function(){return e.remove()},290)):f.target.closest(".view-image-tools__flip")&&(c=f.target.closest(".view-image-tools__flip-prev")?0===c?a.length-1:c-1:c===a.length-1?0:c+1,l(a[c]),e.querySelector(".view-image-index").innerHTML=c+1)}}}})();

View File

@ -3,22 +3,18 @@
<div class="site--footer__content"> <div class="site--footer__content">
<div class=site--footer__sns> <div class=site--footer__sns>
<?php $this->need('sns.php'); ?> <?php $this->need('sns.php'); ?>
</div>
<?php //sitemap填入 <?php //sitemap填入
if($this->options->sitemapurl): ?> if($this->options->sitemapurl): ?>
<a href="<?php $this->options->sitemapurl() ?>" target="_blank">💗</a> <a href="<?php $this->options->sitemapurl() ?>" target="_blank">💗</a>
<?php endif; ?> <?php endif; ?>
<a href="https://www.typecho.org" target="_blank">Typecho驱动</a> </div>
<a href="https://www.imsun.org" target="_blank">&nbsp;Made with Sun</a>
<?php //添加加载时间控制 <?php //添加加载时间控制
if ($this->options->showtime): ?> if ($this->options->showtime): ?>
&nbsp;页面加载耗时<?php echo timer_stop();?> &nbsp;页面加载耗时<?php echo timer_stop();?>
<?php endif; ?> <?php endif; ?>
<div class="copyright"> <?php $this->options->tongji(); ?>
<a href="<?php $this->options->siteUrl(); ?>"> <div class="copyright"> © <?php echo date('Y'); ?>
<?php $this->options->title(); ?> <?php $this->options->title(); ?>
</a> &nbsp; ©
<?php $this->options->jzyear() ?>-<?php echo date('Y'); ?>
<svg class="icon icon--copryrights" viewBox="0 0 1040 1024" width="16" height="16"> <svg class="icon icon--copryrights" viewBox="0 0 1040 1024" width="16" height="16">
<path <path
d="M717.056236 383.936299l-51.226708 0c-28.2893 0-51.226708 22.936385-51.226708 51.225685l0 128.062678c0 28.2893 22.937408 51.225685 51.226708 51.225685l51.226708 0c28.2893 0 51.225685-22.936385 51.225685-51.225685L768.281921 435.161984C768.281921 406.872684 745.345536 383.936299 717.056236 383.936299zM717.056236 537.611308c0 14.158465-11.480472 25.612331-25.613354 25.612331-14.132882 0-25.612331-11.453866-25.612331-25.612331l0-76.835969c0-14.158465 11.480472-25.613354 25.612331-25.613354 14.133905 0 25.613354 11.453866 25.613354 25.613354L717.056236 537.611308zM1013.977739 426.580538 859.776751 165.30079c-8.888438-15.063067-22.294772-25.975605-37.57171-32.080649-32.708959-34.856879-79.187527-56.638975-130.762159-56.638975L332.862064 76.581166c-51.575656 0-98.0532 21.782096-130.761136 56.639998-15.276938 6.105045-28.683273 17.017582-37.572734 32.079626L10.327206 426.580538c-21.26021 36.069497-8.655124 82.217537 28.239158 103.028515l115.00836 64.967664 0 199.163015c0 99.024318 80.264045 153.678078 179.287339 153.678078l358.580818 0c99.024318 0 179.290409-80.266092 179.290409-179.290409L870.733291 594.575694l115.00836-64.966641C1022.63184 508.798075 1035.238972 462.650035 1013.977739 426.580538zM153.574724 536.518417l-67.058278-37.875632c-24.589025-13.907755-33.019021-44.647873-18.809391-68.684312l85.86767-145.555074L153.574724 536.518417zM646.620024 127.807874c0 56.5786-60.205197 102.45137-134.467551 102.45137-74.261331 0-134.466528-45.873794-134.466528-102.45137L646.620024 127.807874zM819.507606 742.515071c0 84.893482-68.810179 153.677055-153.678078 153.677055L358.475418 896.192126c-84.8679 0-153.675008-68.783573-153.675008-153.677055l0-461.030142c0-76.150354 55.402821-139.361001 128.093377-151.545508 1.332345 83.883479 81.06734 151.545508 179.258687 151.545508 98.19237 0 177.926342-67.662029 179.25971-151.545508 72.690556 12.183484 128.096447 75.394131 128.096447 151.545508L819.508629 742.515071zM937.791569 498.642784l-67.058278 37.875632 0-252.111948 85.86767 145.552004C970.807521 453.995935 962.377524 484.736053 937.791569 498.642784z" d="M717.056236 383.936299l-51.226708 0c-28.2893 0-51.226708 22.936385-51.226708 51.225685l0 128.062678c0 28.2893 22.937408 51.225685 51.226708 51.225685l51.226708 0c28.2893 0 51.225685-22.936385 51.225685-51.225685L768.281921 435.161984C768.281921 406.872684 745.345536 383.936299 717.056236 383.936299zM717.056236 537.611308c0 14.158465-11.480472 25.612331-25.613354 25.612331-14.132882 0-25.612331-11.453866-25.612331-25.612331l0-76.835969c0-14.158465 11.480472-25.613354 25.612331-25.613354 14.133905 0 25.613354 11.453866 25.613354 25.613354L717.056236 537.611308zM1013.977739 426.580538 859.776751 165.30079c-8.888438-15.063067-22.294772-25.975605-37.57171-32.080649-32.708959-34.856879-79.187527-56.638975-130.762159-56.638975L332.862064 76.581166c-51.575656 0-98.0532 21.782096-130.761136 56.639998-15.276938 6.105045-28.683273 17.017582-37.572734 32.079626L10.327206 426.580538c-21.26021 36.069497-8.655124 82.217537 28.239158 103.028515l115.00836 64.967664 0 199.163015c0 99.024318 80.264045 153.678078 179.287339 153.678078l358.580818 0c99.024318 0 179.290409-80.266092 179.290409-179.290409L870.733291 594.575694l115.00836-64.966641C1022.63184 508.798075 1035.238972 462.650035 1013.977739 426.580538zM153.574724 536.518417l-67.058278-37.875632c-24.589025-13.907755-33.019021-44.647873-18.809391-68.684312l85.86767-145.555074L153.574724 536.518417zM646.620024 127.807874c0 56.5786-60.205197 102.45137-134.467551 102.45137-74.261331 0-134.466528-45.873794-134.466528-102.45137L646.620024 127.807874zM819.507606 742.515071c0 84.893482-68.810179 153.677055-153.678078 153.677055L358.475418 896.192126c-84.8679 0-153.675008-68.783573-153.675008-153.677055l0-461.030142c0-76.150354 55.402821-139.361001 128.093377-151.545508 1.332345 83.883479 81.06734 151.545508 179.258687 151.545508 98.19237 0 177.926342-67.662029 179.25971-151.545508 72.690556 12.183484 128.096447 75.394131 128.096447 151.545508L819.508629 742.515071zM937.791569 498.642784l-67.058278 37.875632 0-252.111948 85.86767 145.552004C970.807521 453.995935 962.377524 484.736053 937.791569 498.642784z"
@ -26,7 +22,6 @@
</svg> </svg>
</div> </div>
</div> </div>
<?php $this->options->tongji(); ?>
</footer> </footer>
<div class="backToTop"> <div class="backToTop">
<svg xmlns="http://www.w3.org/2000/svg" class="svgIcon" viewBox="0 0 14 14" fill="currentColor" aria-hidden="true"> <svg xmlns="http://www.w3.org/2000/svg" class="svgIcon" viewBox="0 0 14 14" fill="currentColor" aria-hidden="true">

View File

@ -5,29 +5,31 @@ function themeConfig($form) {
$form->addInput($logoUrl); $form->addInput($logoUrl);
$icoUrl = new Typecho_Widget_Helper_Form_Element_Text('icoUrl', NULL, NULL, _t('站点 Favicon 地址')); $icoUrl = new Typecho_Widget_Helper_Form_Element_Text('icoUrl', NULL, NULL, _t('站点 Favicon 地址'));
$form->addInput($icoUrl); $form->addInput($icoUrl);
$jzyear = new Typecho_Widget_Helper_Form_Element_Text('jzyear', NULL, NULL, _t('建站年份'), _t('eg. 2006')); $sticky = new Typecho_Widget_Helper_Form_Element_Text('sticky', NULL, NULL, _t('置顶文章cid'), _t('多篇文章以`|`符号隔开'), _t('会在首页展示置顶文章。'));
$form->addInput($jzyear); $form->addInput($sticky);
$showProfile = new Typecho_Widget_Helper_Form_Element_Radio('showProfile', $showProfile = new Typecho_Widget_Helper_Form_Element_Radio('showProfile',
array('0'=> _t('否'), '1'=> _t('是')), array('0'=> _t('否'), '1'=> _t('是')),
'0', _t('是否在文章页面显示显示作者信息'), _t('选择“是”将在文章页面包含显示作者信息。')); '0', _t('是否在文章页面显示作者信息'), _t('选择“是”将在文章页面包含显示作者信息。'));
$form->addInput($showProfile); $form->addInput($showProfile);
$instagramurl = new Typecho_Widget_Helper_Form_Element_Text('instagramurl', NULL, NULL, _t('Instagram'), _t('会在个人信息显示')); $instagramurl = new Typecho_Widget_Helper_Form_Element_Text('instagramurl', NULL, 'https://Instagram.com/', _t('Instagram'), _t('会在个人信息显示'));
$form->addInput($instagramurl); $form->addInput($instagramurl);
$telegramurl = new Typecho_Widget_Helper_Form_Element_Text('telegramurl', NULL, NULL, _t('电报'), _t('会在个人信息显示')); $telegramurl = new Typecho_Widget_Helper_Form_Element_Text('telegramurl', NULL, 'https://t.me/', _t('电报'), _t('会在个人信息显示'));
$form->addInput($telegramurl); $form->addInput($telegramurl);
$githuburl = new Typecho_Widget_Helper_Form_Element_Text('githuburl', NULL, NULL, _t('github'), _t('会在个人信息显示')); $githuburl = new Typecho_Widget_Helper_Form_Element_Text('githuburl', NULL, 'https://github.com/', _t('github'), _t('会在个人信息显示'));
$form->addInput($githuburl); $form->addInput($githuburl);
$twitterurl = new Typecho_Widget_Helper_Form_Element_Text('twitterurl', NULL, NULL, _t('twitter'), _t('会在个人信息显示')); $twitterurl = new Typecho_Widget_Helper_Form_Element_Text('twitterurl', NULL, 'https://x.com/', _t('twitter'), _t('会在个人信息显示'));
$form->addInput($twitterurl); $form->addInput($twitterurl);
$mastodonurl = new Typecho_Widget_Helper_Form_Element_Text('mastodonurl', NULL, NULL, _t('mastodon'), _t('会在个人信息显示')); $mastodonurl = new Typecho_Widget_Helper_Form_Element_Text('mastodonurl', NULL,'https://jiong.us/', _t('mastodon'), _t('会在个人信息显示'));
$form->addInput($mastodonurl); $form->addInput($mastodonurl);
$sitemapurl = new Typecho_Widget_Helper_Form_Element_Text('sitemapurl', NULL, NULL, _t('sitemap'), _t('会在页脚显示')); $sitemapurl = new Typecho_Widget_Helper_Form_Element_Text('sitemapurl', NULL, NULL, _t('sitemap'), _t('会在页脚显示'));
$form->addInput($sitemapurl); $form->addInput($sitemapurl);
$cnavatar = new Typecho_Widget_Helper_Form_Element_Text('cnavatar', NULL, 'https://cravatar.cn/avatar/', _t('Gravatar镜像'), _t('默认https://cravatar.cn/avatar/,建议保持默认')); $cnavatar = new Typecho_Widget_Helper_Form_Element_Text('cnavatar', NULL, 'https://cravatar.cn/avatar/', _t('Gravatar镜像'), _t('默认https://cravatar.cn/avatar/,建议保持默认'));
$form->addInput($cnavatar); $form->addInput($cnavatar);
$midimg = new Typecho_Widget_Helper_Form_Element_Text('midimg', NULL, './img/', _t('填写分类图片路径,以"/"结尾'), _t('可以使用本地目录或者CDN地址,自动匹配路径下以mid.jpg格式的图片,使用分类页面时需要设置'));
$form->addInput($midimg);
$donate = new Typecho_Widget_Helper_Form_Element_Text('donate', NULL, 'https://blogcdn.loliko.cn/donate/wx.png', _t('赞赏二维码'), _t('不填写则不显示')); $donate = new Typecho_Widget_Helper_Form_Element_Text('donate', NULL, 'https://blogcdn.loliko.cn/donate/wx.png', _t('赞赏二维码'), _t('不填写则不显示'));
$form->addInput($donate); $form->addInput($donate);
$doubanID = new Typecho_Widget_Helper_Form_Element_Text('doubanID', NULL, 'https://db.imsun.org/', _t('豆瓣页面必需API,包含"/"'), _t(' ')); $doubanID = new Typecho_Widget_Helper_Form_Element_Text('doubanID', NULL, 'https://db.imsun.org/', _t('豆瓣页面必需API,包含"/"'), _t('使用豆瓣页面时需要设置'));
$form->addInput($doubanID); $form->addInput($doubanID);
$twikoo = new Typecho_Widget_Helper_Form_Element_Textarea('twikoo', NULL, NULL, _t('引用第三方评论'), _t('不填写则不显示')); $twikoo = new Typecho_Widget_Helper_Form_Element_Textarea('twikoo', NULL, NULL, _t('引用第三方评论'), _t('不填写则不显示'));
$form->addInput($twikoo); $form->addInput($twikoo);
@ -35,6 +37,10 @@ function themeConfig($form) {
$form->addInput($addhead); $form->addInput($addhead);
$tongji = new Typecho_Widget_Helper_Form_Element_Textarea('tongji', NULL, NULL, _t('统计代码'), _t('支持HTML')); $tongji = new Typecho_Widget_Helper_Form_Element_Textarea('tongji', NULL, NULL, _t('统计代码'), _t('支持HTML'));
$form->addInput($tongji); $form->addInput($tongji);
$showcate = new Typecho_Widget_Helper_Form_Element_Radio('showcate',
array('0'=> _t('否'), '1'=> _t('是')),
'0', _t('是否在文章页面显示文章分类'), _t('选择“是”将在文章页面显示文章的分类信息。'));
$form->addInput($showcate);
$showallwords = new Typecho_Widget_Helper_Form_Element_Radio('showallwords', $showallwords = new Typecho_Widget_Helper_Form_Element_Radio('showallwords',
array('0'=> _t('否'), '1'=> _t('是')), array('0'=> _t('否'), '1'=> _t('是')),
'0', _t('是否显示归档字数统计'), _t('选择“是”将在归档页面显示全站总字数。')); '0', _t('是否显示归档字数统计'), _t('选择“是”将在归档页面显示全站总字数。'));
@ -521,3 +527,124 @@ function getParentCategory($categoryId) {
function getDays($time1, $time2) { function getDays($time1, $time2) {
return floor(($time2 - $time1) / 86400); return floor(($time2 - $time1) / 86400);
} }
//获取文章卡片
function get_article_info($atts) {
$default_atts = array(
'id' => '',
'url' => ''
);
$atts = array_merge($default_atts, $atts);
$db = Typecho_Db::get();
if (!empty($atts['id'])) {
$post = $db->fetchRow($db->select()->from('table.contents')
->where('cid = ?', $atts['id'])
->limit(1));
} elseif (!empty($atts['url'])) {
$post = $db->fetchRow($db->select()->from('table.contents')
->where('permalink = ?', $atts['url'])
->limit(1));
} else {
return '请提供文章ID或URL';
}
if (!$post) {
return '未找到文章';
}
$post = Typecho_Widget::widget('Widget_Abstract_Contents')->push($post);
// 获取缩略图
$imageToDisplay = img_postthumb($post['cid']);
if (empty($imageToDisplay)) {
$imageToDisplay = '//pic.0tz.top/api'; // 设置一个默认图片路径
}
$output = '<div class="graph--mixtapeEmbed">';
$output .= '<a class="mixtapeContent" href="' . $post['permalink'] . '" target="_blank">';
$output .= '<span class="markup--strong markup--mixtapeEmbed-strong">' . $post['title'] . '</span>';
$output .= '<em class="markup--em markup--mixtapeEmbed-em">' . Typecho_Common::subStr(strip_tags($post['text']), 0, 100, '...') . '</em>';
$output .= '</a>';
$output .= '<a class="mixtapeImage" href="' . $post['permalink'] . '" target="_blank" style="background-image:url(' . $imageToDisplay . ')"></a>';
$output .= '</div>';
return $output;
}
// 创建一个新的类来处理内容过滤
class ContentFilter
{
public static function filterContent($content, $widget, $lastResult)
{
// 首先运行之前的过滤器结果
$content = empty($lastResult) ? $content : $lastResult;
// 然后处理我们的文章短代码
$content = preg_replace_callback('/\[article\s+([^\]]+)\]/', function($matches) {
$atts = self::parse_atts($matches[1]);
return get_article_info($atts);
}, $content);
return $content;
}
// 解析短代码属性
private static function parse_atts($text) {
$atts = array();
$pattern = '/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/';
$text = preg_replace("/[\x{00a0}\x{200b}]+/u", " ", $text);
if (preg_match_all($pattern, $text, $match, PREG_SET_ORDER)) {
foreach ($match as $m) {
if (!empty($m[1]))
$atts[strtolower($m[1])] = stripcslashes($m[2]);
elseif (!empty($m[3]))
$atts[strtolower($m[3])] = stripcslashes($m[4]);
elseif (!empty($m[5]))
$atts[strtolower($m[5])] = stripcslashes($m[6]);
elseif (isset($m[7]) && strlen($m[7]))
$atts[] = stripcslashes($m[7]);
elseif (isset($m[8]))
$atts[] = stripcslashes($m[8]);
}
}
return $atts;
}
}
// 注册钩子
Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('ContentFilter', 'filterContent');
// 编辑器按钮类
class EditorButton {
public static function render()
{
echo <<<EOF
<script>
$(document).ready(function() {
$('#wmd-button-row').append('<li class="wmd-button" id="wmd-article-button" title="插入文章引用"><span style="background: none;"><svg t="1687164718203" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4158" width="20" height="20"><path d="M810.666667 213.333333H213.333333c-46.933333 0-85.333333 38.4-85.333333 85.333334v426.666666c0 46.933333 38.4 85.333333 85.333333 85.333334h597.333334c46.933333 0 85.333333-38.4 85.333333-85.333334V298.666667c0-46.933333-38.4-85.333333-85.333333-85.333334z m0 512H213.333333V298.666667h597.333334v426.666666z" p-id="4159"></path><path d="M298.666667 384h426.666666v85.333333H298.666667zM298.666667 554.666667h426.666666v85.333333H298.666667z" p-id="4160"></path></svg></span></li>');
$('#wmd-article-button').click(function() {
var articleId = prompt("请输入要引用的文章ID");
if (articleId) {
var text = "[article id=\"" + articleId + "\"]";
var textarea = $('#text')[0];
var start = textarea.selectionStart;
var end = textarea.selectionEnd;
var value = textarea.value;
textarea.value = value.substring(0, start) + text + value.substring(end);
// 将光标移动到插入的文本之后
textarea.setSelectionRange(start + text.length, start + text.length);
textarea.focus();
// 触发change事件确保编辑器更新
$('#text').trigger('change');
}
});
});
</script>
EOF;
}
}
// 注册编辑器按钮钩子
Typecho_Plugin::factory('admin/write-post.php')->bottom = array('EditorButton', 'render');
Typecho_Plugin::factory('admin/write-page.php')->bottom = array('EditorButton', 'render');

View File

@ -17,7 +17,7 @@ if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
'date' => _t('在<span> %s </span>发布的文章'), 'date' => _t('在<span> %s </span>发布的文章'),
'author' => _t('%s 发布的文章') 'author' => _t('%s 发布的文章')
), '', ' - '); ?><?php if ($this->is('post')) $this->category(',', false);?><?php if ($this->is('post')) echo ' - ';?><?php $this->options->title(); ?><?php if ($this->is('index')) echo ' - '; ?><?php if ($this->is('index')) $this->options->description() ?></title> ), '', ' - '); ?><?php if ($this->is('post')) $this->category(',', false);?><?php if ($this->is('post')) echo ' - ';?><?php $this->options->title(); ?><?php if ($this->is('index')) echo ' - '; ?><?php if ($this->is('index')) $this->options->description() ?></title>
<link rel="stylesheet" href="<?php $this->options->themeUrl('/dist/css/style.css'); ?>"> <link rel="stylesheet" href="<?php $this->options->themeUrl('/dist/css/style.min.css'); ?>">
<?php if ($this->options->icoUrl): ?> <?php if ($this->options->icoUrl): ?>
<link rel='icon' href='<?php $this->options->icoUrl() ?>' type='image/x-icon' /> <link rel='icon' href='<?php $this->options->icoUrl() ?>' type='image/x-icon' />
<?php endif; ?> <?php endif; ?>
@ -42,7 +42,10 @@ if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<?php if ($this->options->logoUrl): ?> <?php if ($this->options->logoUrl): ?>
<a href="<?php $this->options->siteUrl(); ?>" class="site--url"> <a href="<?php $this->options->siteUrl(); ?>" class="site--url">
<img src="<?php $this->options->logoUrl() ?>" class="avatar" alt="<?php $this->options->title() ?>" /> <img src="<?php $this->options->logoUrl() ?>" class="avatar" alt="<?php $this->options->title() ?>" />
</a> </a>
<span class="u-xs-show">
<a href="<?php $this->options->siteUrl(); ?>"><?php $this->options->title() ?></a>
</span>
<?php else: ?> <?php else: ?>
<span class="u-xs-show"> <span class="u-xs-show">
<a href="<?php $this->options->siteUrl(); ?>"><?php $this->options->title() ?></a> <a href="<?php $this->options->siteUrl(); ?>"><?php $this->options->title() ?></a>

View File

@ -1,10 +1,10 @@
<?php <?php
/** /**
* 移植自HUGO主题 farallon 原作者 bigfa * 一款单栏主题. 移植自HUGO主题 Farallon 原作者 bigfa
* @package farallon * @package Farallon
* @author 老孙 * @author 老孙
* @version 0.5.6 * @version 0.6.1
* @link https://imsun.org * @link https://www.imsun.org
*/ */
if (!defined('__TYPECHO_ROOT_DIR__')) exit; if (!defined('__TYPECHO_ROOT_DIR__')) exit;
$this->need('header.php'); $this->need('header.php');

View File

@ -17,10 +17,9 @@ if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<?php <?php
// 获取分类 ID // 获取分类 ID
$categoryId = $categories->mid; $categoryId = $categories->mid;
// 获取主题URL $themeUrl = $this->options->midimg;
$themeUrl = $this->options->themeUrl;
// 为每个分类生成图片地址 // 为每个分类生成图片地址
$categoryImage = $themeUrl . '/dist/img/' . $categoryId . '.jpg'; $categoryImage = $themeUrl . $categoryId . '.jpg';
?> ?>
<div class="category--item"> <div class="category--item">
<img class="category--cover" src="<?php echo $categoryImage; ?>" loading="lazy" alt="<?php $categories->name(); ?>"> <img class="category--cover" src="<?php echo $categoryImage; ?>" loading="lazy" alt="<?php $categories->name(); ?>">

View File

@ -79,8 +79,8 @@ $this->need('header.php');
category: <?php echo json_encode(categoryPostCount()); ?> category: <?php echo json_encode(categoryPostCount()); ?>
}; };
</script> </script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/jkjoy/typecho-theme-farallon@0.5.0/dist/js/chart.js"></script> <script type="text/javascript" src="<?php $this->options->themeUrl('/dist/js/chart.js'); ?>"></script>
<script id="MathJax-script" async src="https://jsd.onmicrosoft.cn/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script id="MathJax-script" async src="<?php $this->options->themeUrl('/dist/js/tex-mml-chtml.js'); ?>"></script>
<script> <script>
// 配置 MathJax // 配置 MathJax
MathJax = { MathJax = {

View File

@ -11,9 +11,6 @@ if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<h1 class="post--single__title"><?php $this->title() ?></h1> <h1 class="post--single__title"><?php $this->title() ?></h1>
<h2 class="post--single__subtitle"><?php $this->content(); ?> </h2> <h2 class="post--single__subtitle"><?php $this->content(); ?> </h2>
</header> </header>
<div class="graph u-marginBottom30">
<?php $this->content(); ?>
</div>
<div class="template--linksWrap"> <div class="template--linksWrap">
<ul class="link-items"> <ul class="link-items">
<?php <?php

View File

@ -13,9 +13,8 @@ if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
</header> </header>
<article class="post--single"> <article class="post--single">
<?php $tooot = $this->fields->tooot ? $this->fields->tooot : 'https://bbapi.ima.cm'; ?> <?php $tooot = $this->fields->tooot ? $this->fields->tooot : 'https://bbapi.ima.cm'; ?>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <script src="<?php $this->options->themeUrl('/dist/js/marked.min.js'); ?>"></script>
<script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.umd.js"></script> <script src="<?php $this->options->themeUrl('/dist/js/view-image.min.js'); ?>"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.css" />
<div id="tooot"></div> <div id="tooot"></div>
<div class="nav-links" id="loadmore"> <div class="nav-links" id="loadmore">
<span class="loadmore">加载更多</span> <span class="loadmore">加载更多</span>
@ -34,7 +33,7 @@ window.onload = function() {
if (media_attachments.length > 0) { if (media_attachments.length > 0) {
media_attachments.forEach(attachment => { media_attachments.forEach(attachment => {
if (attachment.type === 'image') { if (attachment.type === 'image') {
mediaHTML += `<a href="${attachment.url}" target="_blank"><img src="${attachment.preview_url}" data-fancybox="img" class="thumbnail-image img"></a>`; mediaHTML += `<a href="${attachment.url}" target="_blank"><img src="${attachment.preview_url}" class="thumbnail-image img" ></a>`;
} }
}); });
} }
@ -45,7 +44,7 @@ window.onload = function() {
<article class='post--item post--item__status'> <article class='post--item post--item__status'>
<div class='content'> <div class='content'>
<header> <header>
<img src="${account.avatar}" class="avatar" width="48" height="48" /> <img src="${account.avatar}" class="avatar" width="48" height="48" no-view />
<a class="humane--time" href="${url}" target="_blank">${new Date(created_at).toLocaleString()}</a> <a class="humane--time" href="${url}" target="_blank">${new Date(created_at).toLocaleString()}</a>
</header> </header>
<div class="description" itemprop="about"> <div class="description" itemprop="about">
@ -82,9 +81,7 @@ window.onload = function() {
// 绑定“加载更多”按钮的点击事件 // 绑定“加载更多”按钮的点击事件
document.getElementById('loadmore').addEventListener('click', fetchAndDisplayToots); document.getElementById('loadmore').addEventListener('click', fetchAndDisplayToots);
}; };
Fancybox.bind("[data-fancybox]", { window.ViewImage && ViewImage.init('.content img');
// Your custom options
});
</script> </script>
<style> <style>
div pre code { div pre code {
@ -92,7 +89,6 @@ div pre code {
white-space: pre-wrap; /* CSS3 */ white-space: pre-wrap; /* CSS3 */
word-wrap: break-word; /* 老版本的浏览器 */ word-wrap: break-word; /* 老版本的浏览器 */
overflow-wrap: break-word; overflow-wrap: break-word;
/* 指定如何断行 */
word-break: break-all; word-break: break-all;
word-break: break-word; word-break: break-word;
} }

View File

@ -18,15 +18,22 @@ if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
$memosnum = $this->fields->memosnum ? $this->fields->memosnum : '20'; $memosnum = $this->fields->memosnum ? $this->fields->memosnum : '20';
?> ?>
<article class="post--single"> <article class="post--single">
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <script src="<?php $this->options->themeUrl('/dist/js/marked.min.js'); ?>"></script>
<script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.umd.js"></script> <script src="<?php $this->options->themeUrl('/dist/js/view-image.min.js'); ?>"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.css" />
<div id="talk"></div> <div id="talk"></div>
<div class="nav-links" id="loadmore">
<span class="loadmore">加载更多</span>
</div>
</article> </article>
<script> <script>
if (99) { let currentPage = 1; // 当前页码
let url = '<?php echo $memos; ?>'; const limit = 10; // 每页条数
fetch(url + '/api/v1/memo?creatorId=<?php echo $memosID; ?>&rowStatus=NORMAL&limit=<?php echo $memosnum; ?>') let url = '<?php echo $memos; ?>';
let memosID = '<?php echo $memosID; ?>';
let memosnum = '<?php echo $memosnum; ?>';
function loadMemos(page) {
fetch(`${url}/api/v1/memo?creatorId=${memosID}&rowStatus=NORMAL&limit=${limit}&offset=${(page - 1) * limit}`)
.then(res => res.json()) .then(res => res.json())
.then(data => { .then(data => {
let html = ''; let html = '';
@ -38,7 +45,7 @@ if (99) {
<article class='post--item post--item__status'> <article class='post--item post--item__status'>
<div class='content'> <div class='content'>
<header> <header>
<img src="<?php $this->options->logoUrl() ?>" class="avatar" width="48" height="48" /> <img src="<?php $this->options->logoUrl() ?>" class="avatar" width="48" height="48" no-view />
<a class="humane--time" href="${memoURL}" target="_blank">${data.date}</a> <a class="humane--time" href="${memoURL}" target="_blank">${data.date}</a>
</header> </header>
<div class="description" itemprop="about"> <div class="description" itemprop="about">
@ -49,55 +56,65 @@ if (99) {
</article> </article>
`; `;
}); });
document.getElementById('talk').innerHTML = html; document.getElementById('talk').innerHTML += html;
}) })
.catch(error => { .catch(error => {
console.error('Error:', error); console.error('Error:', error);
// 这里可以添加一些用户提示错误发生的 HTML 更新 // 这里可以添加一些用户提示错误发生的 HTML 更新
}); });
function Format(item) { }
let date = getTime(new Date(item.createdTs * 1000).toString()),
content = item.content, function Format(item) {
tag = item.content.match(/#([^\s#]+?) /g), let date = getTime(new Date(item.createdTs * 1000).toString()),
imgs = content.match(/!\[.*\]\(.*?\)/g), content = item.content,
text = '' tag = item.content.match(/#([^\s#]+?) /g),
if (imgs) imgs = imgs.map(item => { return item.replace(/!\[.*\]\((.*?)\)/, '$1') }) imgs = content.match(/!\[.*\]\(.*?\)/g),
if (item.resourceList.length) { text = ''
if (!imgs) imgs = [] if (imgs) imgs = imgs.map(item => { return item.replace(/!\[.*\]\((.*?)\)/, '$1') })
item.resourceList.forEach(t => { if (item.resourceList.length) {
if (t.externalLink) imgs.push(t.externalLink) if (!imgs) imgs = []
else imgs.push(`${url}/o/r/${t.id}/${t.publicId}/${t.filename}`) item.resourceList.forEach(t => {
}) if (t.externalLink) imgs.push(t.externalLink)
} else imgs.push(`${url}/o/r/${t.id}/${t.publicId}/${t.filename}`)
text = content.replace(/#(.*?)\s/g, '').replace(/\!?\[(.*?)\]\((.*?)\)/g, '').replace(/\{(.*?)\}/g, '') })
content = text.replace(/\[(.*?)\]\((.*?)\)/g, `<a href="$2" target="_blank">$1</a>`);
if (imgs) {
content += `<div class="resimg">`
imgs.forEach(e => content += `<a href="${e}" data-fancybox="gallery" class="fancybox img" data-thumb="${e}"><img class="no-lazyload thumbnail-image" src="${e}"></a>`
)
content += '</div>'
}
return {
content: content,
tag: tag ? tag[0].replace(/#([^\s#]+?) /,'$1') : '日常',
date: date,
text: text.replace(/\[(.*?)\]\((.*?)\)/g, '[链接]' + `${imgs?'[图片]':''}`)
}
} }
// 页面时间格式化 text = content.replace(/#(.*?)\s/g, '').replace(/\!?\[(.*?)\]\((.*?)\)/g, '').replace(/\{(.*?)\}/g, '')
function getTime(time) { content = text.replace(/\[(.*?)\]\((.*?)\)/g, `<a href="$2" target="_blank">$1</a>`);
let d = new Date(time), if (imgs) {
ls = [d.getFullYear(), d.getMonth() + 1, d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds()]; content += `<div class="resimg">`
for (let i = 0; i < ls.length; i++) { imgs.forEach(e => content += `<a href="${e}" class="img" data-thumb="${e}"><img class="no-lazyload thumbnail-image" src="${e}"></a>`
ls[i] = ls[i] <= 9 ? '0' + ls[i] : ls[i] + '' )
} content += '</div>'
if (new Date().getFullYear() == ls[0]) return ls[1] + '月' + ls[2] + '日 ' + ls[3] +':'+ ls[4] }
else return ls[0] + '年' + ls[1] + '月' + ls[2] + '日 ' + ls[3] +':'+ ls[4] return {
content: content,
tag: tag ? tag[0].replace(/#([^\s#]+?) /,'$1') : '日常',
date: date,
text: text.replace(/\[(.*?)\]\((.*?)\)/g, '[链接]' + `${imgs?'[图片]':''}`)
} }
} }
Fancybox.bind("[data-fancybox]", {
// Your custom options // 页面时间格式化
function getTime(time) {
let d = new Date(time),
ls = [d.getFullYear(), d.getMonth() + 1, d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds()];
for (let i = 0; i < ls.length; i++) {
ls[i] = ls[i] <= 9 ? '0' + ls[i] : ls[i] + ''
}
if (new Date().getFullYear() == ls[0]) return ls[1] + '月' + ls[2] + '日 ' + ls[3] +':'+ ls[4]
else return ls[0] + '年' + ls[1] + '月' + ls[2] + '日 ' + ls[3] +':'+ ls[4]
}
// 初始加载第一页
loadMemos(currentPage);
// 点击“加载更多”按钮时加载下一页
document.getElementById('loadmore').addEventListener('click', function() {
currentPage++;
loadMemos(currentPage);
}); });
window.ViewImage && ViewImage.init('.content img');
</script> </script>
<style> <style>
div pre code { div pre code {
@ -150,6 +167,33 @@ img {
grid-template-columns: 1fr; /* 修改为一列 */ grid-template-columns: 1fr; /* 修改为一列 */
} }
} }
.load-more-btn {
display: block;
margin: 20px auto;
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
cursor: pointer;
border-radius: 5px;
}
.load-more-btn:hover {
background-color: #0056b3;
}
.nav-links .loadmore {
border: 1px solid var(--farallon-border-color);
cursor: pointer;
position: relative;
padding: 5px 30px;
border-radius: 8px;
font-size: 14px;
color: var(--farallon-text-gray)
}
.nav-links .loadmore:hover {
border-color: var(--farallon-hover-color);
color: var(--farallon-hover-color)
}
</style> </style>
</div> </div>
<?php $this->need('footer.php'); ?> <?php $this->need('footer.php'); ?>

View File

@ -1,18 +0,0 @@
<?php
/**
* 说说页面 - 时光机
*
* @package custom
*/
if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<?php $this->need('header.php'); ?>
<section class="site--main">
<header class="archive--header">
<h1 class="post--single__title"><?php $this->title() ?></h1>
<h2 class="post--single__subtitle"><?php $this->content(); ?> </h2>
</header>
<article class="post--single">
<?php $this->need('times/dycomment.php'); ?>
</article>
</section>
<?php $this->need('footer.php'); ?>

132
post.php
View File

@ -36,10 +36,11 @@
</g> </g>
</svg> <a href="<?php $this->permalink() ?>#comments"><?php $this->commentsNum('0 ', '1 ', '%d '); ?></a> </svg> <a href="<?php $this->permalink() ?>#comments"><?php $this->commentsNum('0 ', '1 ', '%d '); ?></a>
<?php if($this->user->hasLogin() && $this->user->pass('editor', true)): ?> <?php if($this->user->hasLogin() && $this->user->pass('editor', true)): ?>
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="16" height="16"> <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="currentColor">
<path <path d="M16.7574 2.99677L14.7574 4.99677H5V18.9968H19V9.23941L21 7.23941V19.9968C21 20.5491 20.5523 20.9968 20 20.9968H4C3.44772 20.9968 3 20.5491 3 19.9968V3.99677C3 3.44448 3.44772 2.99677 4 2.99677H16.7574ZM20.4853 2.09727L21.8995 3.51149L12.7071 12.7039L11.2954 12.7063L11.2929 11.2897L20.4853 2.09727Z">
d="M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z"/> </path>
</svg><a href="<?php $this->options->adminUrl('write-post.php?cid=' . $this->cid); ?>" target="_blank" title="编辑文章">Edit</a> </svg>
<a href="<?php $this->options->adminUrl('write-post.php?cid=' . $this->cid); ?>" target="_blank" title="编辑文章">Edit</a>
<?php endif; ?> <?php endif; ?>
</div> </div>
<h2 class="post--single__title"><?php $this->title() ?></h2> <h2 class="post--single__title"><?php $this->title() ?></h2>
@ -135,6 +136,43 @@
<?php if ($this->options->showProfile): ?> <?php if ($this->options->showProfile): ?>
<?php $this->need('profile.php'); ?> <?php $this->need('profile.php'); ?>
<?php endif; ?> <?php endif; ?>
<!-- 分类-->
<?php if ($this->options->showcate): ?>
<?php
// 初始化分类图片地址为空
$categoryImage = '';
// 检查文章是否有分类
if ($this->categories) {
// 获取第一个分类的信息
$category = $this->categories[0];
$categoryId = $category['mid'];
$categoryName = $category['name'];
$categoryDescription = $category['description']; // 如果分类有说明(描述)
// 获取主题选项中的分类图片基本 URL
$themeUrl = $this->options->midimg;
// 生成分类图片地址
$categoryImage = $themeUrl . $categoryId . '.jpg';
}
?>
<!-- 显示分类信息 -->
<?php if ($category): ?>
<div class="category--card__list">
<a href="<?php echo $category['permalink']; ?>" class="category--card">
<div class="category--card__image">
<img src="<?php echo htmlspecialchars($categoryImage); ?>" alt="<?php echo htmlspecialchars($categoryName); ?>">
</div>
<div class="category--card__content">
<div class="category--card__title"><?php echo htmlspecialchars($categoryName); ?></div>
<div class="category--card__description"><?php echo htmlspecialchars($categoryDescription); ?></div>
</div>
</a>
</div>
<?php endif; ?>
<?php endif; ?>
<!-- 相关文章--> <!-- 相关文章-->
<?php if ($this->options->showrelated): ?> <?php if ($this->options->showrelated): ?>
<?php $this->need('related.php'); ?> <?php $this->need('related.php'); ?>
@ -228,6 +266,92 @@ document.addEventListener('DOMContentLoaded', (event) => {
currentList.appendChild(item); currentList.appendChild(item);
}); });
}); });
</script>
<script>
function fetchWithRetry(url, retries = 3) {
return fetch(url)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text(); // 首先获取文本响应
})
.then(text => {
try {
return JSON.parse(text); // 尝试解析 JSON
} catch (e) {
console.error('Invalid JSON:', text);
throw new Error('Invalid JSON response');
}
})
.catch(error => {
if (retries > 0) {
console.log(`Retrying... (${retries} attempts left)`);
return new Promise(resolve => setTimeout(resolve, 1000)) // 等待1秒
.then(() => fetchWithRetry(url, retries - 1));
}
throw error;
});
}
document.addEventListener('DOMContentLoaded', function() {
const doubanLinks = document.querySelectorAll('a[href^="https://movie.douban.com/subject/"]');
doubanLinks.forEach(link => {
const url = link.href;
const movieId = url.match(/subject\/(\d+)/)[1];
link.innerHTML += ' <span class="loading">(加载中...)</span>';
fetchWithRetry(`<?php $this->options->themeUrl('db.php'); ?>?id=${movieId}`)
.then(data => {
const movieInfo = createMovieInfoHTML(data, url);
const wrapper = document.createElement('div');
wrapper.innerHTML = movieInfo;
link.parentNode.replaceChild(wrapper, link);
})
.catch(error => {
console.error('Error fetching movie data:', error);
// 显示错误消息给用户
link.innerHTML = `<span style="color: red;">加载失败</span> <a href="${url}" target="_blank">查看豆瓣电影详情</a>`;
})
.finally(() => {
const loadingSpan = link.querySelector('.loading');
if (loadingSpan) {
loadingSpan.remove();
}
});
});
});
function createMovieInfoHTML(data, originalUrl) {
if (!data || data.error || Object.keys(data).length === 0) {
return `<a href="${originalUrl}" target="_blank">查看豆瓣电影详情</a>`;
}
return `
<div class=doulist-item>
<div class=doulist-subject>
<div class=doulist-post>
<img decoding=async referrerpolicy=no-referrer src=${data.img}>
</div>
<div class=doulist-content>
<div class=doulist-title>
<a href="${originalUrl}" class=cute target="_blank" rel="external nofollow"> ${data.name} </a>
</div>
<div class=rating>
<span class=rating_nums>豆瓣评分 : ${data.rating}</span>
</div>
<div class=abstract>
${data.year} · ${data.country} · ${data.genre} · 导演: ${data.director} · 演员 : ${data.actor}
</div>
</div>
</div>
</div>
`;
}
</script> </script>
<?php $this->need('footer.php'); ?> <?php $this->need('footer.php'); ?>

View File

@ -1,4 +1,103 @@
<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?> <?php
// 确保退出安全
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
/** 文章置顶 */
$sticky = $this->options->sticky; // 置顶的文章id多个用|隔开
$db = Typecho_Db::get();
$pageSize = $this->options->pageSize;
if ($sticky && !empty(trim($sticky))) {
$sticky_cids = array_filter(explode('|', $sticky)); // 分割文本并过滤空值
if (!empty($sticky_cids)) {
$sticky_html = " <span class='sticky--post'> 置顶 </span> "; // 置顶标题的 html
// 清空原有文章的队列
$this->row = [];
$this->stack = [];
$this->length = 0;
// 获取总数,并排除置顶文章数量
if (isset($this->currentPage) && $this->currentPage == 1) {
$totalOriginal = $this->getTotal();
$stickyCount = count($sticky_cids);
$this->setTotal(max($totalOriginal - $stickyCount, 0));
// 构建置顶文章的查询
$selectSticky = $this->select()->where('type = ?', 'post');
foreach ($sticky_cids as $i => $cid) {
if ($i == 0)
$selectSticky->where('cid = ?', $cid);
else
$selectSticky->orWhere('cid = ?', $cid);
}
// 获取置顶文章
$stickyPosts = $db->fetchAll($selectSticky);
// 压入置顶文章到文章队列
foreach ($stickyPosts as &$stickyPost) {
$stickyPost['title'] .= $sticky_html;
$this->push($stickyPost);
}
$standardPageSize = $pageSize - count($stickyPosts);
} else {
$standardPageSize = $pageSize;
}
// 构建正常文章查询,排除置顶文章
$selectNormal = $this->select()
->where('type = ?', 'post')
->where('status = ?', 'publish')
->where('created < ?', time())
->order('created', Typecho_Db::SORT_DESC)
->page(isset($this->currentPage) ? $this->currentPage : 1, $standardPageSize);
foreach ($sticky_cids as $cid) {
$selectNormal->where('table.contents.cid != ?', $cid);
}
} else {
// 如果sticky_cids为空使用默认查询
$selectNormal = $this->select()
->where('type = ?', 'post')
->where('status = ?', 'publish')
->where('created < ?', time())
->order('created', Typecho_Db::SORT_DESC)
->page(isset($this->currentPage) ? $this->currentPage : 1, $pageSize);
}
} else {
// 如果没有置顶文章,使用默认查询
$selectNormal = $this->select()
->where('type = ?', 'post')
->where('status = ?', 'publish')
->where('created < ?', time())
->order('created', Typecho_Db::SORT_DESC)
->page(isset($this->currentPage) ? $this->currentPage : 1, $pageSize);
}
// 登录用户显示私密文章
if ($this->user->hasLogin()) {
$uid = $this->user->uid;
if ($uid) {
$selectNormal->orWhere('authorId = ? AND status = ?', $uid, 'private');
}
}
$normalPosts = $db->fetchAll($selectNormal);
// 如果之前没有清空队列(没有置顶文章的情况),现在清空
if (empty($sticky) || empty(trim($sticky)) || empty($sticky_cids)) {
$this->row = [];
$this->stack = [];
$this->length = 0;
}
// 压入正常文章到文章队列
foreach ($normalPosts as $normalPost) {
$this->push($normalPost);
}
?>
<?php while($this->next()): ?> <?php while($this->next()): ?>
<article class="post--item"> <article class="post--item">
<div class="content"> <div class="content">
@ -65,59 +164,20 @@
</article> </article>
<?php endwhile; ?> <?php endwhile; ?>
<?php <?php
$this->pagenav( $this->pageNav(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z" fill="var(--main)"></path></svg>', ' ',
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.1714 12.0007L8.22168 7.05093L9.63589 5.63672L15.9999 12.0007L9.63589 18.3646L8.22168 16.9504L13.1714 12.0007Z" fill="var(--main)"></path></svg>', ' ',
1, 1,
'...', '...',
array( array(
'wrapTag' => 'div', 'wrapTag' => 'nav',
'wrapClass' => 'pagination_page', 'wrapClass' => 'nav-links nav-links__comment',
'itemTag' => '', 'itemTag' => '',
'textTag' => 'a', 'textTag' => 'span',
'currentClass' => 'active', 'itemClass' => 'page-numbers',
'prevClass' => 'prev', 'currentClass' => 'page-numbers current',
'nextClass' => 'next' 'prevClass' => 'hidden',
'nextClass' => 'hidden'
) )
); );
?> ?>
<style>
/* 分页 */
.pagination_page{
display: flex;
align-items: center;
justify-content: center;
margin-top: var(--margin);
gap: 0.5rem;
}
.pagination_page li.active a {
background: var(--theme);
color: #fff;
font-weight: 500;
}
.pagination_page a{
display: flex;
padding: 0.5rem;
font-size: 0.9rem;
width: 1.75rem;
height: 1.75rem;
background: var(--background);
border-radius: 50%;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
transition: 0.2s;
-webkit-transition: 0.2s;
justify-content: center;
align-items: center;
letter-spacing: 0;
}
.pagination_page span.next{
cursor: pointer;
}
.pagination_page li.active a:hover{
cursor: not-allowed;
}
/* 分页 */
</style>

View File

@ -1,54 +0,0 @@
<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
class Content
{
public static function postCommentContent($content, $isLogin, $rememberEmail, $currentEmail, $parentEmail, $isTime = false)
{
//解析私密评论
$flag = true;
if (strpos($content, '[secret]') !== false) {//提高效率,避免每篇文章都要解析
$pattern = self::get_shortcode_regex(array('secret'));
$content = preg_replace_callback("/$pattern/", array('Content', 'secretContentParseCallback'), $content);
if ($isLogin || ($currentEmail == $rememberEmail && $currentEmail != "") || ($parentEmail == $rememberEmail && $rememberEmail != "")) {
$flag = true;
} else {
$flag = false;
}
}
if ($flag) {
$content = Content::parseContentPublic($content);
return $content;
} else {
if ($isTime) {
return '<div class="hideContent">此条为私密说说,仅发布者可见</div>';
} else {
return '<div class="hideContent">该评论仅登录用户及评论双方可见</div>';
}
}
}
/**
* 解析时光机页面的评论内容
* @param $content
* @return string
*/
public static function timeMachineCommentContent($content)
{
return Content::parseContentPublic($content);
}
/**
* 一些公用的解析,文章、评论、时光机公用的,与用户状态无关
* @param $content
* @return null|string|string[]
*/
public static function parseContentPublic($content)
{
$options = Helper::options();
//倒计时
if (strpos($content, '[countdown') !== false) {
$pattern = self::get_shortcode_regex(array('countdown'));
$content = preg_replace_callback("/$pattern/", array('Content', 'countdownParseCallback'),
$content);
}
return $content;
}
}

View File

@ -1,256 +0,0 @@
<?php
class UA{
public $ua;
public function __construct($ua = '')
{
$this->ua = $ua;
}
public function returnBrowser(){
$ua = $this->ua;
if(preg_match('/rv:(11.0)/i', $ua, $matches)){
$title = 'Internet Explorer '. $matches[1];
$icon = 'fa fa-internet-explorer';//ie11
}elseif (preg_match('#MSIE ([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'Internet Explorer '. $matches[1];
if ( strpos($matches[1], '7') !== false || strpos($matches[1], '8') !== false)
$icon = 'fa fa-internet-explorer';//ie8
elseif ( strpos($matches[1], '9') !== false)
$icon = 'fa fa-internet-explorer';//ie9
elseif ( strpos($matches[1], '10') !== false)
$icon = 'fa fa-internet-explorer';//ie10
}elseif (preg_match('#Edge/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'Edge '. $matches[1];
$icon = 'fa fa-edge';
}elseif (preg_match('#TheWorld ([a-zA-Z0-9.]+)#i', $ua, $matches)){
$title = 'TheWorld(世界之窗) '. $matches[1];
$icon = 'iconfont icon-theworld';
}elseif (preg_match('#JuziBrowser#i', $ua, $matches)){
$title = 'Juzi(桔子) '.$matches[1];
$icon = 'fa fa-globe';
}elseif (preg_match('#KBrowser#i', $ua, $matches)){
$title = 'KBrowser(超快) '.$matches[1];
$icon = 'fa fa-globe';
}elseif (preg_match('#MyIE#i', $ua, $matches)){
$title = 'MyIE(蚂蚁) '.$matches[1];
$icon = 'fa fa-globe';
}elseif (preg_match('#(Firefox|Phoenix|Firebird|BonEcho|GranParadiso|Minefield|Iceweasel)/([a-zA-Z0-9.]+)#i', $ua, $matches)){
$title = 'Firefox '. $matches[1];
$icon = 'fa fa-firefox';
}elseif (preg_match('#CriOS/([a-zA-Z0-9.]+)#i', $ua, $matches)){
$title = 'Chrome for iOS '. $matches[1];
$icon = 'fa fa-chrome';
} elseif (preg_match('#LBBROWSER#i', $ua, $matches)) {
$title = '猎豹';
$icon = 'iconfont icon-liebaoliulanqi';
}elseif (preg_match('#Opera.(.*)Version[ /]([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'Opera '. $matches[2];
$icon = 'fa fa-opera';
if (preg_match('#opera mini#i', $ua))
$title = 'Opera Mini '. $matches[2];
}elseif (preg_match('#Maxthon( |\/)([a-zA-Z0-9.]+)#i', $ua,$matches)) {
$title = 'Maxthon(遨游) '. $matches[2];
$icon = 'iconfont icon-liulanqi-aoyou';
}elseif (preg_match('#360([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = '360 Browser '. $matches[1];
$icon = 'iconfont icon-liulanqi-jisu';
}elseif (preg_match('#SE 2([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'SouGou Browser 2 '.$matches[1];
$icon = 'iconfont icon-liulanqi-sougou';
}elseif (preg_match('#QQBrowser/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'QQBrowser '.$matches[1];
$icon = 'iconfont icon-QQliulanqi';
if (preg_match('#Mobile MQQBrowser/([a-zA-Z0-9.]+)#i', $ua,$matches)) {
$title = 'Mobile MQQBrowser '. $matches[1];
$icon = 'fa fa-qq';
}elseif (preg_match('#MicroMessenger/([a-zA-Z0-9.]+)#i', $ua,$matches)) {
$title = 'Wechat Browser '. $matches[1];
$icon = 'weixin';
}
}elseif (preg_match('#QQ/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'QQ '.$matches[1];
$icon = 'fa fa-qq';
}elseif (preg_match('#YYE/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'YYE '.$matches[1];
$icon = 'fa fa-globe';
}elseif (preg_match('#115Browser/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = '115 '.$matches[1];
$icon = 'fa fa-globe';
}elseif (preg_match('#37abc/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = '37abc '.$matches[1];
$icon = 'fa fa-globe';
}elseif (preg_match('#TheWorld ([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = '世界之窗 '.$matches[1];
$icon = 'iconfont icon-theworld';
}elseif (preg_match('#UCWEB([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'UCWEB '. $matches[1];
$icon = 'icon-win8 icon-ucliulanqi';
}elseif (preg_match('#UBrowser/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'UBrowser '. $matches[1];
$icon = 'iconfont icon-ucliulanqi';
}elseif (preg_match('#Quark/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'Quark '. $matches[1];
$icon = 'iconfont icon-ucliulanqi'; //
}elseif (preg_match('#2345Explorer/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = '2345Explorer '. $matches[1];
$icon = 'fa fa-globe';
}elseif (preg_match('#XiaoMi/MiuiBrowser/([0-9.]+)#i', $ua, $matches)) {
$title = '小米 '. $matches[1];
$icon = 'iconfont icon-xiaomi';
}elseif (preg_match('/WeiBo/i', $ua, $matches)) {
$title = '微博 '. $matches[1];
$icon = 'iconfont icon-weibo';
}elseif (preg_match('/BIDU/i', $ua, $matches)) {
$title = '百度 '. $matches[1];
$icon = 'iconfont icon-setting';
}elseif (preg_match('/mailapp/i', $ua, $matches)) {
$title = 'EmailApp '. $matches[1];
$icon = 'fa fa-globe';
}elseif (preg_match('/Sleipnir/i', $ua, $matches)) {
$title = '神马 '. $matches[1];
$icon = 'iconfont icon-weibiaoti--';
}elseif (preg_match('/MZBrowser/i', $ua, $matches)) {
$title = '魅族 '. $matches[1];
$icon = 'iconfont icon-meizu';
}elseif (preg_match('/VivoBrowser/i', $ua, $matches)) {
$title = 'Vivo '. $matches[1];
$icon = 'iconfont icon-VIVO';
}elseif (preg_match('/mixia/i', $ua, $matches)) {
$title = '米侠 '. $matches[1];
$icon = 'fa fa-globe';
}elseif (preg_match('/CoolMarket/i', $ua, $matches)) {
$title = '酷安 '. $matches[1];
$icon = 'iconfont icon-coolapk';
}elseif (preg_match('/YaBrowser/i', $ua, $matches)) {
$title = 'Yandex '. $matches[1];
$icon = 'iconfont icon-yandex';
}elseif (preg_match('/Kraitnabo\/([^\s|;]+)/i', $ua, $matches)) {
$title = '南博 '. $matches[1];
$icon = 'anzhuo';
}elseif (preg_match('#Chrome/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'Google Chrome '. $matches[1];
$icon = 'fa fa-chrome';
if (preg_match('#OPR/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'Opera '. $matches[1];
$icon = 'fa fa-opera';
}
}elseif (preg_match('#Safari/([a-zA-Z0-9.]+)#i', $ua, $matches)) {
$title = 'Safari '. $matches[1];
$icon = 'fa fa-safari';
}
return array("title"=>$title,
"icon"=>$icon);
}
public function returnOS(){
$ua = $this->ua;
$title = "未知浏览器";
$icon = "";
if (preg_match('/win/i', $ua)) {
if (preg_match('/Windows NT 6.1/i', $ua)) {
$title = "Windows 7";
$icon = "iconfont icon-win";
}elseif (preg_match('/Windows 98/i', $ua)) {
$title = "Windows 98";
$icon = "iconfont icon-win2";
}elseif (preg_match('/Windows NT 5.0/i', $ua)) {
$title = "Windows 2000";
$icon = "iconfont icon-win2";
}elseif (preg_match('/Windows NT 5.1/i', $ua)) {
$title = "Windows XP";
$icon = "iconfont icon-win";
}elseif (preg_match('/Windows NT 5.2/i', $ua)) {
if (preg_match('/Win64/i', $ua)) {
$title = "Windows XP 64 bit";
} else {
$title = "Windows Server 2003";
}
$icon = 'iconfont icon-win';
}elseif (preg_match('/Windows NT 6.0/i', $ua)) {
$title = "Windows Vista";
$icon = "fa fa-windows";
}elseif (preg_match('/Windows NT 6.2/i', $ua)) {
$title = "Windows 8";
$icon = "iconfont icon-win8";
}elseif (preg_match('/Windows NT 6.3/i', $ua)) {
$title = "Windows 8.1";
$icon = "iconfont icon-win8";
}elseif (preg_match('/Windows NT 10.0/i', $ua)) {
$title = "Windows 10";
$icon = "iconfont icon-win3";
}elseif (preg_match('/Windows Phone/i', $ua)) {
$matches = explode(';',$ua);
$title = $matches[2];
$icon = "iconfont icon-winphone";
}
} elseif (preg_match('#iPod.*.CPU.([a-zA-Z0-9.( _)]+)#i', $ua, $matches)) {
$title = "iPod ";//.$matches[1]
$icon = "iconfont icon-ipod";
} elseif (preg_match('/iPhone OS ([_0-9]+)/i', $ua, $matches)) {
$title = "Iphone ";//.$matches[1]
$icon = "iconfont icon-iphone";
} elseif (preg_match('/iPad; CPU OS ([_0-9]+)/i', $ua, $matches)) {
$title = "iPad ";//.$matches[1]
$icon = "iconfont icon-ipad";
} elseif (preg_match('/Mac OS X ([0-9_]+)/i', $ua, $matches)) {
if(count(explode(7,$matches[1]))>1) $matches[1] = 'Lion '.$matches[1];
elseif(count(explode(8,$matches[1]))>1) $matches[1] = 'Mountain Lion '.$matches[1];
$title = "Mac OSX";
$icon = "iconfont icon-macosdeicon";
} elseif (preg_match('/Macintosh/i', $ua)) {
$title = "Mac OS";
$icon = "iconfont icon-iconmacos";
} elseif (preg_match('/CrOS/i', $ua)){
$title = "Google Chrome OS";
$icon = "iconfont icon-iconchromeos";
} elseif (preg_match('/Linux/i', $ua)) {
$title = 'Linux';
$icon = 'fa fa-linux';
if (preg_match('/Ubuntu/i', $ua)) {
$title = "Ubuntu Linux";
$icon = "iconfont icon-ubuntu";
}elseif(preg_match('#Debian#i', $ua)) {
$title = "Debian GNU/Linux";
$icon = "iconfont icon-debian";
}elseif (preg_match('#Fedora#i', $ua)) {
$title = "Fedora Linux";
$icon = "iconfont icon-fedora";
}elseif (preg_match('/Kraitnabo\/([^\s|;]+)/i', $ua, $matches)) {
$title = '南博app '. $matches[1];
$icon = 'anzhuo';
}elseif (preg_match('/Android.([0-9. _]+)/i',$ua, $matches)) {
$title= "Android";
$icon = "iconfont icon-android";
}
} elseif (preg_match('/Android.([0-9. _]+)/i',$ua, $matches)) {
$title= "Android";
$icon = "iconfont icon-android";
}
return array("title"=>$title,
"icon"=>$icon);
}
/**
* 时光机页面ua如果是手机设备只显示设备类型如果是电脑设备只显示电脑设备类型如果是扩展发送显示发送自「扩展」如果是微信公众号显示
*/
public function returnTimeUa(){
if ($this->ua == "weixin" || $this->ua == "weChat"){
return array("title"=>("微信公众号"),
"icon"=>"weixin");
}elseif ($this->ua == "crx"){
return array("title"=>("Chrome扩展"),
"icon"=>"liulanqi");
}elseif ($this->ua == "yearcross"){
return array("title"=>("YearCross"),
"icon"=>"QQ");
}elseif ($this->ua == "Kraitnabo"){
return array("title"=>("南博app"),
"icon"=>"anzhuo");
}elseif ($this->ua == "python"){
return array("title"=>("python脚本"),
"icon"=>"python");
}else{
$ua = $this->returnOS();
$ua["icon"] = "anzhuo";
return $ua;
}
}
}

View File

@ -1,107 +0,0 @@
<?php
require_once 'UA.php';
require_once 'Content.php';
if ($this->user->hasLogin()){
$GLOBALS['isLogin'] = true;
}else{
$GLOBALS['isLogin'] = false;
}
function threadedComments($comments, $options)
{
$db = Typecho_Db::get();
?>
<article class='post--item post--item__status'>
<div class='content'>
<header>
<?php $ua = new UA($comments->agent); ?>
<div class="comment--avatar"><?php echo $comments->gravatar('48', ''); ?></div>
<?php $comments->author(); ?>
<span class="dot"></span>
<p class="humane--time"><?php $comments->date('Y年m月d日 H:i'); ?></p>
<span class="dot"></span>
<?php echo "发自" . $ua->returnTimeUa()['title'];?>
</header>
<div class="description" itemprop="about">
<?php echo Content::postCommentContent(Content::timeMachineCommentContent($comments->text),$GLOBALS['isLogin'] ,"","","",true); ?>
</div>
</div>
</article>
<?php } ?>
<?php $this->comments()->to($comments); ?>
<input type="hidden" class="j-comment-url" value="<?php $this->commentUrl() ?>">
<?php if ($this->user->hasLogin()) : ?>
<div class="respond" id="comments">
<div class="comments--title">有什么新鲜事想告诉大家?</div>
<form method="post" id="textarea" class="comment-form" action="<?php $this->commentUrl() ?>">
<p class="comment-form-comment">
<textarea name="text" id="j-dynamic-form-text" class="textarea" autocomplete="off" rows="3" placeholder="发表您的新鲜事儿..."></textarea>
<input type="hidden" value="<?php $this->user->screenName(); ?>" name="author" />
<input type="hidden" value="<?php $this->user->mail(); ?>" name="mail" />
<input type="hidden" value="<?php $this->options->siteUrl(); ?>" name="url" />
<input type="hidden" name="_" value="<?php Typecho_Widget::widget('Widget_Security')->to($security);
echo $security->getToken($this->request->getRequestUrl()); ?>">
</p>
<p class="form-submit">
<button type="submit" class="submit"><?php _e('发表Ctrl+Enter'); ?></button>
</p>
</form>
</div>
<?php endif; ?>
<?php $comments->listComments(['commentUrl'=>$this->commentUrl,'class'=>$this]); ?>
<?php
$comments->pageNav(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z" fill="var(--main)"></path></svg>',
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.1714 12.0007L8.22168 7.05093L9.63589 5.63672L15.9999 12.0007L9.63589 18.3646L8.22168 16.9504L13.1714 12.0007Z" fill="var(--main)"></path></svg>',
1,
'...',
array(
'wrapTag' => 'div',
'wrapClass' => 'pagination_page',
'itemTag' => '',
'textTag' => 'a',
'currentClass' => 'active',
'prevClass' => 'prev',
'nextClass' => 'next'
)
);
?>
<style>
/* 分页 */
.pagination_page{
display: flex;
align-items: center;
justify-content: center;
margin-top: var(--margin);
gap: 0.5rem;
}
.pagination_page li.active a {
background: var(--theme);
color: #fff;
font-weight: 500;
}
.pagination_page a{
display: flex;
padding: 0.5rem;
font-size: 0.9rem;
width: 1.75rem;
height: 1.75rem;
background: var(--background);
border-radius: 50%;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
transition: 0.2s;
-webkit-transition: 0.2s;
justify-content: center;
align-items: center;
letter-spacing: 0;
}
.pagination_page span.next{
cursor: pointer;
}
.pagination_page li.active a:hover{
cursor: not-allowed;
}
/* 分页 */
</style>