|
@@ -26,11 +26,17 @@ class LA{
|
|
|
protected $SpecialPinned;
|
|
|
protected $DefaultGallery;
|
|
|
protected $SelfAuthPath;
|
|
|
+ protected $HereHost;
|
|
|
+ protected $HereTitle;
|
|
|
+ protected $HereShortTitle;
|
|
|
+ protected $HereAlbum;
|
|
|
+ protected $HereNavigation;
|
|
|
+ protected $HereFooter;
|
|
|
protected $ExpHost;
|
|
|
+ protected $ExpAlbum;
|
|
|
protected $ExpTitle;
|
|
|
protected $ExpShortTitle;
|
|
|
protected $ExpCaution;
|
|
|
- protected $ExpIndex;
|
|
|
protected $ExpNavigation;
|
|
|
protected $ExpFooter;
|
|
|
protected $CommentEnabled;
|
|
@@ -50,6 +56,7 @@ class LA{
|
|
|
|
|
|
protected $LoggedIn;
|
|
|
protected $LoginTokens;
|
|
|
+ protected $InHereMode;
|
|
|
protected $InExperimentalMode;
|
|
|
protected $LanguageAppendix;
|
|
|
protected $UseRemoteFont;
|
|
@@ -90,8 +97,14 @@ class LA{
|
|
|
protected $NeedWriteImages;
|
|
|
protected $NeedWriteArchive;
|
|
|
|
|
|
+ protected $HereDisplayTitle;
|
|
|
+ protected $VisitedHere;
|
|
|
+ protected $HereNumber;
|
|
|
+ protected $HereMainImage;
|
|
|
+
|
|
|
public $PageType;
|
|
|
public $CurrentPostID;
|
|
|
+ public $HereID;
|
|
|
public $ActualPostID;
|
|
|
public $TagID;
|
|
|
|
|
@@ -99,6 +112,10 @@ class LA{
|
|
|
$dt = DateTime::createFromFormat('YmdHis', $id);
|
|
|
return $dt->format('Y/m/d H:i:s');
|
|
|
}
|
|
|
+ function StandardTime($id){
|
|
|
+ $dt = DateTime::createFromFormat('YmdHis', $id);
|
|
|
+ return $dt->format('Y-m-d\TH:i:s');
|
|
|
+ }
|
|
|
function FullURL(){
|
|
|
return (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ?
|
|
|
"https" : "http") . "://" . $_SERVER['HTTP_HOST'] .
|
|
@@ -112,7 +129,8 @@ class LA{
|
|
|
}
|
|
|
return $str;
|
|
|
}
|
|
|
- function SwitchLanguageAndFont(){
|
|
|
+ function SwitchLanguageAndFont(){
|
|
|
+ $this->LanguageAppendix = 'zh';
|
|
|
if(isset($_COOKIE['la_language'])){
|
|
|
$this->LanguageAppendix = $_COOKIE['la_language'];
|
|
|
}else{
|
|
@@ -226,11 +244,17 @@ class LA{
|
|
|
fwrite($conf,'- DefaultGallery = '.$this->DefaultGallery.PHP_EOL);
|
|
|
fwrite($conf,'- SelfAuthPath = '.$this->SelfAuthPath.PHP_EOL);
|
|
|
fwrite($conf,'- CommentEnabled = '.($this->CommentEnabled?"True":"False").PHP_EOL);
|
|
|
+ fwrite($conf,'- HereHost = '.$this->HereHost.PHP_EOL);
|
|
|
+ fwrite($conf,'- HereTitle = '.$this->HereTitle.PHP_EOL);
|
|
|
+ fwrite($conf,'- HereShortTitle = '.$this->HereShortTitle.PHP_EOL);
|
|
|
+ fwrite($conf,'- HereAlbum = '.$this->HereAlbum.PHP_EOL);
|
|
|
+ fwrite($conf,'- HereNavigation = '.$this->HereNavigation.PHP_EOL);
|
|
|
+ fwrite($conf,'- HereFooter = '.$this->HereFooter.PHP_EOL);
|
|
|
fwrite($conf,'- ExpHost = '.$this->ExpHost.PHP_EOL);
|
|
|
fwrite($conf,'- ExpTitle = '.$this->ExpTitle.PHP_EOL);
|
|
|
fwrite($conf,'- ExpShortTitle = '.$this->ExpShortTitle.PHP_EOL);
|
|
|
fwrite($conf,'- ExpCaution = '.$this->ExpCaution.PHP_EOL);
|
|
|
- fwrite($conf,'- ExpIndex = '.$this->ExpIndex.PHP_EOL);
|
|
|
+ fwrite($conf,'- ExpAlbum = '.$this->ExpAlbum.PHP_EOL);
|
|
|
fwrite($conf,'- ExpNavigation = '.$this->ExpNavigation.PHP_EOL);
|
|
|
fwrite($conf,'- ExpFooter = '.$this->ExpFooter.PHP_EOL);
|
|
|
fwrite($conf,'- MastodonToken = '.$this->MastodonToken.PHP_EOL);
|
|
@@ -377,6 +401,7 @@ class LA{
|
|
|
$this->PDE->SetInterlinkPath('/');
|
|
|
$this->Posts = [];
|
|
|
$this->Threads = [];
|
|
|
+ $this->VisitedHere = [];
|
|
|
|
|
|
$this->NULL_IMAGE_DUMMY = [];
|
|
|
$this->NULL_IMAGE_DUMMY['name']=$this->NULL_IMAGE_DUMMY['file']=$this->NULL_IMAGE_DUMMY['thumb']="";
|
|
@@ -454,6 +479,26 @@ class LA{
|
|
|
.(isset($_GET['settings'])?"?settings=true":""));
|
|
|
}
|
|
|
}
|
|
|
+ function SetHereMainImage($im_this){
|
|
|
+ if(isset($im_this) && isset($im_this['parent'])){ $this->HereMainImage = &$this->FindImage($im_this['parent'],true);}
|
|
|
+ }
|
|
|
+ function RecordVisitedHere($image_or_post_name, $image_title){
|
|
|
+ $visited_here = $this->InExperimentalMode?"visited_experimental":"visited_here";
|
|
|
+ if(!isset($_SESSION[$visited_here])){ $_SESSION[$visited_here] = []; }
|
|
|
+ if(!(isset($_SESSION[$visited_here][0]) && in_array($image_or_post_name,$_SESSION[$visited_here]))){
|
|
|
+ $_SESSION[$visited_here][] = $image_or_post_name;
|
|
|
+ }
|
|
|
+ if(isset($image_title)){ $this->HereDisplayTitle=$image_title; }
|
|
|
+ $this->HereNumber = array_search($image_or_post_name,$_SESSION[$visited_here])+1;
|
|
|
+ $_SESSION['here_number'] = $this->HereNumber;
|
|
|
+ $this->VisitedHere = $_SESSION[$visited_here];
|
|
|
+ }
|
|
|
+ function HereLinkFromNumber($number){
|
|
|
+ $number -= 1; if($number<0){ $number=0; }
|
|
|
+ if($number>=sizeof($this->VisitedHere)){ $number = sizeof($this->VisitedHere)-1; }
|
|
|
+ if(preg_match('/(jpg|jpeg|png|gif)/u',$this->VisitedHere[$number])){ return "?here=images/".$this->VisitedHere[$number]; }
|
|
|
+ else{ return "?post=".$this->VisitedHere[$number]; }
|
|
|
+ }
|
|
|
|
|
|
function WriteStyles(){
|
|
|
$this->style="
|
|
@@ -464,7 +509,7 @@ blockquote{border-left:2px solid %black%;padding-left:0.3em;}
|
|
|
*{box-sizing:border-box;padding:0;margin:0;font-weight:normal;}
|
|
|
b,strong,th{font-weight:bold;}
|
|
|
select{font-size:inherit;}
|
|
|
-.page,.page_gallery{padding:1em;padding-top:0;}
|
|
|
+.page,.page_gallery{padding:1em;padding-top:0;padding-bottom:0;}
|
|
|
.hidden_on_desktop,.hidden_on_wide{display:none;}
|
|
|
.hidden_on_desktop_force{display:none !important;}
|
|
|
::file-selector-button{background:none;border:none;}
|
|
@@ -477,15 +522,15 @@ header>div{overflow:auto;white-space:nowrap;}
|
|
|
.header_nav{display:inline;}
|
|
|
header a,.left a,.footer a,.clean_a,.clean_a a{text-decoration:none;}
|
|
|
header a:hover,.button:hover{color:%gray% !important;}
|
|
|
+.exp_h_f{padding-top:0.3em !important;padding-bottom:0.3em !important;line-height:1.5em !important;height:2.1em !important;}
|
|
|
.toc_button{position:absolute;top:0.5em;right:0;text-shadow: 0px 0px 10px %white%;background-color:%white%88;}
|
|
|
.footer{background-color:%white%;z-index:10;position:relative;}
|
|
|
.invert_a,.invert_a a{color:%gray%;text-decoration:none;}
|
|
|
.invert_a:hover,.invert_a a:hover{color:%black% !important;}
|
|
|
.gray,.gray a{color:%gray%;}
|
|
|
hr{border:1px solid %gray%;}
|
|
|
-header ul{display:inline-block;}
|
|
|
-header li{display:inline-block;}
|
|
|
-header li::before{content:' - '}
|
|
|
+header ul,.small_footer ul,.small_footer span,header li,.small_footer li{display:inline-block;}
|
|
|
+header li::before,.small_footer li::before{content:' - '}
|
|
|
header h1,header h2,header h3,header h4,header h5,header p{display:inline;font-size:1rem;}
|
|
|
.main{position:relative;word-spacing:-1em;}
|
|
|
.main *{word-spacing:initial;}
|
|
@@ -615,6 +660,8 @@ h1,h2,h3,h4,h5{scroll-margin:2.5em;}
|
|
|
.big_image_box{position:fixed;top:0;bottom:0;left:0;width:75%;z-index:95;text-align:center;pointer-events:none;}
|
|
|
.big_image_box *{pointer-events:auto;}
|
|
|
.big_image_box img{position:absolute;margin:auto;top:0;left:0;right:0;bottom:0;cursor:unset;}
|
|
|
+.here_image_box{position:relative;width:100%;text-align:center;height:calc(100vh - 4.5em);}
|
|
|
+.here_image_box img{position:absolute;margin:auto;top:0;left:0;right:0;bottom:0;cursor:unset;}
|
|
|
.big_side_box{position:fixed;top:0;bottom:0;right:0;width:25%;overflow:auto;z-index:98;color:%black%;padding:1rem;
|
|
|
background:linear-gradient(to right, rgba(0,0,0,0), rgb(1, 1, 1));transition:background-size .2s linear;background-size: 300% 100%;}
|
|
|
.big_side_box:hover{background-size: 100% 100%;}
|
|
@@ -701,6 +748,11 @@ animation:anim_loading 1s linear infinite;}
|
|
|
.wayback_link{display:inline;}
|
|
|
.imd{object-fit:cover;width:100%;}
|
|
|
.center_exp .imd{width:60%;}
|
|
|
+#here_buttons{display:contents;}
|
|
|
+.here_buttons_inner{position:absolute;margin:auto;top:0;left:0;right:0;bottom:0;max-height:100%;max-width:100%;}
|
|
|
+.here_btn{position:absolute;z-index:110;transform:translate(-50%,-50%);
|
|
|
+width:2em;height:2em;display:block;border:1px solid %black%;background-color:rgba(0,0,0,0.5);}
|
|
|
+.round_btn{box-shadow: 0px 0px 0px 1px inset %black%;display:inline-block;padding-left:0.4em;padding-right:0.4em;border-radius:0.5em;}
|
|
|
|
|
|
@media screen and (max-width:1000px) and (min-width:666px){
|
|
|
.left{width:35%;}
|
|
@@ -710,7 +762,6 @@ animation:anim_loading 1s linear infinite;}
|
|
|
.post_width{width:calc(100% - 1.5rem);padding-left:0.2em;}
|
|
|
.post_width_big{left:0;width:100%;}
|
|
|
.hidden_on_wide{display:unset;}
|
|
|
-.hidden_on_narrow{display:none;}
|
|
|
.pop_right{width:30%;}
|
|
|
.pop_right_big{width:40%;}
|
|
|
@keyframes pop_slide_in{0%{right:-30%;}100%{right:0%;}}
|
|
@@ -723,6 +774,7 @@ animation:anim_loading 1s linear infinite;}
|
|
|
.table_top{left:calc(-50% - 1.7em);width:calc(154% + 0.5em);}
|
|
|
.post_dummy > *{width:80%;max-width:55rem;}
|
|
|
.center_exp .imd{width:80%;}
|
|
|
+.here_btn{width:1.5em;height:1.5em;}
|
|
|
}
|
|
|
|
|
|
@media screen and (max-width:666px){
|
|
@@ -730,6 +782,7 @@ html{font-size:16px;}
|
|
|
.hidden_on_mobile{display:none !important;}
|
|
|
.block_on_mobile{display:block !important;}
|
|
|
.hidden_on_desktop{display:unset;}
|
|
|
+.hidden_on_wide{display:unset;}
|
|
|
header ul{display:block;}
|
|
|
header li{display:block;}
|
|
|
header li::before{content:''}
|
|
@@ -784,6 +837,9 @@ table img{max-width:30vw !important;}
|
|
|
.center_exp{display:block;width:100%;margin:0 auto;padding-bottom:1em;}
|
|
|
.center_exp .post{overflow:auto;}
|
|
|
.center_exp .imd{width:100%;}
|
|
|
+.here_btn{width:1.2em;height:1.2em;}
|
|
|
+.exp_h_f{height:unset !important;}
|
|
|
+.exp_f{margin-bottom:1em;}
|
|
|
}
|
|
|
|
|
|
@media print{
|
|
@@ -858,13 +914,44 @@ blockquote{border-left:2px solid black;}
|
|
|
return preg_replace('/\./u','[dot]',preg_replace('/\@/u','[at]',$this->EMail));
|
|
|
}
|
|
|
|
|
|
- function &FindImage($name){
|
|
|
+ function &FindImage($name, $loose=false){ if(!isset($name) || !$name){ return $this->NULL_IMAGE; }
|
|
|
if(isset($this->Images[0]))foreach($this->Images as &$im){
|
|
|
- if($im['name']==$name) return $im;
|
|
|
+ if($loose) { if(preg_match('/'.preg_quote($name).'/u',$im['name'])) return $im; }
|
|
|
+ else { if($im['name']==$name) return $im; }
|
|
|
}
|
|
|
return $this->NULL_IMAGE;
|
|
|
}
|
|
|
|
|
|
+ function &GiveImageInHere($rand=false){
|
|
|
+ $this->ReadImages();
|
|
|
+ $album = $this->PageType=='here'?$this->HereAlbum:$this->ExpAlbum;
|
|
|
+ if(!isset($album) || !$album){
|
|
|
+ if(isset($this->Images[0])) return $this->Images[0]; else return $this->NULL_IMAGE; }
|
|
|
+ $imlist=[];
|
|
|
+ if(isset($this->Images[0])){
|
|
|
+ foreach($this->Images as &$im){
|
|
|
+ if(isset($im['galleries'][0]) && in_array($album,$im['galleries'])){
|
|
|
+ if(!$rand) return $im; else { if($this->CanShowImage($im)) $imlist[] = $im; }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!$rand || !isset($imlist[0])) return $this->NULL_IMAGE;
|
|
|
+ $r = random_int(0, sizeof($imlist)-1);
|
|
|
+ return $imlist[$r];
|
|
|
+ }
|
|
|
+
|
|
|
+ function ImageTitle($im){
|
|
|
+ $imtitle = (isset($im)&&isset($im['title']))?$im['title']:NULL;
|
|
|
+ if(isset($im['parent'])&&($imp = &$this->FindImage($im['parent'],true))&&isset($imp['title'])){ $imtitle=$imp['title']; }
|
|
|
+
|
|
|
+ return $imtitle;
|
|
|
+ }
|
|
|
+
|
|
|
+ function ImageHasHere(&$im, $here_name){
|
|
|
+ if(!isset($im['here'])||!isset($im['here'][0])) return false;
|
|
|
+ foreach($im['here'] as $h) { if($h[0] == $here_name) return true; } return false;
|
|
|
+ }
|
|
|
+
|
|
|
function ReadImages($clear_non_exist = false){
|
|
|
$path = 'images/list.md';
|
|
|
if($this->DoneReadImages){ return; }
|
|
@@ -888,11 +975,12 @@ blockquote{border-left:2px solid black;}
|
|
|
$item['galleries']=[];
|
|
|
foreach($ga as $g){ if(!in_array($g[0], $item['galleries'])) $item['galleries'][] = $g[0]; }
|
|
|
}
|
|
|
- if(preg_match('/PRODUCT\s+([^;]*);/u',$m[2],$product)){
|
|
|
- $item['product']=$product[1];
|
|
|
- }
|
|
|
- if(preg_match('/PARENT\s+([^;]*);/u',$m[2],$parent)){
|
|
|
- $item['parent']=$parent[1];
|
|
|
+ if(preg_match('/PRODUCT\s+([^;]*);/u',$m[2],$product)){ $item['product']=$product[1]; }
|
|
|
+ if(preg_match('/PARENT\s+([^;]*);/u',$m[2],$parent)){ $item['parent']=$parent[1]; }
|
|
|
+ if(preg_match('/TITLE\s+([^;]*);/u',$m[2],$title)){ $item['title']=$title[1]; }
|
|
|
+ if(preg_match('/HERE\s+([^;]*);/u',$m[2],$heres) && preg_match_all('/(\S+)-(\S+)-(\S+)/u',$heres[1],$here, PREG_SET_ORDER)){
|
|
|
+ $item['here']=[];
|
|
|
+ foreach($here as $h){ if(!$this->ImageHasHere($item, $h[1])) $item['here'][] = [$h[1],$h[2],$h[3]]; }
|
|
|
}
|
|
|
$this->Images[] = $item;
|
|
|
}
|
|
@@ -951,6 +1039,10 @@ blockquote{border-left:2px solid black;}
|
|
|
if(isset($im['galleries']) && isset($im['galleries'][0])){ fwrite($f, 'GAL '.implode(" ",$im['galleries'])."; "); }
|
|
|
if(isset($im['product']) && $im['product']!=''){ fwrite($f, 'PRODUCT '.$im['product']."; "); }
|
|
|
if(isset($im['parent']) && $im['parent']!=''){ fwrite($f, 'PARENT '.$im['parent']."; "); }
|
|
|
+ if(isset($im['title']) && $im['title']!=''){ fwrite($f, 'TITLE '.$im['title']."; "); }
|
|
|
+ if(isset($im['here']) && $im['here']!=''){ fwrite($f, 'HERE ');
|
|
|
+ foreach($im['here'] as $here){ fwrite($f, implode('-',$here).' '); } fwrite($f, '; ');
|
|
|
+ }
|
|
|
fwrite($f, PHP_EOL);
|
|
|
}
|
|
|
fflush($f);
|
|
@@ -1674,7 +1766,7 @@ blockquote{border-left:2px solid black;}
|
|
|
//if(!isset($post['archive']) && $this->DoneReadArchive && isset($post['version'])){ unset($post['version']); }
|
|
|
}else return;
|
|
|
if(isset($this->Images) && isset($this->Images[0])) foreach ($this->Images as &$im){
|
|
|
- unset($im['refs']);
|
|
|
+ unset($im['refs']); unset($im['here']); unset($im['title']);
|
|
|
}
|
|
|
foreach ($this->Posts as &$post){
|
|
|
if(preg_match_all('/<a[^>]*href=[\'\"]\?post=([0-9]{14})[\'\"][^>]*>.*?<\/a>/u',$post['html'],$matches,PREG_SET_ORDER)){
|
|
@@ -1699,12 +1791,30 @@ blockquote{border-left:2px solid black;}
|
|
|
if(!isset($post['hasi']))$post['hasi']=[]; if(!in_array($m[2],$post['hasi']))$post['hasi'][]=$m[2];
|
|
|
}
|
|
|
}
|
|
|
+ if(preg_match("/(\!\[.*?\]\(\s*images\/([0-9]{14,}\.(jpg|jpeg|png|gif))\))(\R*(\R(-|\*).+){1,})/u",$post['content'],$matches)){
|
|
|
+ $use_img_name = $matches[2];
|
|
|
+ if(($im = &$this->FindImage($use_img_name))!=NULL){
|
|
|
+ if(preg_match_all("/(-|\*)\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],$mah,PREG_SET_ORDER)){
|
|
|
+ foreach($mah as $ma){
|
|
|
+ if(!isset($im['here']))$im['here']=[]; if(!$this->ImageHasHere($item, $ma[4])){
|
|
|
+ $here = [$ma[4], $ma[2], $ma[3]]; $im['here'][] = $here; }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}foreach($this->Posts as &$post){
|
|
|
if(isset($post['hasp']) && isset($post['hasp'][0])) foreach($post['hasp'] as $t){ if(!preg_match("/[0-9]{14}/u",$t)) continue;
|
|
|
$pt=&$this->GetPost($t,false,true); if(isset($pt) && isset($pt['hastag']) && isset($pt['hastag'][0]) && in_array($t,$pt['hastag'])){
|
|
|
if(!isset($pt['refs']))$pt['refs']=[]; $pt['refs'][]=$post['id']; }
|
|
|
}
|
|
|
}
|
|
|
+ if(isset($this->Images) && isset($this->Images[0])) foreach ($this->Images as &$im){
|
|
|
+ $min_id = '99999999999999';
|
|
|
+ if(isset($im['refs']) && isset($im['refs'][0])) foreach ($im['refs'] as &$ref){
|
|
|
+ $r = &$this->GetPost($ref,true); if(isset($r)) $title = $this->GetPostTitle($r,true,false);
|
|
|
+ if($title && $ref<$min_id) { $im['title'] = preg_replace('/;/u',' ',trim($title)); $min_id=$r['id']; }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
function CreatePostAnchor(&$post){
|
|
@@ -1881,7 +1991,7 @@ blockquote{border-left:2px solid black;}
|
|
|
return $p_success;
|
|
|
}
|
|
|
|
|
|
- function InsertReplacementSymbols($MarkdownContent){
|
|
|
+ function InsertReplacementSymbols($MarkdownContent, &$post_for_it_is_here){
|
|
|
$replacement = preg_replace('/<!--[\s\S]*-->/U',"",$MarkdownContent);
|
|
|
$replacement = preg_replace_callback("/(```|`)([^`]*)(?1)/U",
|
|
|
function($matches){
|
|
@@ -1921,8 +2031,12 @@ blockquote{border-left:2px solid black;}
|
|
|
$rep = preg_replace('/\{@/','{',$rep);
|
|
|
$rep = preg_replace('/(en|zh|any)@\|(en|zh|any)/','$1|$2',$rep);
|
|
|
return $rep;
|
|
|
- },
|
|
|
- $replacement);
|
|
|
+ }, $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;
|
|
|
}
|
|
|
|
|
@@ -1972,6 +2086,8 @@ blockquote{border-left:2px solid black;}
|
|
|
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;
|
|
|
}
|
|
|
|
|
@@ -2051,6 +2167,86 @@ blockquote{border-left:2px solid black;}
|
|
|
return json_encode($obj, JSON_UNESCAPED_SLASHES);
|
|
|
}
|
|
|
|
|
|
+ function MakeRSS(){
|
|
|
+ $this->ReadPosts();$this->ReadImages();
|
|
|
+ $author = "<author><name>".$this->DisplayName."</name><email>".$this->EMail."</email><uri>".$this->HostURL."</uri></author>";
|
|
|
+ $all_content="<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom'>".
|
|
|
+ "<title>".$this->T($this->Title)."</title>".
|
|
|
+ "<link href='".$this->HostURL."/?rss' rel='self'/>".
|
|
|
+ "<link href='".$this->HostURL."' />".$author;
|
|
|
+ $i=0;
|
|
|
+ if(isset($this->UsePosts[0])) foreach(array_reverse($this->UsePosts) as &$p){
|
|
|
+ if($i>100) break;
|
|
|
+ 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(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; }
|
|
|
+
|
|
|
+
|
|
|
+ $is_thread = isset($p['tid']['count'])&&($p['tid']['count']>1);
|
|
|
+ $is_reversed=false;
|
|
|
+ $content="<entry>"; $title = NULL;
|
|
|
+ if($is_thread){
|
|
|
+ $use_arr = $th['arr']; $is_reversed=$this->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 &$po){
|
|
|
+ $this->ConvertPost($po);
|
|
|
+ if(!isset($title)){$title = $this->GetPostTitle($po, false, false);
|
|
|
+ $content.="<id>tag:".$this->HostURL."-".$po['id']."</id>";
|
|
|
+ $content.="<title>".$title."</title><link>".$this->HostURL."/?post=".$po['id']."</link>";
|
|
|
+ $content.="<published>".$this->StandardTime($po['id'])."</published>";
|
|
|
+ $content.="<updated>".$this->StandardTime(isset($p['tid']['last']['version'])?
|
|
|
+ $p['tid']['last']['version']:$p['tid']['last']['id'])."</updated>".$author;
|
|
|
+ $content.="<content type='html'>"; }
|
|
|
+ $content.= htmlspecialchars($po['html']);
|
|
|
+ //if(isset($po['images'])&&isset($po['images'][0])) foreach($po['images'] as $im){ $content.=htmlspecialchars($im); }
|
|
|
+ }
|
|
|
+ $content.=$this->ReadableTime($p['tid']['first']['id'])." - ".
|
|
|
+ $this->ReadableTime(isset($p['tid']['last']['version'])?
|
|
|
+ $p['tid']['last']['version']:$p['tid']['last']['id']);
|
|
|
+ $content.="</content>";
|
|
|
+ }else{
|
|
|
+ $this->ConvertPost($p);
|
|
|
+ if(!isset($title)){$title = $this->GetPostTitle($p, false, false);
|
|
|
+ $content.="<id>tag:".$this->HostURL."-".$p['id']."</id>";
|
|
|
+ $content.="<title type='text'>".$title."</title><link>".$this->HostURL."/?post=".$p['id']."</link>";
|
|
|
+ $content.="<published>".$this->StandardTime($p['id'])."</published>";
|
|
|
+ $content.="<updated>".$this->StandardTime(isset($p['tid']['last']['version'])?
|
|
|
+ $p['tid']['last']['version']:$p['tid']['last']['id'])."</updated>".$author;}
|
|
|
+ $content.= "<content type='html'>".htmlspecialchars($p['html']);
|
|
|
+ //if(isset($p['images'])&&isset($p['images'][0])) foreach($p['images'] as $im){ $content.=htmlspecialchars($im); }
|
|
|
+ $content.=$this->ReadableTime($p['id'])." - ".
|
|
|
+ $this->ReadableTime(isset($p['version'])?$p['version']:$p['id']);
|
|
|
+ $content.="</content>";
|
|
|
+ }
|
|
|
+ $i++;
|
|
|
+ $content.="</entry>";
|
|
|
+ $all_content.=$content;
|
|
|
+ }
|
|
|
+ $all_content.="</feed>";
|
|
|
+ header( "Content-type: text/xml");
|
|
|
+ echo $all_content;
|
|
|
+ }
|
|
|
+
|
|
|
+ function MakeHereButtons($im, $insert_here){
|
|
|
+ if(isset($im['here'])&&isset($im['here'][0])){
|
|
|
+ $size=getimagesize($im['file']); $aspect=$size[0]/$size[1];
|
|
|
+ echo ($insert_here?"<here>":"")."<div class='here_buttons_inner' style='aspect-ratio:".$aspect.";'>";
|
|
|
+ foreach($im['here'] as $here){
|
|
|
+ if($insert_here){
|
|
|
+ echo "<a href='?show_image=".$here[0]."' class='here_btn' style='left:".$here[1]."%;top:".$here[2]."%;'".
|
|
|
+ "onclick='event.preventDefault();event.stopPropagation();ShowBigImage(\"".$here[0]."\",1);'></a>";
|
|
|
+ }else{
|
|
|
+ echo "<a href='?here=images/".$here[0]."' class='here_btn' style='left:".$here[1]."%;top:".$here[2]."%;'></a>";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ echo "</div>".($insert_here?"</here>":"");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
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");
|
|
@@ -2060,6 +2256,10 @@ blockquote{border-left:2px solid black;}
|
|
|
setcookie('la_language',$_GET['set_language'],time()+3600*24*7); $_COOKIE['la_language'] = $_GET['set_language'];
|
|
|
$redirect=$this->GetRedirect(); return 0;
|
|
|
}
|
|
|
+ if(isset($_GET['rss'])){
|
|
|
+ if(in_array($_GET['rss'],['en','zh'])){$this->LanguageAppendix=$_GET['rss'];}
|
|
|
+ $this->MakeRSS(); exit;
|
|
|
+ }
|
|
|
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;
|
|
@@ -2081,13 +2281,9 @@ blockquote{border-left:2px solid black;}
|
|
|
}
|
|
|
$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['post'])){ $this->CurrentPostID = $_GET['post']; $this->TagID = $this->CurrentPostID; }
|
|
|
+ if(isset($_GET['here'])){ $this->HereID = $_GET['here']; }
|
|
|
+ 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();";
|
|
@@ -2095,9 +2291,11 @@ blockquote{border-left:2px solid black;}
|
|
|
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['random_here'])){
|
|
|
+ $this->DoIdentiyExperimental(); $this->DetectPageType();
|
|
|
+ $im = &$this->GiveImageInHere(true); if(isset($im)){ $redirect='?here=images/'.$im['name']; return 0; }
|
|
|
}
|
|
|
+ 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']);
|
|
@@ -2115,7 +2313,8 @@ blockquote{border-left:2px solid black;}
|
|
|
$this->MakeSinglePost($p, false, true, "post_preview", true, false, false, false, true);"</li>";
|
|
|
}
|
|
|
if($direct_return){
|
|
|
- echo "</ul></insert>";
|
|
|
+ echo "</ul></insert>";
|
|
|
+ $this->MakeHereButtons($im, true);
|
|
|
}else{
|
|
|
$str = ob_get_clean();
|
|
|
$this->MakePageBegin();
|
|
@@ -2155,11 +2354,17 @@ blockquote{border-left:2px solid black;}
|
|
|
if(isset($_POST['settings_default_gallery'])) $this->DefaultGallery=$_POST['settings_default_gallery'];
|
|
|
if(isset($_POST['settings_selfauth_path'])) $this->SelfAuthPath=$_POST['settings_selfauth_path'];
|
|
|
if(isset($_POST['settings_enable_comments'])) $this->CommentEnabled=True; else $this->CommentEnabled=False;
|
|
|
+ if(isset($_POST['settings_here_host'])) $this->HereHost=$_POST['settings_here_host'];
|
|
|
+ if(isset($_POST['settings_here_title'])) $this->HereTitle=$_POST['settings_here_title'];
|
|
|
+ if(isset($_POST['settings_here_short_title'])) $this->HereShortTitle=$_POST['settings_here_short_title'];
|
|
|
+ if(isset($_POST['settings_here_album'])) $this->HereAlbum=$_POST['settings_here_album'];
|
|
|
+ if(isset($_POST['settings_here_navigation'])) $this->HereNavigation=$_POST['settings_here_navigation'];
|
|
|
+ if(isset($_POST['settings_here_footer'])) $this->HereFooter=$_POST['settings_here_footer'];
|
|
|
if(isset($_POST['settings_exp_host'])) $this->ExpHost=$_POST['settings_exp_host'];
|
|
|
if(isset($_POST['settings_exp_title'])) $this->ExpTitle=$_POST['settings_exp_title'];
|
|
|
if(isset($_POST['settings_exp_short_title'])) $this->ExpShortTitle=$_POST['settings_exp_short_title'];
|
|
|
if(isset($_POST['settings_exp_caution'])) $this->ExpCaution=$_POST['settings_exp_caution'];
|
|
|
- if(isset($_POST['settings_exp_index'])) $this->ExpIndex=$_POST['settings_exp_index'];
|
|
|
+ if(isset($_POST['settings_exp_album'])) $this->ExpAlbum=$_POST['settings_exp_album'];
|
|
|
if(isset($_POST['settings_exp_navigation'])) $this->ExpNavigation=$_POST['settings_exp_navigation'];
|
|
|
if(isset($_POST['settings_exp_footer'])) $this->ExpFooter=$_POST['settings_exp_footer'];
|
|
|
if(isset($_POST['settings_mastodon_token'])) $this->MastodonToken=$_POST['settings_mastodon_token'];
|
|
@@ -2374,8 +2579,8 @@ blockquote{border-left:2px solid black;}
|
|
|
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 = "<div class='imd'><a href='".$im['file']."' class='original_img' target='_blank'>".
|
|
|
+ if($this->InHereMode){
|
|
|
+ $click = "<div class='imd'>"."<a href='?here=".$im['file']."' class='original_img'>".
|
|
|
$m[2].$orig_src.$m[7]."></a></div>";
|
|
|
return $click;
|
|
|
}else{ $click =
|
|
@@ -2426,28 +2631,31 @@ blockquote{border-left:2px solid black;}
|
|
|
function ConvertPost(&$post){
|
|
|
if(!isset($post['html'])){
|
|
|
$info=[];
|
|
|
- $post['html'] = $this->TranslatePostParts($this->PostProcessHTML($this->ChoosePartsByLanguage($this->PDE->text($this->InsertReplacementSymbols($post['content'])),true),
|
|
|
+ $post['html'] = $this->TranslatePostParts($this->PostProcessHTML($this->ChoosePartsByLanguage($this->PDE->text($this->InsertReplacementSymbols($post['content'], $post)),true),
|
|
|
$post['images'],
|
|
|
isset($post['product']), $info,
|
|
|
$post['original_images']));
|
|
|
if(isset($post['product'])) $post['product']=$info;
|
|
|
}
|
|
|
}
|
|
|
- function GetPostTitle(&$post, $h1_only=false){
|
|
|
+ function GetPostTitle(&$post, $h1_only=false, $add_unamed=true){
|
|
|
if(!isset($post['title'])){
|
|
|
if($h1_only){
|
|
|
if(preg_match('/^#\s+(.*?)$/mu',$post['content'],$m)){return $m[1];}
|
|
|
return NULL;
|
|
|
}
|
|
|
if(preg_match('/^#{1,6}\s+(.*?)$/mu',$post['content'],$m)){$post['title']=$m[1];}
|
|
|
- else{ $post['title'] = $this->T('未命名'); if(preg_match('/(.*)$/mu',$post['content'],$m))
|
|
|
- {$post['title'].=' ('.strip_tags($this->PDE->text($m[1])).')';} }
|
|
|
+ else{ $post['title'] = $add_unamed?$this->T('未命名'):"";
|
|
|
+ if(preg_match('/(.*)$/mu',$post['content'],$m)){
|
|
|
+ $post['title'].=($add_unamed?' (':'').strip_tags($this->PDE->text($m[1])).($add_unamed?')':''); }
|
|
|
+ }
|
|
|
}
|
|
|
- return $post['title'];
|
|
|
+ return $this->ChoosePartsByLanguage($post['title']);
|
|
|
}
|
|
|
|
|
|
function DetectPageType(){
|
|
|
- if($this->InExperimentalMode) $this->PageType='experimental';
|
|
|
+ if ($this->InExperimentalMode) $this->PageType='experimental';
|
|
|
+ else if($this->InHereMode) $this->PageType='here';
|
|
|
else if(isset($_GET['history'])) $this->PageType='history';
|
|
|
else if(isset($_GET['extras'])) $this->PageType='extras';
|
|
|
else if(isset($_GET['settings'])) $this->PageType='settings';
|
|
@@ -2457,6 +2665,10 @@ blockquote{border-left:2px solid black;}
|
|
|
else if(isset($this->CurrentPostID)) $this->PageType = "post";
|
|
|
else if(isset($_GET['comments'])) $this->PageType='comments';
|
|
|
else $this->PageType = "main";
|
|
|
+
|
|
|
+ $visited_here = $this->InExperimentalMode?"visited_experimental":"visited_here";
|
|
|
+ if(!isset($_SESSION[$visited_here])){ $_SESSION[$visited_here] = []; }
|
|
|
+ $this->VisitedHere = $_SESSION[$visited_here];
|
|
|
}
|
|
|
|
|
|
function MakePageBegin(){ ?>
|
|
@@ -2464,12 +2676,14 @@ blockquote{border-left:2px solid black;}
|
|
|
<head>
|
|
|
<meta charset='utf-8'>
|
|
|
<meta content="width=device-width, initial-scale=1" name="viewport">
|
|
|
- <title><?=$this->InExperimentalMode?$this->T($this->ExpTitle):$this->T($this->Title)?></title>
|
|
|
+ <title><?=$this->InExperimentalMode?$this->T($this->ExpTitle):
|
|
|
+ ($this->InHereMode?$this->T($this->HereTitle):$this->T($this->Title))?></title>
|
|
|
<?php if($this->UseRemoteFont){ ?><style>
|
|
|
@font-face{font-family: "Noto Serif CJK SC";src:url("fonts/NotoSerifSC-Regular.otf") format("opentype");font-weight:normal;}
|
|
|
@font-face{font-family: "Noto Serif CJK SC";src:url("fonts/NotoSerifSC-Bold.otf") format("opentype");font-weight:bold;}
|
|
|
</style><?php } ?>
|
|
|
<link href='styles/main.css' rel='stylesheet' type="text/css">
|
|
|
+ <link rel="alternate" type="application/rss+xml" title="<?=$this->T($this->Title);?>" href="?rss=<?=$this->LanguageAppendix;?>" />
|
|
|
<?php if(isset($this->SelfAuthPath)&&$this->SelfAuthPath!=""){ ?>
|
|
|
<link rel="authorization_endpoint" href="<?=$this->SelfAuthPath?>" /><?php } ?>
|
|
|
</head>
|
|
@@ -2487,7 +2701,7 @@ blockquote{border-left:2px solid black;}
|
|
|
wait = document.querySelector("#waiting_bar");
|
|
|
wait.style.display='none';
|
|
|
}
|
|
|
- <?php if(!$this->InExperimentalMode){ ?>
|
|
|
+ <?php if(!$this->InHereMode){ ?>
|
|
|
function la_auto_grow(element){
|
|
|
s=window.scrollY;element.style.height="30px";element.style.height=(element.scrollHeight)+"px";window.scroll(0, s);
|
|
|
}
|
|
@@ -2550,13 +2764,13 @@ blockquote{border-left:2px solid black;}
|
|
|
}
|
|
|
<?php } ?>
|
|
|
</script>
|
|
|
- <header><div>
|
|
|
- <?php if($this->InExperimentalMode){
|
|
|
+ <header<?=$this->InHereMode?' class="exp_h_f"':''?>><div>
|
|
|
+ <?php if($this->InHereMode){
|
|
|
$this->MakeExpNavButtons($p);
|
|
|
}else{
|
|
|
$this->MakeNavButtons($p);
|
|
|
+ echo "<hr />";
|
|
|
} ?>
|
|
|
- <hr />
|
|
|
<?php if(isset($this->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);
|
|
@@ -2585,7 +2799,7 @@ blockquote{border-left:2px solid black;}
|
|
|
</div></header>
|
|
|
<div id='waiting_bar' style='display:none;'></div>
|
|
|
<script>ShowWaitingBar();window.addEventListener('load',(event) =>{HideWaitingBar();}); </script>
|
|
|
- <?php if(!$this->InExperimentalMode){ ?>
|
|
|
+ <?php if(!$this->InHereMode){ ?>
|
|
|
<div id='post_menu' style='display:none;' class='pop_menu clean_a'>
|
|
|
<ul>
|
|
|
<li><span id='_time_hook' class='smaller'>时间</span> <a href='javascript:HidePopMenu();'>×</a></li>
|
|
@@ -2702,7 +2916,7 @@ blockquote{border-left:2px solid black;}
|
|
|
<?php } ?>
|
|
|
<a href='index.php?gallery=default' onclick='ShowWaitingBar()'><?=$this->T('画廊')?></a>
|
|
|
<?php if($this->LoggedIn){ ?>
|
|
|
- | <span class='gray invert_a'><a href='index.php?comments=al最近l'>@</a></span><?php } ?></li>
|
|
|
+ | <span class='gray invert_a'><a href='index.php?comments=all'>@</a></span><?php } ?></li>
|
|
|
<?php $this->SpecialNavigation;if(isset($this->SpecialNavigation) && ($p = &$this->GetPost($this->SpecialNavigation))!=NULL){
|
|
|
echo $this->GenerateSinglePost($p, false, false, false, false,$this->NULL_POST);
|
|
|
} ?>
|
|
@@ -2722,20 +2936,29 @@ blockquote{border-left:2px solid black;}
|
|
|
<?php
|
|
|
}
|
|
|
|
|
|
- function MakeExpNavButtons(&$p){?>
|
|
|
- <b><a href='index.php' class='hidden_on_mobile'><?=$this->T($this->ExpTitle)?></a></b>
|
|
|
- <b><a class='hidden_on_desktop'
|
|
|
- href='javascript:toggle_mobile_show(document.getElementById("mobile_nav"))'><?=$this->T($this->ExpShortTitle)?>...</a></b>
|
|
|
- <ul class='hidden_on_mobile' id='mobile_nav' style='text-align:center;'>
|
|
|
+ function MakeExpNavButtons(&$p){ ?>
|
|
|
+ <a href='index.php' class='hidden_on_mobile'>
|
|
|
+ <b><?=$this->InExperimentalMode?$this->T($this->ExpTitle):$this->T($this->HereTitle)?></b></a>
|
|
|
+ <a class='hidden_on_desktop'
|
|
|
+ href='javascript:toggle_mobile_show(document.getElementById("mobile_nav"))'><b>
|
|
|
+ <?=$this->InExperimentalMode?$this->T($this->ExpShortTitle):$this->T($this->HereShortTitle)?>...</b></a>
|
|
|
+ <a <?=$this->HereNumber==1?"class='gray'":("href=".$this->HereLinkFromNumber($this->HereNumber-1))?>>←</a>
|
|
|
+ <span><?=$this->HereNumber.'/'.sizeof($this->VisitedHere);?></span>
|
|
|
+ <span class='round_btn'><a href='<?=$this->HereLinkFromNumber($this->HereNumber+1);?>'>→</a> <a href='?random_here=1'><?=$this->T("随机")?></a></span>
|
|
|
+ <b><?=$this->T($this->ChoosePartsByLanguage($this->HereDisplayTitle));?></b>
|
|
|
+ <?=isset($this->HereMainImage)?("<a class='invert_a' href='?here=images/".$this->HereMainImage['name']."'>".$this->T("看全图")."</a>"):"";?>
|
|
|
+ <ul class='hidden_on_mobile gray invert_a' id='mobile_nav' style='text-align:center;'>
|
|
|
<li class='hidden_on_desktop block_on_mobile'><a href='index.php'><?=$this->T('索引')?></a></li>
|
|
|
- <?php $this->ExpNavigation;if(isset($this->ExpNavigation) && ($p = &$this->GetPost($this->ExpNavigation))!=NULL){
|
|
|
+ <?php if($this->InExperimentalMode && isset($this->ExpNavigation) && ($p = &$this->GetPost($this->ExpNavigation))!=NULL){
|
|
|
+ echo $this->GenerateSinglePost($p, false, false, false, false,$this->NULL_POST);
|
|
|
+ }else if($this->InHereMode && isset($this->HereNavigation) && ($p = &$this->GetPost($this->HereNavigation))!=NULL){
|
|
|
echo $this->GenerateSinglePost($p, false, false, false, false,$this->NULL_POST);
|
|
|
} ?>
|
|
|
<?php if($this->LanguageAppendix=='zh'){ ?>
|
|
|
- <li class='invert_a smaller'><a href='<?=$this->GetRedirect().'&set_language=en'?>'><b>汉语</b>/English</a></li>
|
|
|
+ <li class='smaller'><a href='<?=$this->GetRedirect().'&set_language=en'?>'><b>汉语</b>/English</a></li>
|
|
|
<?php }else { ?>
|
|
|
- <li class='invert_a smaller'><a href='<?=$this->GetRedirect().'&set_language=zh'?>'>汉语/<b>English</b></a></li>
|
|
|
- <span class='text_highlight'><a id='translate_button' target='_blank'> Google Translate </a></span></li>
|
|
|
+ <li class='smaller'><a href='<?=$this->GetRedirect().'&set_language=zh'?>'>汉语/<b>English</b></a></li>
|
|
|
+ <li class='smaller'><a id='translate_button' target='_blank'> Google Translate </a></li>
|
|
|
<?php } ?>
|
|
|
</ul>
|
|
|
<?php
|
|
@@ -3281,7 +3504,7 @@ blockquote{border-left:2px solid black;}
|
|
|
echo "<li><a href='?post=".$po['id']."'>".$this->GetPostTitle($po)."</a></li>";
|
|
|
} ?>
|
|
|
</ul><?php } ?>
|
|
|
- <?php if($this->LoggedIn && (!$this->InExperimentalMode)){ ?>
|
|
|
+ <?php if($this->LoggedIn && (!$this->InHereMode)){ ?>
|
|
|
<div class='post_width_big hidden_on_print'><br />
|
|
|
<?php $this->MakePostingFields($th['last']['id'], true);?><br />
|
|
|
</div>
|
|
@@ -3383,7 +3606,7 @@ blockquote{border-left:2px solid black;}
|
|
|
<li class='gray smaller bold' style='text-align:center;'>
|
|
|
<p> </p><hr><?=$this->T('该话题最新帖子在前')?><hr><p> </p></li>
|
|
|
<?php $hinted = true;
|
|
|
- if($this->LoggedIn && (!$this->InExperimentalMode)){ ?>
|
|
|
+ if($this->LoggedIn && (!$this->InHereMode)){ ?>
|
|
|
<div class='post_width_big hidden_on_print'>
|
|
|
<?php $this->MakePostingFields($is_thread?$th['last']['id']:$post['id'], true);?></div><br />
|
|
|
<?php } }
|
|
@@ -3399,7 +3622,7 @@ blockquote{border-left:2px solid black;}
|
|
|
<br class='hidden_on_desktop' /><?=$this->ReadableTime(isset($post['tid']['last']['version'])?
|
|
|
$post['tid']['last']['version']:$post['tid']['last']['id']);?>
|
|
|
</div>
|
|
|
- <?php if(!$is_reversed && ($this->LoggedIn && (!$this->InExperimentalMode))){ ?>
|
|
|
+ <?php if(!$is_reversed && ($this->LoggedIn && (!$this->InHereMode))){ ?>
|
|
|
<div class='post_width_big hidden_on_print'>
|
|
|
<br /><?php $this->MakePostingFields($is_thread?$th['last']['id']:$post['id'], true);?>
|
|
|
</div>
|
|
@@ -3432,14 +3655,23 @@ blockquote{border-left:2px solid black;}
|
|
|
}
|
|
|
}else{
|
|
|
$this->MakeSinglePostExp($post);
|
|
|
- if($post['id']!=$this->ExpIndex){ ?><script>
|
|
|
+ ?><!--<script>
|
|
|
document.title+=" | <?=addslashes(preg_replace('/\r|\n/u', ' ', mb_substr(strip_tags($post['html']),0,1000)))?>";
|
|
|
- </script><?php }
|
|
|
+ </script>--><?php
|
|
|
} ?>
|
|
|
</ul>
|
|
|
</div>
|
|
|
<?php
|
|
|
}
|
|
|
+ function MakeHereSection(&$im){ $image_okay = (isset($im) && $im!=$this->NULL_IMAGE); ?>
|
|
|
+ <div class='here_image_box clean_a'>
|
|
|
+ <div style='display:flex;align-items:center;height:100%;justify-content:center;width:100%;'>
|
|
|
+ <?=$image_okay?$this->T('请稍候'):$this->T('未找到图像')?></div>
|
|
|
+ <?php if($image_okay){ ?>
|
|
|
+ <img id='big_image' onload="HideWaitingBar();" src="<?=$im['file'];?>" />
|
|
|
+ <?php } $this->MakeHereButtons($im, false); ?>
|
|
|
+ </div>
|
|
|
+ <?php }
|
|
|
|
|
|
function MakeSideGalleryCode(){?>
|
|
|
<div>
|
|
@@ -3697,11 +3929,11 @@ blockquote{border-left:2px solid black;}
|
|
|
}
|
|
|
|
|
|
function CanShowGallery(&$g){
|
|
|
- if(!$this->LoggedIn && isset($g['experimental']) && $g['experimental']) return false;
|
|
|
+ if((!$this->LoggedIn&&!$this->InExperimentalMode) && isset($g['experimental']) && $g['experimental']) return false;
|
|
|
return true;
|
|
|
}
|
|
|
function CanShowImage(&$im){
|
|
|
- if(!$this->LoggedIn && isset($im['galleries']) && isset($im['galleries'][0])) foreach($im['galleries'] as $ga){
|
|
|
+ if((!$this->LoggedIn&&!$this->InExperimentalMode) && isset($im['galleries']) && isset($im['galleries'][0])) foreach($im['galleries'] as $ga){
|
|
|
if(($g=$this->GetGallery($ga)) && isset($g['experimental']) && $g['experimental']) return false;
|
|
|
}
|
|
|
if(isset($this->WayBack) && substr($im['name'],0,14)>$this->WayBack) return false;
|
|
@@ -3998,9 +4230,31 @@ blockquote{border-left:2px solid black;}
|
|
|
<td><input type="text" form="settings_form" id='settings_apub_id' name='settings_apub_id'
|
|
|
value='<?=$this->APubID?>'/></td></tr>
|
|
|
|
|
|
+ <tr><td class='smaller gray'> </td></tr>
|
|
|
+ <tr><td class='smaller gray'><?=$this->T('这里访问')?></td></tr>
|
|
|
+ <tr><td><?=$this->T('主机')?></td>
|
|
|
+ <td><input type="text" form="settings_form" id='settings_here_host' name='settings_here_host'
|
|
|
+ value='<?=$this->HereHost?>'/></td></tr>
|
|
|
+ <tr><td><?=$this->T('网站标题')?></td>
|
|
|
+ <td><input type="text" form="settings_form" id='settings_here_title' name='settings_here_title'
|
|
|
+ value='<?=$this->HereTitle?>'/></td></tr>
|
|
|
+ <tr><td><?=$this->T('短标题')?></td>
|
|
|
+ <td><input type="text" form="settings_form" id='settings_here_short_title' name='settings_here_short_title'
|
|
|
+ value='<?=$this->HereShortTitle?>'/></td></tr>
|
|
|
+ <tr><td><?=$this->T('相册')?></td>
|
|
|
+ <td><input type="text" form="settings_form" id='settings_here_album' name='settings_here_album'
|
|
|
+ value='<?=$this->HereAlbum?>'/></td></tr>
|
|
|
+ <tr><td><?=$this->T('导航栏')?>
|
|
|
+ <?=isset($this->HereNavigation)?"<a href='?post=".$this->HereNavigation."'>→</a>":""?></td>
|
|
|
+ <td><input type="text" form="settings_form" id='settings_here_navigation' name='settings_here_navigation'
|
|
|
+ value='<?=$this->HereNavigation?>'/></td></tr>
|
|
|
+ <tr><td><?=$this->T('脚注')?><?=isset($this->HereFooter)?"<a href='?post=".$this->HereFooter."'>→</a>":""?></td>
|
|
|
+ <td><input type="text" form="settings_form" id='settings_here_footer' name='settings_here_footer'
|
|
|
+ value='<?=$this->HereFooter?>'/></td></tr>
|
|
|
+
|
|
|
<tr><td class='smaller gray'> </td></tr>
|
|
|
<tr><td class='smaller gray'><?=$this->T('实验访问')?></td></tr>
|
|
|
- <tr><td><?=$this->T('主机')?><?=isset($this->ExpHost)?"<a href='?post=".$this->ExpHost."'>→</a>":""?></td>
|
|
|
+ <tr><td><?=$this->T('主机')?></td>
|
|
|
<td><input type="text" form="settings_form" id='settings_exp_host' name='settings_exp_host'
|
|
|
value='<?=$this->ExpHost?>'/></td></tr>
|
|
|
<tr><td><?=$this->T('网站标题')?></td>
|
|
@@ -4012,9 +4266,9 @@ blockquote{border-left:2px solid black;}
|
|
|
<tr><td><?=$this->T('首次提示')?><?=isset($this->ExpCaution)?"<a href='?post=".$this->ExpCaution."'>→</a>":""?></td>
|
|
|
<td><input type="text" form="settings_form" id='settings_exp_caution' name='settings_exp_caution'
|
|
|
value='<?=$this->ExpCaution?>'/></td></tr>
|
|
|
- <tr><td><?=$this->T('索引')?><?=isset($this->ExpIndex)?"<a href='?post=".$this->ExpIndex."'>→</a>":""?></td>
|
|
|
- <td><input type="text" form="settings_form" id='settings_exp_index' name='settings_exp_index'
|
|
|
- value='<?=$this->ExpIndex?>'/></td></tr>
|
|
|
+ <tr><td><?=$this->T('相册')?></td>
|
|
|
+ <td><input type="text" form="settings_form" id='settings_exp_album' name='settings_exp_album'
|
|
|
+ value='<?=$this->ExpAlbum?>'/></td></tr>
|
|
|
<tr><td><?=$this->T('导航栏')?>
|
|
|
<?=isset($this->ExpNavigation)?"<a href='?post=".$this->ExpNavigation."'>→</a>":""?></td>
|
|
|
<td><input type="text" form="settings_form" id='settings_exp_navigation' name='settings_exp_navigation'
|
|
@@ -4093,7 +4347,7 @@ blockquote{border-left:2px solid black;}
|
|
|
}
|
|
|
|
|
|
function MakeMainBegin(){?>
|
|
|
- <div class='main' <?php if(!$this->InExperimentalMode){ ?>
|
|
|
+ <div class='main' <?php if($this->LoggedIn && (!$this->InHereMode)){ ?>
|
|
|
ondrop="_dropHandler(event);" ondragover="_dragOverHandler(event);"<?php } ?>>
|
|
|
<?php
|
|
|
}
|
|
@@ -4103,17 +4357,14 @@ blockquote{border-left:2px solid black;}
|
|
|
}
|
|
|
|
|
|
function MakeExpFooter(){?>
|
|
|
- <div class='small_footer'>
|
|
|
- <hr />
|
|
|
- <b><?=$this->T($this->ExpTitle)?></b> ©<?=$this->T($this->DisplayName)?>
|
|
|
- </div>
|
|
|
- <div class='footer'>
|
|
|
- <div style='white-space:nowrap;'>
|
|
|
- <div class='footer_additional'>
|
|
|
- <?php if(isset($this->ExpFooter) && ($p = &$this->GetPost($this->ExpFooter,true))!=NULL){
|
|
|
- echo $this->GenerateSinglePost($p, false, false, false, false,$this->NULL_POST,false);
|
|
|
- } ?>
|
|
|
- </div>
|
|
|
+ <div class='small_footer exp_h_f exp_f'><div>
|
|
|
+ <b><?=$this->InExperimentalMode?$this->T($this->ExpTitle):$this->T($this->HereTitle)?></b> ©<?=$this->T($this->DisplayName)?>
|
|
|
+ <div class='wayback_link gray clean_a invert_a hidden_on_print'><br class="hidden_on_desktop" />
|
|
|
+ <?php if($this->InExperimentalMode && isset($this->ExpFooter) && ($p = &$this->GetPost($this->ExpFooter,true))!=NULL){
|
|
|
+ echo $this->GenerateSinglePost($p, false, false, false, false,$this->NULL_POST,false);
|
|
|
+ }else if($this->InHereMode && isset($this->HereFooter) && ($p = &$this->GetPost($this->HereFooter,true))!=NULL){
|
|
|
+ echo $this->GenerateSinglePost($p, false, false, false, false,$this->NULL_POST,false);
|
|
|
+ }?></div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div><!-- page -->
|
|
@@ -4141,6 +4392,7 @@ blockquote{border-left:2px solid black;}
|
|
|
<div class='lr_buttons'>←</div></a></div>
|
|
|
<div ><a id='next_image' class='image_nav_next img_btn_hidden' onclick="event.stopPropagation();">
|
|
|
<div class='lr_buttons'>→</div></a></div>
|
|
|
+ <div id='here_buttons'></div>
|
|
|
</div><?php } ?>
|
|
|
<div class='side_box_mobile_inner'>
|
|
|
<?php if(!$static){ ?>
|
|
@@ -4196,6 +4448,8 @@ blockquote{border-left:2px solid black;}
|
|
|
<?php }else{ ?><a href='<?=$this->GetRedirect()?>&set_wayback=false'><?=$this->T('回到当前日期')?></a><?php } ?>
|
|
|
<br class='hidden_on_desktop' /> - <a href='<?=$this->GetRedirect()?>&toggle_font=true'>
|
|
|
<?=$this->T('切换字体')?>: <?=$this->T($this->UseRemoteFont?"远程":"本地");?></a>
|
|
|
+ <br class='hidden_on_desktop' />
|
|
|
+ - <a rel="alternate" type="application/rss+xml" href="?rss=<?=$this->LanguageAppendix;?>" />RSS/Atom<sup><?=$this->LanguageAppendix;?></sup></a>
|
|
|
</div>
|
|
|
</div></div>
|
|
|
<div class='footer'>
|
|
@@ -4544,14 +4798,14 @@ blockquote{border-left:2px solid black;}
|
|
|
<?php } ?>
|
|
|
|
|
|
this_image = FindImage(imgsrc);
|
|
|
- if(this_image.dataset.prevsrc){
|
|
|
+ if(this_image&&this_image.dataset.prevsrc){
|
|
|
new_image = FindImage(this_image.dataset.prevsrc);
|
|
|
new_prev = new_image?new_image.dataset.prevsrc:null;
|
|
|
im = document.querySelector('#prev_image');
|
|
|
if(new_prev) {im.href='javascript:ShowBigImage("'+this_image.dataset.prevsrc+'",'+do_push+')';im.style.opacity='';}
|
|
|
else {im.style.opacity='0';im.removeAttribute("href");}
|
|
|
}
|
|
|
- if(this_image.dataset.nextsrc){
|
|
|
+ if(this_image&&this_image.dataset.nextsrc){
|
|
|
new_image = FindImage(this_image.dataset.nextsrc);
|
|
|
new_next = new_image?new_image.dataset.nextsrc:null;
|
|
|
im = document.querySelector('#next_image');
|
|
@@ -4569,10 +4823,10 @@ blockquote{border-left:2px solid black;}
|
|
|
product_form.action = window.location.href;
|
|
|
edit_form.action = window.location.href;
|
|
|
edit_new_name.value = imgsrc.split('.')[0];
|
|
|
- if(this_image.dataset.product){ product_link.value = this_image.dataset.product; }else{ product_link.value = ""; }
|
|
|
- if(this_image.dataset.parent){ edit_parent.value = this_image.dataset.parent; }else{ edit_parent.value = ""; }
|
|
|
+ if(this_image&&this_image.dataset.product){ product_link.value = this_image.dataset.product; }else{ product_link.value = ""; }
|
|
|
+ if(this_image&&this_image.dataset.parent){ edit_parent.value = this_image.dataset.parent; }else{ edit_parent.value = ""; }
|
|
|
<?php } ?>
|
|
|
- if(this_image.dataset.product){
|
|
|
+ if(this_image&&this_image.dataset.product){
|
|
|
purchase.style.display='';
|
|
|
href = this_image.dataset.product;
|
|
|
if(this_image.dataset.product.match('^[0-9]{14}$')){
|
|
@@ -4595,8 +4849,8 @@ blockquote{border-left:2px solid black;}
|
|
|
});
|
|
|
|
|
|
o = document.querySelector('#big_image_overlay');
|
|
|
- info = document.querySelector('#big_image_info');
|
|
|
- info.innerHTML="<?=$this->T('正在查询……')?>";
|
|
|
+ info = document.querySelector('#big_image_info');info.innerHTML="<?=$this->T('正在查询……')?>";
|
|
|
+ here = document.querySelector('#here_buttons');here.innerHTML='';
|
|
|
o.style.display="block";
|
|
|
ShowBackdrop(0.8);
|
|
|
var xhr = new XMLHttpRequest();
|
|
@@ -4609,10 +4863,14 @@ blockquote{border-left:2px solid black;}
|
|
|
content="<span class='small'><?=$this->T('该图片出现在')?> "+res[1]+" <?=$this->T('个帖子中')?></span>"+content;
|
|
|
}else{content="<span class='smaller gray'><?=$this->T('该图片未被引用')?></span>"+content;}
|
|
|
if(res = response.match(/<insert>([\s\S]*)<\/insert>/u)){
|
|
|
- content+="<div class='clean_a'>"+res[1]+"</div>";
|
|
|
- }
|
|
|
-
|
|
|
+ content+="<div class='clean_a'>"+res[1]+"</div>"; }
|
|
|
info.innerHTML=content;
|
|
|
+ if(res = response.match(/<here>([\s\S]*)<\/here>/u)){
|
|
|
+ here.innerHTML=res[1]; window.here_b=document.getElementsByClassName('here_btn');
|
|
|
+ if(window.here_b)for(b=0;b<window.here_b.length;b++) {
|
|
|
+ window.here_b[b].addEventListener('mousemove',DontHideImgBtn);
|
|
|
+ window.here_b[b].addEventListener('mouseover',DontHideImgBtn);}
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
xhr.open("GET", "index.php?image_info="+imgsrc+"", true);
|
|
@@ -4635,13 +4893,14 @@ blockquote{border-left:2px solid black;}
|
|
|
var hide_timeout;
|
|
|
function DontHideImgBtn(e){ clearTimeout(hide_timeout); e.stopPropagation(); }
|
|
|
function DelayHideImgBtn(e){
|
|
|
- lbtn.classList.remove('img_btn_hidden');
|
|
|
- rbtn.classList.remove('img_btn_hidden');
|
|
|
+ lbtn.classList.remove('img_btn_hidden'); rbtn.classList.remove('img_btn_hidden');
|
|
|
inq.classList.remove('img_btn_hidden');
|
|
|
+ if(window.here_b)for(b=0;b<window.here_b.length;b++){window.here_b[b].classList.remove('img_btn_hidden');}
|
|
|
clearTimeout(hide_timeout);
|
|
|
- hide_timeout = setTimeout(function(e1,e2,e3){e1.classList.add('img_btn_hidden');
|
|
|
- e2.classList.add('img_btn_hidden');
|
|
|
- e3.classList.add('img_btn_hidden');}, 1000, lbtn, rbtn, inq);
|
|
|
+ hide_timeout = setTimeout(function(e1,e2,e3,e4){e1.classList.add('img_btn_hidden');
|
|
|
+ e2.classList.add('img_btn_hidden');e3.classList.add('img_btn_hidden');
|
|
|
+ if(window.here_b)for(b=0;b<window.here_b.length;b++){
|
|
|
+ window.here_b[b].classList.add('img_btn_hidden');}}, 1000, lbtn, rbtn, inq);
|
|
|
}
|
|
|
lbtn.addEventListener('mousemove',DontHideImgBtn);lbtn.addEventListener('mouseover',DontHideImgBtn);
|
|
|
rbtn.addEventListener('mousemove',DontHideImgBtn);rbtn.addEventListener('mouseover',DontHideImgBtn);
|
|
@@ -4727,16 +4986,15 @@ blockquote{border-left:2px solid black;}
|
|
|
}
|
|
|
|
|
|
function DoIdentiyExperimental(){
|
|
|
- if(!isset($this->ExpHost) || $this->ExpHost=="") return;
|
|
|
- if(preg_match('/'.preg_quote($this->ExpHost).'/u', $_SERVER['HTTP_HOST'])){
|
|
|
- $this->InExperimentalMode=True;
|
|
|
+ if(isset($this->ExpHost) && $this->ExpHost && preg_match('/'.preg_quote($this->ExpHost).'/u', $_SERVER['HTTP_HOST'])){
|
|
|
+ $this->InExperimentalMode=True; $this->InHereMode=True;
|
|
|
}
|
|
|
- if(!$this->CurrentPostID && $this->InExperimentalMode){
|
|
|
- $this->CurrentPostID = $this->ExpIndex;
|
|
|
+ if(isset($this->HereHost) && $this->HereHost && preg_match('/'.preg_quote($this->HereHost).'/u', $_SERVER['HTTP_HOST'])){
|
|
|
+ $this->InHereMode=True;
|
|
|
}
|
|
|
}
|
|
|
function DoExperimentalTopLink($p){
|
|
|
- if($this->InExperimentalMode && $p){
|
|
|
+ if($this->InHereMode && $p){
|
|
|
if(isset($p['tid']) && $p['tid']['first']!=$p){
|
|
|
header('Location: ?post='.$p['tid']['first']['id']); exit();
|
|
|
}
|
|
@@ -4766,12 +5024,13 @@ $la->DoSiteRedirect();
|
|
|
|
|
|
$la->DoLogin();
|
|
|
|
|
|
+$la->SwitchLanguageAndFont();
|
|
|
+
|
|
|
$err = $la->ProcessRequest($message, $redirect);
|
|
|
$la->WriteAsNecessary();
|
|
|
|
|
|
$la->DoIdentiyExperimental();
|
|
|
|
|
|
-$la->SwitchLanguageAndFont();
|
|
|
$la->SwitchWayBackMode();
|
|
|
|
|
|
if($err){
|
|
@@ -4793,6 +5052,11 @@ if(isset($la->WayBack)){
|
|
|
$la->ReadArchive();
|
|
|
}
|
|
|
|
|
|
+$im = NULL;
|
|
|
+if(preg_match('/images\/(.*)/u',$la->HereID,$imname) && ($im = &$la->FindImage($imname[1]))){
|
|
|
+ if(!$la->CanShowImage($im)) { $im=NULL; }
|
|
|
+}
|
|
|
+
|
|
|
$p = &$la->GetPost($la->CurrentPostID);
|
|
|
if(!isset($p)){
|
|
|
$p = &$la->GetMergedPost($la->CurrentPostID);
|
|
@@ -4803,17 +5067,38 @@ else{ $la->DoExperimentalTopLink($p); }
|
|
|
|
|
|
if(isset($p)){ $la->ActualPostID = $p['id']; }
|
|
|
|
|
|
+if($la->PageType=='here' ||$la->PageType=='experimental'){
|
|
|
+ if($im){
|
|
|
+ $la->SetHereMainImage($im);
|
|
|
+ $la->RecordVisitedHere($im['name'],$im?$la->ImageTitle($im):NULL);
|
|
|
+ }else if($p){
|
|
|
+ $la->RecordVisitedHere($p['id'],NULL);
|
|
|
+ }else {
|
|
|
+ $im = &$la->GiveImageInHere(false);
|
|
|
+ if($im){
|
|
|
+ $la->SetHereMainImage($im);
|
|
|
+ $la->RecordVisitedHere($im['name'],$la->ImageTitle($im));
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
$la->MakeHeader($p);
|
|
|
$la->MakeMainBegin();
|
|
|
|
|
|
-if($la->PageType=='experimental'){
|
|
|
- if(!$la->MakeExperimentalConfirm()){
|
|
|
- if($p){
|
|
|
+if($la->PageType=='here' ||$la->PageType=='experimental'){
|
|
|
+ if(($la->PageType=='experimental' && (!$la->MakeExperimentalConfirm())) || $la->PageType=='here'){
|
|
|
+ if($im){
|
|
|
+ $la->MakeHereSection($im);
|
|
|
+ }else if($p){
|
|
|
$la->MakePostSectionExp($p);
|
|
|
$la->MakeLinkedPostsExp($p);
|
|
|
- }else{
|
|
|
- echo "<h2>".$la->T('未找到这个帖子')."</h2><p>".$_SERVER['REQUEST_URI'].
|
|
|
- "</p><p><a href='index.php'>".$la->T('返回首页')."</a></p><br />";
|
|
|
+ }else {
|
|
|
+ if($im){
|
|
|
+ $la->MakeHereSection($im);
|
|
|
+ }else{
|
|
|
+ echo "<h2>".$la->T('未找到这个帖子')."</h2><p>".$_SERVER['REQUEST_URI'].
|
|
|
+ "</p><p><a href='index.php'>".$la->T('返回首页')."</a></p><br />";
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
$la->MakeMainEnd();
|