fetchAll($db->select('value')->from('table.options')->where('name = %s', "theme:Miracles")->limit(1));
$load_image = explode("\";",explode("\"",explode("\"loading_image\";",$load_image[0]["value"],2)[1],2)[1],2)[0];
$text = empty($last) ? $data : $last;
if ($widget instanceof Widget_Archive) {
//ParseOther
$text = Contents::parseDetails(Contents::parsePicShadow(Contents::parseNotice(Contents::parseKbd(Contents::parseCode(Contents::parseImages(Contents::parseHeadings(Contents::parseTextColor(Contents::parseRuby(Contents::parseTip($text))))))))));
//LazyLoad
$text = preg_replace('//','
',$text);
//owo
$text = Contents::parseEmo($text);
//Links
$text = Contents::parseLink($text);
//toc
$text = preg_replace('/{:toc:}/s', '
';
}
/**
* 阿鲁表情回调函数
*
* @return string
*/
private static function parseAruBiaoqingCallback($match)
{
return '
';
}
/**
* 推特表情回调函数
*
* @return string
*/
private static function parseTweBiaoqingCallback($match)
{
return '
';
}
/**
* 解析代码块
*/
static public function parseCode($text) {
$text = preg_replace('//s','',$text);
return $text;
}
/**
* 解析键盘按键
*/
static public function parseKbd($text) {
$text = preg_replace('/\[\[(.*?)\]\]/s','${1}',$text);
return $text;
}
/**
* 解析
*/
static public function parseDetails($text) {
$text = preg_replace('/\[details sum="(.*?)"\](.*?)\[\/details\]/s','${1}
${2}',$text);
return $text;
}
/* == 文章目录 == */
/**
* 解析章节链接
*/
static public function parseHeadings($text){
$reg='/\(.*?)\<\/h.*?\>/s';
$text = preg_replace_callback($reg, array('Contents', 'parseHeaderCallback'), $text);
return $text;
}
/**
* 为内容中的标题编号
*/
static private $CurrentTocID = 0;
static public function parseHeaderCallback($matchs)
{
$id = trim($matchs[3]);
return ''.$matchs[3].' ';
}
/**
* 文章目录
*/
public static function tableOfContents($html) {
$pattern = '/(.*?)<\/h\1>/';
preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);
$output = "";
foreach ($matches as $item) {
$output .= '
' . $item[3] . '
';
}
return (!empty($output)) ?
"" . $output . "
" :
"";
}
/* == 其他内容 == */
/**
* 解析自定义导航栏
*/
static public function parseNav($data, $type) {
$de_json = json_decode($data, true);
$count_json = count($de_json);
for ($i = 0; $i < $count_json; $i++) {
$title = $de_json[$i]['title'];
$link = $de_json[$i]['link'];
//输出导航
if($type=="top-nav") {
echo ''. $title .'';
}
elseif($type=="mobile") {
echo '';
}
elseif($type=="drawer") {
echo ''. $title .'';
}
}
}
static public function parseNavIcon($data, $type) {
$de_json = json_decode($data, true);
$count_json = count($de_json);
for ($i = 0; $i < $count_json; $i++) {
$icon = $de_json[$i]['icon'];
$link = $de_json[$i]['link'];
$action = $de_json[$i]['action'];
//定义 class
if($type=="top-nav"){
$class = 'nav-icon-button';
}
elseif($type=="drawer"){
$class = 'drawer-icon';
}
elseif($type=="mobile"){
$class = 'nav-mobile-icon';
}
else{
$class= 'unknown';
}
if($de_json[$i]['class']) $class.= ' '.$de_json[$i]['class'];//自定义 class
//计算 right 距离
$right_more=$i*45;
$right=20+$right_more;
//添加 $other
if($type=="top-nav") $other=' style="right: '.$right.'px"';
//输出导航图标按钮
if($type=="top-nav"||$type=="drawer"){
if(!$action): echo '';
else: echo '';
endif;
}
elseif($type=="mobile"){
if(!$action): echo '';
else: echo '';
endif;
}
}
}
/**
* 根据 id 返回对应的对象
* 此方法在 Typecho 1.2 以上可以直接调用 Helper::widgetById();
* 但是 1.1 版本尚有 bug,因此单独提出放在这里
*
* @param string $table 表名, 支持 contents, comments, metas, users
* @return Widget_Abstract
*/
public static function widgetById($table, $pkId) {
$table = ucfirst($table);
if (!in_array($table, array('Contents', 'Comments', 'Metas', 'Users'))) {
return NULL;
}
$keys = array(
'Contents' => 'cid',
'Comments' => 'coid',
'Metas' => 'mid',
'Users' => 'uid'
);
$className = "Widget_Abstract_{$table}";
$key = $keys[$table];
$db = Typecho_Db::get();
$widget = new $className(Typecho_Request::getInstance(), Typecho_Widget_Helper_Empty::getInstance());
$db->fetchRow(
$widget->select()->where("{$key} = ?", $pkId)->limit(1),
array($widget, 'push'));
return $widget;
}
/**
* 输出完备的标题
*/
public static function title(Widget_Archive $archive) {
$archive->archiveTitle(array(
'category' => '分类 %s 下的文章',
'search' => '包含关键字 %s 的文章',
'tag' => '标签 %s 下的文章',
'author' => '%s 发布的文章'
), '', ' - ');
Helper::options()->title();
}
/**
* 内容归档
*/
public static function archives($widget) {
$db = Typecho_Db::get();
$rows = $db->fetchAll($db->select()
->from('table.contents')
->order('table.contents.created', Typecho_Db::SORT_DESC)
->where('table.contents.type = ?', 'post')
->where('table.contents.status = ?', 'publish'));
$stat = array();
foreach ($rows as $row) {
$row = $widget->filter($row);
$arr = array(
'title' => $row['title'],
'permalink' => $row['permalink']
);
$stat[date('Y', $row['created'])][$row['created']] = $arr;
}
return $stat;
}
/**
* 统计文章浏览数
* from:http://docs.qqdie.com/
*/
public static function postViews($archive) {
$cid = $archive->cid;
$db = Typecho_Db::get();
$prefix = $db->getPrefix();
if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
$db->query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT(10) DEFAULT 0;');
echo 0;
return;
}
$row = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid));
if ($archive->is('single')) {
$views = Typecho_Cookie::get('extend_contents_views');
if(empty($views)){
$views = array();
}else{
$views = explode(',', $views);
}
if(!in_array($cid,$views)){
$db->query($db->update('table.contents')->rows(array('views' => (int) $row['views'] + 1))->where('cid = ?', $cid));
array_push($views, $cid);
$views = implode(',', $views);
Typecho_Cookie::set('extend_contents_views', $views); //记录查看cookie
}
}
return $row['views'];
}
/**
* 获取最早文章创建时间
*/
public static function getOldestPostDate() {
$db = Typecho_Db::get();
$content = $db->fetchRow($db->select()->from('table.contents')
->where('table.contents.status = ?', 'publish')
->where('table.contents.password IS NULL')
->order('table.contents.created', Typecho_Db::SORT_ASC)
->limit(1));
return date('Y-m-d', $content['created']);
}
}