".$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); $replacement = preg_replace_callback("/(\!\[.*?\]\(\s*images\/([0-9]{14,}\.(jpg|jpeg|png|gif))\))(\R*(\R.+){1,})/u", function($matches) use (&$post_for_it_is_here){ $rep = preg_replace("/(-|\*)\s+here\s*:\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s+images\/([0-9]{14,}\.(jpg|jpeg|png|gif))/u","", $matches[4]); return $matches[1].$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']; if(isset($args['here'])) $str.='&here='.$args['here']; else if(isset($_GET['here'])) $str.='&here='.$_GET['here']; 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 MakeRSS(){ $this->ReadPosts();$this->ReadImages(); $posts = []; if(isset($this->UsePosts[0])){ $posts = array_reverse($this->UsePosts); $last_updated = $this->StandardTime($posts[0]['id']); }else{ $last_updated= $this->StandardTime("20000101000000"); } $author = "\s*\@.*?<\/p>/mu","",$html); $html = preg_replace("/\{\s*(INTERESTING|HEADER|FOOTER)\s+(.*?)\}/imu","",$html); $html = preg_replace("/\{\s*(REVERSED|NO_TIME)\s*\}/imu","",$html); $html = preg_replace("/\{\s*WIDE\s*\}/imu","",$html,-1,$rep_count); if($rep_count){$print_wide=true;} $images = []; $images_noclick = []; $images_orig_src_list = []; $html = preg_replace_callback( "/(
\s*)?(]*)src=[\'\"])(images\/([0-9]{14,}\.(jpg|png|jpeg|gif|mp4)))([\'\"][^>]*)\/>(\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; }
                        $media_start = $m[2];
                        $media_end = $m[7];
                        $dataset = " data-imgsrc='".$m[5]."'".
                                    (isset($im['product'])?" data-product='".$im['product']."'":"").
                                    (isset($im['parent'])?" data-parent='".$im['parent']."'":"").
                                    ($original?" class='original_img'":"");
                        if(isset($im['video']) && isset($im['video'])!=''){
                            $media_start = "InHereMode){
                            $click = "
\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('分类')?> | ".($c=='none'?$this->T('未分类'):$this->T($c))." "; } ?> =$this->T('引用')?>:    =$this->T('分类')?> | ".($c=='none'?$this->T('未分类'):$this->T($c))." "; } ?>         =$this->T('选择、粘贴或者拖动到页面以上传图片。')?>         =$this->T('当心!下列操作将立即执行:')?>[\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; $last_end_wide = true;
                    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;}
                        if($last_end_wide){$use_class="last_wide";}else{$use_class="";}
                        $this->MakeSinglePost($p, true, false, $use_class, false, !isset($search_term), false, false, false, false, isset($search_term));
                        $i++;
                        if($i >= $this->PostsPerPage * (1+$this->CurrentOffset)) {break;}
                        $last_end_wide = sizeof($p['tid']['arr'])==1 && isset($p['end_wide']) && $p['end_wide'];
                    }?>
            
            
        
        >=$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->InHereMode)){ ?>
                    
                
                 
                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;
                $is_wide = (isset($post['wide'])&&$post['wide']) || ($is_thread && isset($post['tid']['wide']) && $post['tid']['wide']);
                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); }
                    $last_end_wide = true;
                    foreach($use_arr as &$p){
                        $use_class = ($p == $post)?'focused_post':'';
                        if($last_end_wide){$use_class.=" last_wide";}
                        $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('该话题最新帖子在前')?>
                
            MakeHereButtons($im, false); ?>
        
=$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('主机')?> 
                        =$this->T('网站标题')?> 
                        =$this->T('短标题')?> 
                        =$this->T('相册')?> 
                        =$this->T('导航栏')?>
                        =isset($this->HereNavigation)?"→":""?> 
                        =$this->T('脚注')?>=isset($this->HereFooter)?"→":""?> 
                          =$this->T('实验访问')?> =$this->T('主机')?> 
                        =$this->T('网站标题')?> 
                        =$this->T('短标题')?> 
                        =$this->T('首次提示')?>=isset($this->ExpCaution)?"→":""?> 
                        =$this->T('相册')?> 
                        =$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."