".$this->T("链接位置")."
",$replacement); $replacement = preg_replace_callback("/(```|`)([^`]*)(?1)/U", function($matches){ $rep = preg_replace('/-@>/','->',$matches[0]); $rep = preg_replace('/<@-/','<-',$rep); $rep = preg_replace('/=@>/','=>',$rep); $rep = preg_replace('/<@=/','<=',$rep); $rep = preg_replace('/\R@([+]{3,})\R/',PHP_EOL.'$1'.PHP_EOL,$rep); $rep = preg_replace('/\[@-/','[-',$rep); $rep = preg_replace('/\{@/','{',$rep); $rep = preg_replace('/(en|zh|any)@\|(en|zh|any)/','$1|$2',$rep); return $rep; }, $replacement); return $replacement; } function CanShowPost(&$p){ if(!isset($p) || isset($p['comment_to'])) return false; $is_mark_exp = (isset($p['tid'])&&isset($p['tid']['exp'])&&$p['tid']['exp']) || (isset($p['mark_value'])&&$p['mark_value']==6); $is_mark_slf = (isset($p['tid'])&&isset($p['tid']['slf'])&&$p['tid']['slf']) || (isset($p['mark_value'])&&$p['mark_value']==7); if($is_mark_slf && !$this->LoggedIn){ return false; } if(isset($this->WayBack)){ if(isset($p['version'])) { if ($p['version']>$this->WayBack) return false; } else if ($p['id']>$this->WayBack) return false; } if(!$this->InExperimentalMode){ if(!$this->LoggedIn){ if($is_mark_exp) return false; return true; } return true; }else{ if($is_mark_exp) return true; return false; } } function SkipProduct(&$p){ if($this->LoggedIn) return false; return (isset($p['mark_value']) && $p['mark_value']==5); } function GetRedirect($args=NULL){ $str = 'index.php?'; if(isset($args['post'])) $str.='&post='.$args['post']; else if(isset($_GET['post'])) $str.='&post='.$_GET['post']; if(isset($args['gallery'])) $str.='&gallery='.$args['gallery']; else if(isset($_GET['gallery'])) $str.='&gallery='.$_GET['gallery']; if(isset($args['pic'])) $str.='&pic='.$args['pic']; else if(isset($_GET['pic'])) $str.='&pic='.$_GET['pic']; if(isset($args['settings'])) $str.='&settings='.$args['settings']; else if(isset($_GET['settings'])) $str.='&settings='.$_GET['settings']; if(isset($args['extras'])) $str.='&extras='.$args['extras']; else if(isset($_GET['extras'])) $str.='&extras='.$_GET['extras']; if(isset($args['category'])) $str.='&category='.$args['category']; else if(isset($_GET['category'])) $str.='&category='.$_GET['category']; if(isset($args['history'])) $str.='&history='.$args['history']; else if(isset($_GET['history'])) $str.='&history='.$_GET['history']; if(isset($args['version'])) $str.='&version='.$args['version']; else if(isset($_GET['version'])) $str.='&version='.$_GET['version']; if(isset($args['search'])) $str.='&search='.$args['search']; else if(isset($_GET['search'])) $str.='&search='.$_GET['search']; return $str; } function WriteAsNecessary(){ if(!$this->LoggedIn || isset($this->WayBack)){return;} if($this->NeedWritePosts){ $this->CachePostLinks(); $this->WritePosts(); } if($this->NeedWriteImages){ $this->WriteImages(); } if($this->NeedWriteArchive){ $this->WriteArchive(); } } function APubEnsureWebfinger($name, $host){ if(!is_dir('.well-known')) mkdir('.well-known'); if(!is_dir('.well-known/webfinger')) mkdir('.well-known/webfinger'); $f = fopen('.well-known/webfinger/index.php',"w"); $without_protocol = parse_url($host, PHP_URL_HOST); $finger = ["subject"=>"acct:".$name.'@'.$without_protocol, "links"=>[["rel"=>"self", "type"=>"application/activity+json", "href"=>$host."?apub_actor=1"]]]; fwrite($f, ""); fclose($f); if(!file_exists('.well-known/apub_public_key.pem') || !file_exists('.well-known/apub_private_key.php')){ $res = openssl_pkey_new(); $this->APubPublicKey = openssl_pkey_get_details($res)['key']; openssl_pkey_export($res, $this->APubPrivateKey); $f = fopen('.well-known/apub_public_key.pem',"w"); fwrite($f, $this->APubPublicKey); fclose($f); $f = fopen('.well-known/apub_private_key.php',"w"); fwrite($f, "".PHP_EOL.PHP_EOL.$this->APubPrivateKey); fclose($f); } } function APubEnsureInfo(){ if(!isset($this->APubID) || !isset($this->HostURL)) return; if(!file_exists('.well-known/apub_public_key.pem')){$this->APubEnsureWebfinger($this->APubID, $this->HostURL);} $pk = file_get_contents('.well-known/apub_public_key.pem'); //$pk = preg_replace('/\n/u','\\n',$pk); $actor = ["@context"=>["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1"], "id"=> $this->HostURL."?apub_actor=1", "type"=> "Person", "name"=> $this->DisplayName, "url"=> $this->HostURL, "summary"=> "Lazy... No summary", "preferredUsername"=> $this->APubID, "inbox"=> $this->HostURL."?apub_inbox=1", "outbox"=> $this->HostURL."?apub_outbox=1", "publicKey"=> ["id"=> $this->HostURL."?apub_actor=1#main-key", "owner"=> $this->HostURL."?apub_actor=1", "publicKeyPem"=>$pk]]; $this->APubActor = json_encode($actor, JSON_UNESCAPED_SLASHES); } function APubMakeOutbox(){ $this->ReadPosts();$this->ReadImages(); $obj = ["@context"=>"https://www.w3.org/ns/activitystreams", "id"=>$this->HostURL."?apub_outbox=1", "type"=>"OrderedCollection"]; $items=[]; $i=0; foreach(array_reverse($this->Posts) as &$p){ $this->ConvertPost($p); $text = strip_tags(preg_replace('/<\/(p|blockquote|h[0-9])>/u',"\n\n",$p['html'])); $time = DateTime::createFromFormat('YmdHis', $p['id'], new DateTimeZone('+0800')); $ob = ["@context"=>"https://www.w3.org/ns/activitystreams", "type"=> "Create", "id"=> $this->HostURL."?post=".$p['id']."?apub_object=1", "published"=> $time->format('Y-m-d\TH:i:s\Z'), //"to"=> ["https://chatty.example/ben/"], "actor"=> $this->HostURL."?apub_actor=1", "to"=> ["https://www.w3.org/ns/activitystreams#Public"], "object"=> ["type"=> "Note", "id"=> $this->HostURL."?post=".$p['id'], "published"=> $time->format('Y-m-d\TH:i:s\Z'), "attributedTo"=> $this->HostURL."?apub_actor=1", "to"=> ["https://www.w3.org/ns/activitystreams#Public"], "content"=> $text]]; $items[] = $ob; $i++; if($i>20) break; } $obj['orderedItems'] = $items; $obj["totalItems"] = sizeof($items); return json_encode($obj, JSON_UNESCAPED_SLASHES); } function ProcessRequest(&$message=NULL, &$redirect=NULL){ if(isset($_GET['gallery']) && $_GET['gallery']=='default'){ $redirect = "index.php?gallery=".(isset($this->DefaultGallery)&&$this->DefaultGallery!=''?$this->DefaultGallery:"main"); return 0; } if(isset($_GET['set_language'])){ setcookie('la_language',$_GET['set_language'],time()+3600*24*7); $_COOKIE['la_language'] = $_GET['set_language']; $redirect=$this->GetRedirect(); return 0; } if(isset($_GET['toggle_font'])){ $use_font='local'; if(!isset($_COOKIE['la_font']) || $_COOKIE['la_font']!='remote') $use_font='remote'; setcookie('la_font',$use_font,time()+3600*24*7); $_COOKIE['la_font'] = $use_font; $redirect=$this->GetRedirect(); return 0; } if(isset($_GET['set_wayback'])){ if($_GET['set_wayback']!='false'){ $wayback= date('YmdHis'); if($_GET['set_wayback']=='post'){ if(isset($_POST['wayback_year'])) $wayback=substr_replace($wayback,str_pad($_POST['wayback_year'],4,"0",STR_PAD_LEFT),0,4); if(isset($_POST['wayback_month'])) $wayback=substr_replace($wayback,str_pad($_POST['wayback_month'],2,"0",STR_PAD_LEFT),4,2); if(isset($_POST['wayback_day'])) $wayback=substr_replace($wayback,str_pad($_POST['wayback_day'],2,"0",STR_PAD_LEFT),6,2); if(isset($_POST['wayback_hour'])) $wayback=substr_replace($wayback,str_pad($_POST['wayback_hour'],2,"0",STR_PAD_LEFT),8,2); if(isset($_POST['wayback_minute'])) $wayback=substr_replace($wayback,str_pad($_POST['wayback_minute'],2,"0",STR_PAD_LEFT),10,2); }else{ if(preg_match('/[0-9]{14}/u', $_GET['set_wayback'])) $wayback = $_GET['set_wayback']; } setcookie('la_wayback',$wayback); $_COOKIE['la_wayback'] = $wayback; }else{ setcookie('la_wayback', null, -1); unset($_COOKIE['la_wayback']); } $redirect=$this->GetRedirect(); return 0; } if(isset($_GET['post'])){ $this->CurrentPostID = $_GET['post']; $this->TagID = $this->CurrentPostID; } if(isset($_GET['offset'])){ $this->CurrentOffset = $_GET['offset']; } if(isset($_GET['part'])){ if($_GET['part'] == 'hot') $this->ExtraScripts.="ShowLeftSide();"; else if ($_GET['part'] == 'recent') $this->ExtraScripts.="ShowCenterSide();"; } if(isset($_GET['post'])){ $this->ExtraScripts.="window.addEventListener('load', (event) => {ScrollToPost('".$_GET['post']."');});"; } if(isset($_POST['search_content'])){ $redirect='index.php?search='.$_POST['search_content'];return 0; } if(isset($_GET['image_info']) || isset($_GET['show_image'])){ $m=isset($_GET['image_info'])?$_GET['image_info']:$_GET['show_image']; $direct_return = !isset($_GET['show_image']); $this->ReadImages(); $this->ReadPosts(); $this->SwitchWayBackMode(); if(isset($this->WayBack)){$this->ReadArchive();} $im = &$this->FindImage($m); if($im==NULL || !isset($im['refs']) || !isset($im['refs'][0])){ echo "not_found"; exit; } if($direct_return){ echo "".sizeof($im['refs']).""; echo "\s*\@.*?<\/p>/mu","",$html); $html = preg_replace("/
\s*\{\s*INTERESTING\s+(.*?)\}\s*<\/p>/imu","",$html); $html = preg_replace("/\{\s*REVERSED\s*\}/imu","",$html); $images = []; $images_noclick = []; $images_orig_src_list = []; $html = preg_replace_callback( "/(
\s*)?(]*)src=[\'\"])(images\/([0-9]{14,}\.(jpg|png|jpeg|gif)))([\'\"][^>]*)\/>(\s*<\/p>)?/u", function($m) use (&$images,&$images_noclick,&$images_orig_src_list) { $orig_src = $src = $m[5]; $keep = false; $original = false; if (preg_match('/alt=[\'\"].*keep_inline.*[\'\"]/u',$m[3]) || preg_match('/alt=[\'\"].*keep_inline.*[\'\"]/u',$m[7])) { $keep=true; } if ($keep && preg_match('/alt=[\'\"].*original.*[\'\"]/u',$m[3]) || preg_match('/alt=[\'\"].*original.*[\'\"]/u',$m[7])) { $original=true; } if(($im = &$this->FindImage($m[5]))!=NULL && isset($im['thumb'])){ $src = $im['thumb']; $orig_src=$im['file']; }if($im == NULL){ $im = &$this->NULL_IMAGE_DUMMY; } if($this->InExperimentalMode){ $click = "
"; return $click; }else{ $click = ""; $images_noclick[]=$m[2].$src.$m[7].">"; $images_orig_src_list[]=$orig_src; $ret = ""; if($keep) { $ret = $click; } else { $images[] = $click; } if(isset($m[1])&&isset($m[8])&&$m[1]&&$m[8]) return $ret; else return ((isset($m[1])&&$m[1]?$m[1]:"").$ret.(isset($m[8])&&$m[8]?$m[8]:"")); } },$html,-1,$count); $html = preg_replace('/\s*<\/p>/u',"", $html); if($html==""){$html="
";} if(sizeof($images)){ if(sizeof($images)==1){$html.= $images[0]; } else{ $html.="
\s*<\/p>/u',"", $html);
if (preg_match('/ \s*\{big_table\}\s*<\/p>\s*( ".$post['product']['title']." ".$post['product']['short']." ".$post['product']['price']." \s*\{read_more\}\s*<\/p>[\s\S]*/u'," [".$this->T("阅读更多")."] \s*\{read_more\}\s*<\/p>/u',"", $ht);
}
if ($strip_tags){
$ht = strip_tags($ht,' \s*<\/p>/u',"", $ht);
$ht = " \s*\{big_table\}\s*<\/p>/u','',$ht);
}
}
if ($strip_tags && $generate_thumbs && isset($post['images']) && isset($post['images'][0])){
$ht.=" ".$this->T("已关闭评论")." =$this->T('话题')?> &history=1'>=$this->GetPostTitle($mver)?> =$this->T('并入这里')?>
".$name.":".$mail." =$this->T('引用')?>: =$this->T('分类')?> | ".($c=='none'?$this->T('未分类'):$this->T($c))." "; } ?> =$this->T('选择、粘贴或者拖动到页面以上传图片。')?> =$this->T('当心!下列操作将立即执行:')?>
WayBack)){
$time=(isset($_COOKIE['la_wayback']) && preg_match('/[0-9]{14}/u',$_COOKIE['la_wayback']))?$_COOKIE['la_wayback']:date('YmdHis');
$year=substr($time,0,4);$month=substr($time,4,2);$day=substr($time,6,2);
$hour=substr($time,8,2);$minute=substr($time,10,2);?> [\s\S]*?<\/table>)/u', function ($m) use (&$table){
$table = $m[1];
return "";
}, $html);
$table_out = $table;
return $new_html;
}
function GenerateSinglePost(&$post, $strip_tags, $generate_anchor=false, $generate_refs=false,
$generate_thumbs=false, &$table_out, $hide_long = false){
$this->ConvertPost($post);
if($generate_anchor){ $this->CreatePostAnchor($post); }
$ht = $post['html'];
if(isset($post['mark_value']) && $post['mark_value']==5 && ($generate_thumbs || !$generate_anchor)){
$ht="
');
$ht = preg_replace('/
";
foreach($post['images'] as $im){
$ht.="
".$title."
=$this->T('评论')?>
CommentEnabled){
echo "
"; } ?>
=isset($search_term)?$this->T('搜索'):
(isset($category)?("".$this->T('分类')." ".
($category=='none'?$this->T('未分类'):$this->T($category))):($this->T('最近')).
" ")?>
T('搜索')?>
LoggedIn){ ?>
SpecialPinned) && ($p = &$this->GetPost($this->SpecialPinned))!=NULL && !$this->CurrentOffset) &&
$this->CanShowPost($p)){
$this->MakeSinglePost($p, true, false, false, false, true, false, false, false, true, false);
}
$i = 0;
if(isset($this->UsePosts[0])) foreach(array_reverse($this->UsePosts) as &$p){
if(!$this->CanShowPost($p) || $this->SkipProduct($p)) continue;
if(isset($p['tid'])){ /* Should always be set. */
$th = &$p['tid']; if($p['tid']['count']==0) continue;
if(!isset($search_term)) { $p = &$th['last']; }
}
if(isset($search_term)){
if ($search_term=='' || !preg_match("/".preg_quote($search_term)."/iu", $p['content'])) continue;
}else if(isset($category)){
$cat = isset($p['tid'])?(isset($p['tid']['categories'])?($p['tid']['categories']):[]):
(isset($p['categories'])?($p['categories']):[]);
if ($category=='none') { if($cat!=[]) continue; }
else{ if ($category=='' || !in_array($category, $cat)) continue; }
if(isset($p['tid'])){ if(isset($p['tid']['displayed'])) continue; $p['tid']['displayed'] = True; }
}else{
if(in_array($p['id'],
[$this->SpecialPinned,$this->SpecialFooter,$this->SpecialFooter2,$this->SpecialNavigation])) continue;
if(isset($p['tid'])){ if(isset($p['tid']['displayed'])) continue; $p['tid']['displayed'] = True; }
}
if($i < $this->PostsPerPage * $this->CurrentOffset) {$i++; continue;}
$this->MakeSinglePost($p, true, false, NULL, false, !isset($search_term), false, false, false, false, isset($search_term));
$i++;
if($i >= $this->PostsPerPage * (1+$this->CurrentOffset)) {break;}
}?>
>=$this->T('链接')?>
=$this->T('没有历史记录')?>
=$this->T('帖子')?> '>=$title?>
=$this->T('历史记录')?>
=$this->T('帖子')?> '>=$title?>
GetArchiveHandle($from); if(!isset($fromah)) continue;
$ver = &$fromah['list'][sizeof($fromah['list'])-1];?>
GetArchiveHandle($pm);
$mver = &$this->GetPost($pm); if(!isset($mver) && isset($mah)) $mver = &$mah['list'][sizeof($mah['list'])-1]; ?>
GetArchiveHandle($from); if(!isset($fromah)) continue;
$ver = &$fromah['list'][sizeof($fromah['list'])-1];?>
=$this->T('版本不存在')?>
=$this->T('差异')?>
GetArchiveHandle($pm);
$mver = &$this->GetPost($pm); if(!isset($mver) && isset($mah)) $mver = &$mah['list'][sizeof($mah['list'])-1]; ?>
=sizeof($this_ver['merged_thread'][0]);?> =$this->T('个帖子')?>
=$this->T('没有更旧的版本')?>
=$this->T('上一个版本')?>
=$this->ReadableTime($last_ver['version'])?>=$this->T('选择的版本')?>
=$this->ReadableTime($this_ver['version'])?>=isset($last_ver)?$last_ver['content']:""?>
=$this_ver['content']?>
&set_wayback==isset($this_ver['version'])?$this_ver['version']:$this_ver['id']?>'>=$this->T('前往该版本时间')?> ←
GetArchiveHandle($this->CurrentPostID);
$p = &$post; if(!isset($post)){ $p=&$ah['list'][0]; }
$show_latest = isset($ah)?(!isset($ah['list'][sizeof($ah['list'])-1]['merged_into'])):true;
?>
=$this->T('评论')?> (=$comment_count;?>)
";
foreach($to_post['comments'] as $p){
$ht = $this->GenerateSinglePost($p, false, false, false, false, $t, false);
$name = isset($p['link'])?("".$p['name']."↗"):$p['name'];
$mail = $this->LoggedIn?(" "):"";
echo "=$this->T('有趣')?>
'>→
GetPost($ref);
if(isset($post['mark_value']) && $post['mark_value']==5){ $count_product++; continue; }
if(!$this->CanShowPost($po)){ continue; }
echo "
LoggedIn && (!$this->InExperimentalMode)){ ?>
ConvertPost($p);
$mark_value = isset($p['mark_value'])?$this->Markers[$p['mark_value']]:-1;
$ref_count = isset($p['refs'])?sizeof($p['refs']):0;
$is_current = $p['id']==$this->CurrentPostID;
$is_deleted = (isset($p['mark_delete'])&&$p['mark_delete']); ?>
=$this->T($header);?>
' =$is_deleted?"data-mark-delete='true'":""?>
onDblClick='ClickImage(this)'>
0){ ?>
class='clean_a paa'>
GetPost($ref);
if(isset($post['mark_value']) && $post['mark_value']==5){ $count_product++; continue; }
if(!$this->CanShowPost($po)){ continue; }
echo "
MakeCommentSection($th['first']); ?>
1; if($is_thread){ $th = $post['tid'];?>
=$this->T('话题')?> =$this->T('详细')?>
MakePostTools();
if($cat){ ?>
IsReversedThread($th); $hinted=false; if($is_reversed){
$use_arr=array_reverse($th['arr']); $fp=array_pop($use_arr); array_unshift($use_arr,$fp); }
foreach($use_arr as &$p){
$use_class = ($p == $post)?'focused_post':'';
$show_link = ($p == $post)?false:true;
$make_title = ($p == $post);
$this->MakeSinglePost($p,$show_link,false,$use_class,false, false, false, true, false, false);
if($make_title){?>
=$this->T('该话题最新帖子在前')?>
MakeSinglePost($post,false, false, 'focused_post',false, false, false, true, false, false);
?>
=$this->ReadableTime(isset($post['tid']['last']['version'])?
$post['tid']['last']['version']:$post['tid']['last']['id']);?>
IsReversedThread($th);
$hinted=false; if($is_reversed){
$use_arr=array_reverse($th['arr']); $fp=array_pop($use_arr); array_unshift($use_arr,$fp); }
foreach($use_arr as &$p){
$this->MakeSinglePostExp($p);
if($p == $th['first']){?>
=$this->T('该话题最新帖子在前')?>=$this->T('点击图片以插入:')?>
=(isset($name) && ($gal=$this->GetGallery($name))!=NULL)?
("".$this->T('相册').":".$this->T($name)):
($_GET['gallery']=='trash'?$this->T('垃圾桶'):$this->T('画廊'))?>
=$year;?>
=$this->T('设置')?>
LoggedIn){ ?>
LoggedIn){ ?>
' />
' />
=$this->T('选项')?> =$this->T('值')?> =$this->T('网站标题')?>
=$this->T('短标题')?>
=$this->T('显示名称')?>
=$this->T('电子邮件')?>
=$this->T('导航栏')?>
=isset($this->SpecialNavigation)?"→":""?>
=$this->T('脚注')?> 1=isset($this->SpecialFooter)?"→":""?>
=$this->T('脚注')?> 2=isset($this->SpecialFooter2)?"→":""?>
=$this->T('置顶文')?>=isset($this->SpecialPinned)?"→":""?>
=$this->T('默认相册')?>
=$this->T('SelfAuth 路径')?>
=$this->T('启用评论')?>
CommentEnabled?"checked":""?>/> =$this->T('附加操作')?> =$this->T('进入')?> =$this->T('长毛象')?> =$this->T('长毛象实例')?>
=$this->T('长毛象令牌')?>
=$this->T('偏好语言')?>
=$this->T('本站地址')?>
=$this->T('Activity Pub')?> =$this->T('用户名')?>
=$this->T('实验访问')?> =$this->T('主机')?>=isset($this->ExpHost)?"→":""?>
=$this->T('网站标题')?>
=$this->T('短标题')?>
=$this->T('首次提示')?>=isset($this->ExpCaution)?"→":""?>
=$this->T('索引')?>=isset($this->ExpIndex)?"→":""?>
=$this->T('导航栏')?>
=isset($this->ExpNavigation)?"→":""?>
=$this->T('脚注')?>=isset($this->ExpFooter)?"→":""?>
=$this->T('管理员')?>
=$this->T('登出')?> =$this->T('帐号')?>
=$this->T('新密码')?>
=$this->T('再次输入')?>
=$this->T('旧密码')?>
=$this->T('请登录')?> =$this->T('帐号')?>
=$this->T('密码')?>
=$this->T('附加操作')?>
=$this->T('返回一般设置')?>
=$this->T('自动重定向')?>
=$this->T('P为帖子跳转,匹配REQUEST_URI跳到目标文章;S为站点跳转,可以重定向来源域名,例子:')?>
P discount:20001001010101;
' />
S old_domain:www.new_domain.com:20001001010101;=$this->T('自定义翻译')?>
=$this->T('填写格式:')?>
- 语言 | Language
' />
Posts) as $p){ if(!isset($p['comment_to'])) continue; if($i < $this->CommentsPerPage * $this->CurrentOffset) {$i++; continue;} $ht = $this->GenerateSinglePost($p, false, false, false, false, $t, false); $name = isset($p['link'])?("".$p['name']."↗"):$p['name']; $post_to = $this->GetPost($p['comment_to']); $post_title = $this->GetPostTitle($post_to); if(!$post_to) $post_title = "?"; $mail = " ". "@ ". (isset($p['ip'])?$p['ip']:"?")." ";
$i++;
}
?>
". "(".$post_title.")"; echo "
".$name.":".$mail."
".$ht."