|
<?php
|
|
function themeConfig($form) {
|
|
echo '<style>
|
|
.typecho-page-title h2 {
|
|
font-weight: 600;
|
|
color: #737373;
|
|
}
|
|
.typecho-page-title h2:before {
|
|
content: "#";
|
|
margin-right: 6px;
|
|
color: #ff6d6d;
|
|
font-size: 20px;
|
|
font-weight: 600;
|
|
}
|
|
.themeConfig h3 {
|
|
color: #737373;
|
|
font-size: 20px;
|
|
}
|
|
.themeConfig h3:before {
|
|
content: "[";
|
|
margin-right: 5px;
|
|
color: #ff6d6d;
|
|
font-size: 25px;
|
|
}
|
|
.themeConfig h3:after {
|
|
content: "]";
|
|
margin-left: 5px;
|
|
color: #ff6d6d;
|
|
font-size: 25px;
|
|
}
|
|
.info{
|
|
border: 1px solid #ffadad;
|
|
padding: 20px;
|
|
margin: -15px 10px 25px 0;
|
|
background: #ffffff;
|
|
border-radius: 5px;
|
|
color: #ff6d6d;
|
|
}
|
|
</style>';
|
|
echo '<span class="themeConfig"><h3>博客信息</h3></span>';
|
|
//博客信息
|
|
$logo = new Typecho_Widget_Helper_Form_Element_Text('logo', NULL,'images/akina.png', _t('网站logo地址'), _t('默认值images/akina.png,图片位置/usr/themes/Akina/images/akina.png'));
|
|
$form->addInput($logo);
|
|
|
|
$profile = new Typecho_Widget_Helper_Form_Element_Text('profile', NULL,'images/akinadeaava.jpg', _t('博主头像地址'), _t('默认值images/akinadeaava.jpg,图片位置/usr/themes/Akina/images/akinadeaava.jpg'));
|
|
$form->addInput($profile);
|
|
|
|
$wedo = new Typecho_Widget_Helper_Form_Element_Text('wedo', NULL,'images/donate/wedo.png', _t('微信收款码'), _t('默认值images/donate/wedo.png,图片位置/usr/themes/Akina/images/donate/wedo.png'));
|
|
$form->addInput($wedo);
|
|
|
|
$alido = new Typecho_Widget_Helper_Form_Element_Text('alido', NULL,'images/donate/alido.png', _t('支付宝收款码'), _t('默认值images/donate/alido.png,图片位置/usr/themes/Akina/images/donate/alido.png'));
|
|
$form->addInput($alido);
|
|
|
|
$sub = new Typecho_Widget_Helper_Form_Element_Text('sub', NULL,'个人博客', _t('网站副标题'), _t('默认内容"个人博客"'));
|
|
$form->addInput($sub);
|
|
|
|
$headerinfo = new Typecho_Widget_Helper_Form_Element_Text('headerinfo', NULL,'Carpe Diem and Do what I like', _t('头部内容'), _t('首页头部介绍'));
|
|
$form->addInput($headerinfo);
|
|
|
|
$NOTICE = new Typecho_Widget_Helper_Form_Element_Text('NOTICE', NULL,'我很荣幸的启用了Akina主题', _t('公告内容'), _t('首页公告内容'));
|
|
$form->addInput($NOTICE);
|
|
|
|
$ICP = new Typecho_Widget_Helper_Form_Element_Text('ICP', NULL,'Carpe Diem and Do what I like', _t('ICP备案号'), _t('备案号(默认内容"Carpe Diem and Do what I like")'));
|
|
$form->addInput($ICP);
|
|
|
|
$gongan = new Typecho_Widget_Helper_Form_Element_Text('gongan', NULL,'', _t('公安联网备案'), _t('格式“X公安备案xxxxxxxxxxxxxx号”(没有不填即可)'));
|
|
$form->addInput($gongan);
|
|
|
|
//个人信息
|
|
//新浪
|
|
$SINA = new Typecho_Widget_Helper_Form_Element_Text('SINA', NULL,'https://weibo.com/', _t('<br><span class="themeConfig"><h3>个人信息</h3></span><div class="info">不填写相关信息时可以隐藏该信息和图标</div>新浪微博地址'), _t('默认新浪微博首页(请规范填写,需https://,http://或者//)'));
|
|
$form->addInput($SINA);
|
|
//微信
|
|
$Wechat = new Typecho_Widget_Helper_Form_Element_Text('Wechat', NULL,'', _t('微信号'), _t('首页个人信息'));
|
|
$form->addInput($Wechat);
|
|
//QQ
|
|
$QQnum = new Typecho_Widget_Helper_Form_Element_Text('QQnum', NULL,'', _t('QQ信息'), _t('首页个人信息'));
|
|
$form->addInput($QQnum);
|
|
//酷安
|
|
$coolapk = new Typecho_Widget_Helper_Form_Element_Text('coolapk', NULL,'', _t('酷安ID'), _t('填写酷安用户名'));
|
|
$form->addInput($coolapk);
|
|
$coolapkLink = new Typecho_Widget_Helper_Form_Element_Text('coolapkLink', NULL,'', _t(' '), _t('填写酷安用户链接,APP-我-点头像-右上角分享-复制链接'));
|
|
$form->addInput($coolapkLink);
|
|
//QQ空间
|
|
$Qzone = new Typecho_Widget_Helper_Form_Element_Text('Qzone', NULL,'', _t('QQ空间信息'), _t('首页个人QQ空间信息:https://user.qzone.qq.com/QQ号码'));
|
|
$form->addInput($Qzone);
|
|
//Github
|
|
$Github = new Typecho_Widget_Helper_Form_Element_Text('Github', NULL,'https://github.com/', _t('Github地址'), _t('Github主页地址(请规范填写,需https://,http://或者//)'));
|
|
$form->addInput($Github);
|
|
//哔哩哔哩
|
|
$Bilibili = new Typecho_Widget_Helper_Form_Element_Text('Bilibili', NULL,'https://www.bilibili.com/', _t('Bilibili地址'), _t('Bilibili主页地址(请规范填写,需https://,http://或者//)'));
|
|
$form->addInput($Bilibili);
|
|
|
|
//网易云音乐
|
|
$Music = new Typecho_Widget_Helper_Form_Element_Text('Music', NULL,'https://music.163.com/', _t('网易云音乐用户ID'), _t('登陆网页版网易云音乐,点击个人主页。https://music.163.com/#/user/home?id=这里是ID'));
|
|
$form->addInput($Music);
|
|
|
|
//文章推荐
|
|
$sticky = new Typecho_Widget_Helper_Form_Element_Text('sticky', NULL,NULL, _t('<br><span class="themeConfig"><h3>文章推荐</h3></span>文章置顶'), _t('填写文章cid,按照输入顺序显示(请以半角逗号,或空格分隔)'));
|
|
$form->addInput($sticky);
|
|
|
|
$featureCids = new Typecho_Widget_Helper_Form_Element_Text('featureCids', NULL,NULL, _t('聚焦内容'), _t('填写文章cid,按照输入顺序只显示前三个(请以半角逗号,或空格分隔)'));
|
|
$form->addInput($featureCids);
|
|
|
|
//广告设置
|
|
$adPostImg = new Typecho_Widget_Helper_Form_Element_Text('adPostImg', NULL,'', _t('<br><span class="themeConfig"><h3>广告设置</h3></span><div class="info">不填写相关信息时可以隐藏该广告展示</div>文章页广告'), _t('填写广告图片链接'));
|
|
$form->addInput($adPostImg);
|
|
$adPostkLink = new Typecho_Widget_Helper_Form_Element_Text('adPostkLink', NULL,'', _t(' '), _t('填写文章页广告超链接'));
|
|
$form->addInput($adPostkLink);
|
|
|
|
//加速设置
|
|
$DNS = new Typecho_Widget_Helper_Form_Element_Text('DNS', NULL,'https://cdn.zhebk.cn', _t('<br><span class="themeConfig"><h3>加速设置</h3></span><div class="info">劣质CDN甚至会拖慢网站的速度,图标异常请自行解决跨域问题。CDN付费用户注意,该操作会让你的钱包遭受不可逆的降维打击。</div>DNS预解析加速'), _t('比如填写引用图片的域名(请规范填写,需https://,http://或者//)'));
|
|
$form->addInput($DNS);
|
|
|
|
$CDNURL = new Typecho_Widget_Helper_Form_Element_Text('CDNURL', NULL,NULL, _t('CDN镜像加速'), _t('填写CDN域名(请规范填写,需https://,http://或者//,末尾不加/)'));
|
|
$form->addInput($CDNURL);
|
|
|
|
//外观设置
|
|
$headimg = new Typecho_Widget_Helper_Form_Element_Text('headimg', NULL,'images/headerbg.jpg', _t('<br><span class="themeConfig"><h3>外观设置</h3></span>首页头部图'), _t('默认值images/headerbg.jpg,图片位置/usr/themes/Akina/images/headerbg.jpg'));
|
|
$form->addInput($headimg);
|
|
|
|
$menu = new Typecho_Widget_Helper_Form_Element_Checkbox('menu',
|
|
array(
|
|
'show' => _t('一直显示菜单'),
|
|
'transparent' => _t('导航栏透明'),
|
|
'indexbg' => _t('一直显示首页大图'),
|
|
'feature' => _t('一直显示聚焦内容'),
|
|
'page' => _t('使用ajax加载文章'),
|
|
'xl' => _t('下拉自动加载文章'),
|
|
'dark' => _t('开启夜间模式(跟随系统)'),
|
|
),
|
|
array('page'), _t('其他设置'));
|
|
$form->addInput($menu->multiMode());
|
|
|
|
$postDoc = new Typecho_Widget_Helper_Form_Element_Radio('postDoc', array(
|
|
'leftDoc' => _t('左侧显示'),
|
|
'rightDoc' => _t('右侧显示'),
|
|
'none' => _t('不显示')
|
|
), 'none', _t('开启文章目录'));
|
|
$form->addInput($postDoc);
|
|
|
|
$cssCode = new Typecho_Widget_Helper_Form_Element_Textarea('cssCode', null, null, _t('自定义 CSS'), _t('可以方便的自定义博客样式,避免修改源码影响主题模板迭代。(请编写完整的style标签)'));
|
|
$form->addInput($cssCode);
|
|
|
|
$jsCode = new Typecho_Widget_Helper_Form_Element_Textarea('jsCode', null, null, _t('自定义 JS'), _t('可以方便的添加js代码,统计代码可以填写到这里。(请编写完整的script标签)'));
|
|
$form->addInput($jsCode);
|
|
}
|
|
//判断本地、cdn和自定义资源加载逻辑
|
|
function authorProfile($src,$theurl){
|
|
if($src){
|
|
if(substr($src,0,1)=="i"){
|
|
$src = $theurl . $src;
|
|
}
|
|
}
|
|
return $src;
|
|
}
|
|
//阅读次数统计
|
|
function Postviews($archive) {
|
|
$db = Typecho_Db::get();
|
|
$cid = $archive->cid;
|
|
if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
|
|
$db->query('ALTER TABLE `'.$db->getPrefix().'contents` ADD `views` INT(10) DEFAULT 0;');
|
|
}
|
|
$exist = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid))['views'];
|
|
if ($archive->is('single')) {
|
|
$cookie = Typecho_Cookie::get('contents_views');
|
|
$cookie = $cookie ? explode(',', $cookie) : array();
|
|
if (!in_array($cid, $cookie)) {
|
|
$db->query($db->update('table.contents')
|
|
->rows(array('views' => (int)$exist+1))
|
|
->where('cid = ?', $cid));
|
|
$exist = (int)$exist+1;
|
|
array_push($cookie, $cid);
|
|
$cookie = implode(',', $cookie);
|
|
Typecho_Cookie::set('contents_views', $cookie);
|
|
}
|
|
}
|
|
return $exist;
|
|
}
|
|
// 缩略图设置
|
|
function themeFields($layout){
|
|
$radioPostImg = new Typecho_Widget_Helper_Form_Element_Radio('radioPostImg', array(
|
|
'custom' => _t('自定义'),
|
|
'random' => _t('随机图'),
|
|
'none' => _t('不显示')
|
|
), 'none', _t('开启文章/页面缩略图'));
|
|
$layout->addItem($radioPostImg);
|
|
$thumbnail = new Typecho_Widget_Helper_Form_Element_Text('thumbnail', null, null, _t('文章/页面缩略图Url'), _t('需要带上http(s)://'));
|
|
$icon = new Typecho_Widget_Helper_Form_Element_Text('icon', null, null, _t('文章/页面首页图标Url'), _t('需要带上http(s)://'));
|
|
$dtMode = new Typecho_Widget_Helper_Form_Element_Radio('dtMode', array(true => _t('开启'), false => _t('关闭')), false, _t('文章动态模式'), _t('该文章在列表展示方式为动态模式'));
|
|
$layout->addItem($thumbnail);
|
|
$layout->addItem($icon);
|
|
$layout->addItem($dtMode);
|
|
}
|
|
/**
|
|
* 从数据库查询上/下篇文章内容信息
|
|
* 返回内容包括文章缩略、标题、链接
|
|
*
|
|
* @param bool $mode 查询上或下篇
|
|
* @param mixed $archive
|
|
*
|
|
* @return array|bool
|
|
*/
|
|
// 相关代码感谢 https://github.com/Siphils/Typecho-Theme-Aria/blob/master/lib/Contents.php
|
|
function getNextPrev($mode, $archive){
|
|
$options = Helper::options();
|
|
$db = Typecho_Db::get();
|
|
//数据准备
|
|
$where = null;
|
|
$sorted = null;
|
|
$name = 'thumbnail';
|
|
$thumbnail = 'str_value';
|
|
//$mode为true查询上文,false查询下文
|
|
if ($mode) {
|
|
$where = 'table.contents.created < ?';
|
|
$sorted = Typecho_Db::SORT_DESC;
|
|
} else {
|
|
$where = 'table.contents.created > ?';
|
|
$sorted = Typecho_Db::SORT_ASC;
|
|
}
|
|
|
|
$query = $db->select()->from('table.contents')
|
|
->where($where, $archive->created)
|
|
->where('table.contents.status = ?', 'publish')
|
|
->where('table.contents.type = ?', $archive->type)
|
|
->where('table.contents.password IS NULL')
|
|
->order('table.contents.created', $sorted)
|
|
->limit(1);
|
|
$content = $db->fetchRow($query);
|
|
$result = null;
|
|
if ($content) {
|
|
$content = $archive->filter($content);
|
|
$title = $content['title'];
|
|
$link = $content['permalink'];
|
|
|
|
$query = $db->select()->from('table.fields')
|
|
->where('table.fields.cid = ?', $content['cid'])
|
|
->where('table.fields.name = ?', $name)
|
|
->limit(1);
|
|
|
|
$content = $db->fetchRow($query);
|
|
if ($content) {
|
|
$img = $content[$thumbnail] ? $content[$thumbnail] : '/usr/themes/Akina/images/random/deu' . mt_rand(1,7). '.jpg';
|
|
} else {
|
|
$img = '/usr/themes/Akina/images/random/deu' . mt_rand(1,7). '.jpg';
|
|
}
|
|
|
|
$result = array('img' => $img, 'title' => $title, 'link' => $link);
|
|
} else {
|
|
$result = false;
|
|
}
|
|
return $result;
|
|
}
|
|
//输出相邻文章链接,标题,缩略图
|
|
function theNextPrev($widget){
|
|
$html = '';
|
|
$prevResult = getNextPrev(true, $widget);
|
|
$nextResult = getNextPrev(false, $widget);
|
|
if (!$prevResult && !$nextResult) {
|
|
//第一篇文章,什么也不需要输出
|
|
$html .= '';
|
|
} else if (!$nextResult) {
|
|
$html .= '<div class="post-nepre half next" style="width:100%;"><a href="' . $prevResult["link"] . '" rel="next"><div class="background" style="background-image:url(' . $prevResult["img"] . ');"></div><span class="label">Next Post</span><div class="info"><h3>' . $prevResult["title"] . '</h3><hr></div></a></div>';
|
|
} else if (!$prevResult) {
|
|
$html .= '<div class="post-nepre half previous"style="width:100%;"><a href="' . $nextResult["link"] . '" rel="prev"><div class="background" style="background-image:url( '. $nextResult["img"] . ');"></div><span class="label">Previous Post</span><div class="info"><h3>' . $nextResult["title"] . '</h3><hr></div></a></div>';
|
|
} else {
|
|
$html .= '<div class="post-nepre half previous"><a href="' . $nextResult["link"] . '" rel="prev"><div class="background" style="background-image:url('. $nextResult["img"] .');"></div><span class="label">Previous Post</span><div class="info"><h3>' . $nextResult["title"] . '</h3><hr></div></a></div>';
|
|
$html .= '<div class="post-nepre half next"><a href="' . $prevResult["link"] . '" rel="next"><div class="background" style="background-image:url('. $prevResult["img"] . ');"></div><span class="label">Next Post</span><div class="info"><h3>' . $prevResult["title"] . '</h3><hr></div></a></div>';
|
|
}
|
|
echo $html;
|
|
}
|
|
//修改后台设置适应模板
|
|
function themeInit($archive){
|
|
Helper::options()->commentsPageBreak = true; //启用分页
|
|
Helper::options()->commentsPageDisplay = 'first'; //在列出时将第一页作为默认显示
|
|
Helper::options()->commentsOrder = 'DESC'; //将较新的的评论显示在前面
|
|
Helper::options()->commentsHTMLTagAllowed = '<img src="">'; //评论允许img标签
|
|
//文章目录
|
|
if ($archive->is('single')) {
|
|
$archive->content = createCatalog($archive->content);
|
|
}
|
|
}
|
|
//评论添加回复@标记
|
|
function get_commentReply_at($coid)
|
|
{
|
|
$db = Typecho_Db::get();
|
|
$prow = $db->fetchRow($db->select('parent')->from('table.comments')
|
|
->where('coid = ? AND status = ?', $coid, 'approved'));
|
|
$parent = $prow['parent'];
|
|
if ($parent != "0") {
|
|
$arow = $db->fetchRow($db->select('author')->from('table.comments')
|
|
->where('coid = ? AND status = ?', $parent, 'approved'));
|
|
$author = $arow['author'];
|
|
$href = '<a href="#" rel="nofollow" class="cute atreply">@' . $author . '</a> : ';
|
|
echo $href;
|
|
}
|
|
}
|
|
//公安联网备案,获取备案号
|
|
function gonganbeian($str){
|
|
$str = trim($str);
|
|
$result = '';
|
|
for($i=0;$i<strlen($str);$i++){
|
|
if(is_numeric($str[$i])){
|
|
$result.=$str[$i];
|
|
}
|
|
}
|
|
if(empty($result)){
|
|
return '';
|
|
}else{
|
|
return $result;
|
|
}
|
|
}
|
|
//文章目录
|
|
//来源 https://www.offodd.com/76.html
|
|
//为文章标题添加锚点
|
|
function createCatalog($obj) {
|
|
global $catalog;
|
|
global $catalog_count;
|
|
$catalog = array();
|
|
$catalog_count = 0;
|
|
$obj = preg_replace_callback('/<h([1-3])(.*?)>(.*?)<\/h\1>/i', function($obj) {
|
|
global $catalog;
|
|
global $catalog_count;
|
|
$catalog_count ++;
|
|
$catalog[] = array('text' => trim(strip_tags($obj[3])), 'depth' => $obj[1], 'count' => $catalog_count);
|
|
return '<h'.$obj[1].$obj[2].'><a name="cl-'.$catalog_count.'"></a>'.$obj[3].'</h'.$obj[1].'>';
|
|
}, $obj);
|
|
return $obj;
|
|
}
|
|
//输出文章目录容器
|
|
function getCatalog() {
|
|
global $catalog;
|
|
$index = '';
|
|
if ($catalog) {
|
|
$index = '<ul>'."\n";
|
|
$prev_depth = '';
|
|
$to_depth = 0;
|
|
foreach($catalog as $catalog_item) {
|
|
$catalog_depth = $catalog_item['depth'];
|
|
if ($prev_depth) {
|
|
if ($catalog_depth == $prev_depth) {
|
|
$index .= '</li>'."\n";
|
|
} elseif ($catalog_depth > $prev_depth) {
|
|
$to_depth++;
|
|
$index .= '<ul>'."\n";
|
|
} else {
|
|
$to_depth2 = ($to_depth > ($prev_depth - $catalog_depth)) ? ($prev_depth - $catalog_depth) : $to_depth;
|
|
if ($to_depth2) {
|
|
for ($i=0; $i<$to_depth2; $i++) {
|
|
$index .= '</li>'."\n".'</ul>'."\n";
|
|
$to_depth--;
|
|
}
|
|
}
|
|
$index .= '</li>';
|
|
}
|
|
}
|
|
$index .= '<li><a href="#cl-'.$catalog_item['count'].'">'.$catalog_item['text'].'</a>';
|
|
$prev_depth = $catalog_item['depth'];
|
|
}
|
|
for ($i=0; $i<=$to_depth; $i++) {
|
|
$index .= '</li>'."\n".'</ul>'."\n";
|
|
}
|
|
$index = '<div id="toc-container">'."\n".'<div id="toc">'."\n".'<strong>文章目录</strong>'."\n".$index.'</div>'."\n".'</div>'."\n";
|
|
}
|
|
echo $index;
|
|
}
|
|
//随机文章
|
|
function getRandomPosts($limit = 10){
|
|
$db = Typecho_Db::get();
|
|
$adapterName = $db->getAdapterName();//兼容非MySQL数据库
|
|
if($adapterName == 'pgsql' || $adapterName == 'Pdo_Pgsql' || $adapterName == 'Pdo_SQLite' || $adapterName == 'SQLite'){
|
|
$order_by = 'RANDOM()';
|
|
}else{
|
|
$order_by = 'RAND()';
|
|
}
|
|
$sql = $db->select()->from('table.contents')
|
|
->where('status = ?','publish')
|
|
->where('table.contents.created <= ?', time())
|
|
->where('type = ?', 'post')
|
|
->limit($limit)
|
|
->order($order_by);
|
|
$result = $db->fetchAll($sql);
|
|
if($result){
|
|
foreach($result as $val){
|
|
$val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);
|
|
$post_title = htmlspecialchars($val['title']);
|
|
$permalink = $val['permalink'];
|
|
echo '<li><a href="'.$permalink.'" title="'.$post_title.'" target="_blank">'.$post_title.'</a></li>';
|
|
}
|
|
}
|
|
}
|
|
?>
|