|
@@ -577,6 +577,18 @@ tr:hover .post_menu_button{opacity:1;}
|
|
|
.left{display:inline-block;vertical-align:top;width:25%;padding-right:1.5em;padding-bottom:4rem;position:sticky;top:2em;
|
|
|
overflow:auto;max-height:calc(100vh - 2.6em);}
|
|
|
.center{display:inline-block;vertical-align:top;width:50%;overflow:visible;padding-bottom:4rem;}
|
|
|
+.center_slides{display:block;vertical-align:top;width:100%;overflow:visible;padding-bottom:4rem;font-size:5vmin;user-select:none;}
|
|
|
+.center_slides .print_column{display:table;position:fixed;top:0;right:0;left:0;bottom:0;width:100%;height:100%;z-index:90;}
|
|
|
+.center_slides .print_column .post{display:table-cell;vertical-align:middle;padding:5vmin !important;max-height:100vh;width:100vw;overflow:auto;}
|
|
|
+.center_slides .active_post{background-color:%white%;}.center_slides .post{background-color:%white%;}
|
|
|
+.center_slides .post_access{display:none;}
|
|
|
+.center_slides .post_menu_button{display:none !important;}
|
|
|
+.center_slides .post_width{display:block;vertical-align:middle;max-height:100vh;overflow-y:auto;overflow-x:hidden;width:100%;}
|
|
|
+.center_slides .linked_posts{display:none;}.center_slides .ref_compact{position:relative!important;display:block!important;}
|
|
|
+.slides_buttons{position:fixed;z-index:200;right:0.5rem;bottom:0.5rem;user-select:none;background-color:%white%aa;padding:0.5rem;font-family:monospace;}
|
|
|
+.slides_buttons a{text-decoration: none;}
|
|
|
+.center_slides .imd{text-align:center;pointer-events:none;}
|
|
|
+.imd_float{float:right;width:50% !important;clear:both;margin-left:0.5em !important;}
|
|
|
.center_wide{display:inline-block;vertical-align:top;width:75%;padding-left:0.3em;overflow:visible;padding-bottom:4rem;}
|
|
|
.center_full{display:inline-block;vertical-align:top;width:100%;overflow:visible;padding-bottom:4rem;}
|
|
|
.center_wide .p_thumb{height:12rem;margin:0;margin-right:1em;margin-bottom:1em;box-shadow:5px 5px 15px 2px black;}
|
|
@@ -589,8 +601,8 @@ input:checked~.linked_posts{display:none;}
|
|
|
.center_exp{display:block;width:80%;margin:0 auto;overflow:visible;padding-bottom:1em;}
|
|
|
.table_top{position:relative;left:calc(-50% - 0.45em);width:calc(200% + 0.6em);background:%white%;z-index:1;
|
|
|
box-shadow:0px 0px 2em 1em %white%;margin-top:2em;margin-bottom:2em;}
|
|
|
-textarea,input[type=text],input[type=password]{width:100%;display:block;font-family:inherit;max-height:60vh;font-size:inherit;}
|
|
|
-select,textarea,input[type=text],input[type=password]{background:none;border:none;border-bottom:1px solid %black%;color:%black%;}
|
|
|
+textarea,input[type=text],input[type=password]{font-family:monospace;width:100%;display:block;font-family:inherit;max-height:60vh;font-size:inherit;}
|
|
|
+select,textarea,input[type=text],input[type=password]{font-family:monospace;background:none;border:none;border-bottom:1px solid %black%;color:%black%;}
|
|
|
.text_highlight input{border-bottom:1px solid %white%;color:%white%;}
|
|
|
.button{background:none;border:none;font-family:inherit;color:%black%;font-size:inherit;font-weight:bold;}
|
|
|
.post{position:relative;scroll-margin:3.5em;}
|
|
@@ -1548,6 +1560,7 @@ blockquote{border-left:2px solid black;}
|
|
|
if(preg_match('/\{\s*WIDE\s*\}/imu',$first_post['content'],$m)){ $first_post['wide'] = true; }
|
|
|
if(preg_match('/\{\s*NO_TIME\s*\}/imu',$first_post['content'],$m)){ $first_post['no_time'] = true; }
|
|
|
if(preg_match('/\{\s*NO_TITLE\s*\}/imu',$first_post['content'],$m)){ $first_post['no_title'] = true; }
|
|
|
+ if(preg_match('/\{\s*SLIDES\s*\}/imu',$first_post['content'],$m)){ $first_post['slides'] = true; }
|
|
|
if(preg_match('/\{\s*HEADER\s+(.*?)\}/imu',$first_post['content'],$m)){ $first_post['header'] = trim($m[1]); }
|
|
|
if(preg_match('/\{\s*FOOTER\s+(.*?)\}/imu',$first_post['content'],$m)){ $first_post['footer'] = trim($m[1]); }
|
|
|
|
|
@@ -1556,6 +1569,7 @@ blockquote{border-left:2px solid black;}
|
|
|
if(isset($first_post['header'])) $th['header']=$first_post['header'];
|
|
|
if(isset($first_post['footer'])) $th['footer']=$first_post['footer'];
|
|
|
if(isset($first_post['no_time'])) $th['no_time']=$first_post['no_time'];
|
|
|
+ if(isset($first_post['slides'])) $th['slides']=$first_post['slides'];
|
|
|
if(isset($first_post['no_title'])) $th['no_title']=$first_post['no_title'];
|
|
|
if(preg_match('/\{\s*INTERESTING\s+(.*?)\}/imu',$first_post['content'],$m)){
|
|
|
$th['interesting'] = []; if(preg_match_all('/(\S+)(\s|$)/u',$m[1],$matches,PREG_SET_ORDER)){
|
|
@@ -2785,7 +2799,7 @@ blockquote{border-left:2px solid black;}
|
|
|
"$1$2$4 target='_blank'$5$6<sup>↗</sup>$7",$html);
|
|
|
$html = preg_replace("/<p>\s*\@.*?<\/p>/mu","",$html);
|
|
|
$html = preg_replace("/\{\s*(REVERSED|INTERESTING|HEADER|FOOTER)\s+(.*?)\}/imu","",$html);
|
|
|
- $html = preg_replace("/\{\s*(REVERSED|NO_TIME|NO_TITLE)\s*\}/imu","",$html);
|
|
|
+ $html = preg_replace("/\{\s*(REVERSED|NO_TIME|NO_TITLE|SLIDES)\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(
|
|
@@ -2794,11 +2808,13 @@ blockquote{border-left:2px solid black;}
|
|
|
if(isset($m[1])&&$m[1]&&$m[1][1]=='a'){ $height="";
|
|
|
if(preg_match("/([0-9]{1,2})em/u",$m[0],$hm)){$height=' style="height:'.$hm[1].'em;"';}
|
|
|
return "<a class='imbtn'".$height.substr($m[0],2); }
|
|
|
- $orig_src = $src = $m[5]; $keep = false; $original = false;
|
|
|
+ $orig_src = $src = $m[5]; $keep = false; $original = false; $float=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 (preg_match('/alt=[\'\"].*float.*[\'\"]/u',$m[3]) ||
|
|
|
+ preg_match('/alt=[\'\"].*float.*[\'\"]/u',$m[7])) { $keep=true;$original=true;$float=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; }
|
|
@@ -2813,14 +2829,15 @@ blockquote{border-left:2px solid black;}
|
|
|
$media_start = "<video controls".$dataset."><source src='"; $media_end="' type='".$im['video']."'></video";
|
|
|
$src = $orig_src; $dataset="";
|
|
|
}
|
|
|
+ $float_add=""; if($float){ $float_add=" imd_float"; }
|
|
|
if($this->InHereMode){
|
|
|
- $click = "<div class='imd'>"."<a href='?here=".$im['file']."' class='original_img'>".
|
|
|
+ $click = "<div class='imd$float_add'>"."<a href='?here=".$im['file']."' class='original_img'>".
|
|
|
$media_start.($original?$orig_src:$src).$media_end."></a></div>";
|
|
|
$ret=""; if($keep) { $ret = $click; }
|
|
|
else { $images[] = $click; }
|
|
|
return $ret;
|
|
|
}else{
|
|
|
- $click ="<div class='imd'><a href='?show_image={$im['name']}' target='_blank' onclick='event.preventDefault();'>".
|
|
|
+ $click ="<div class='imd$float_add'><a href='?show_image={$im['name']}' target='_blank' onclick='event.preventDefault();'>".
|
|
|
$media_start.($original?$orig_src:$src).$media_end.$dataset."></a></div>";
|
|
|
$images_noclick[]=$media_start.$src.$media_end.">"; $images_orig_src_list[]=$orig_src;
|
|
|
$ret = "";
|
|
@@ -3748,12 +3765,12 @@ blockquote{border-left:2px solid black;}
|
|
|
</div>
|
|
|
</div>
|
|
|
<?php }
|
|
|
- function MakePostSection(&$post){
|
|
|
- $this->Anchors = [];
|
|
|
+ function MakePostSection(&$post){ $is_thread = isset($post['tid']['count'])&&$post['tid']['count']>1;
|
|
|
+ $this->Anchors = []; if(isset($post['slides']) || ($is_thread&&isset($post['tid']['slides']))) $centerclass='center_slides'; else $centerclass='center';
|
|
|
if(isset($this->TagID)){ ?><style><?=$this->CssNumberID($this->TagID);?>{display:block;}</style><?php } ?>
|
|
|
- <div class='center' id='div_center'><br class='hidden_on_print' />
|
|
|
+ <div class='<?=$centerclass;?>' id='div_center'><br class='hidden_on_print' />
|
|
|
<h2 class='hidden_on_print'>
|
|
|
- <?php $th=NULL; $is_thread = isset($post['tid']['count'])&&$post['tid']['count']>1;
|
|
|
+ <?php $th=NULL;
|
|
|
$is_wide = (isset($post['wide'])&&$post['wide']) || ($is_thread && isset($post['tid']['wide']) && $post['tid']['wide']);
|
|
|
if($is_thread){ $th = $post['tid'];?> <?=$this->T('话题')?> <?php }else{ ?> <?=$this->T('详细')?>
|
|
|
<?php } ?></h2>
|
|
@@ -3808,7 +3825,58 @@ blockquote{border-left:2px solid black;}
|
|
|
$this->MakeCommentSection($post);
|
|
|
?>
|
|
|
</div>
|
|
|
- <?php
|
|
|
+ <?php if(isset($post['slides']) || ($is_thread&&isset($post['tid']['slides']))){ ?>
|
|
|
+ <div class='slides_buttons code' onclick="event.stopPropagation();">
|
|
|
+ <a onclick="SlidesFontCheck(-1)">T-</a> <a onclick="SlidesFontCheck(1)">T+</a>
|
|
|
+ <a onclick="SlidesStart(null)"><<</a> <a onclick="SlidesCheck(-1);"><</a>
|
|
|
+ <a onclick="SlidesStart(1)"><span id="slides_now">1</span>/<span id="slides_total">1</span></a>
|
|
|
+ <a onclick="SlidesCheck(1);">></a> <a onclick="SlidesEnd();">X</a>
|
|
|
+ </div>
|
|
|
+ <script>
|
|
|
+ function SlidesStart(from_here){
|
|
|
+ slides=document.querySelectorAll('.print_column > .post'); if(!slides || !slides[0]) return;
|
|
|
+ sdone=0; fp=0; if(from_here){
|
|
|
+ urlParams = new URLSearchParams(window.location.search);
|
|
|
+ fp = urlParams.get('post');
|
|
|
+ }
|
|
|
+ document.querySelector("#slides_total").innerText=slides.length; cur=document.querySelector("#slides_now");
|
|
|
+ for(i=0;i<slides.length;i++){ slides[i].style.display="none";
|
|
|
+ if(from_here && slides[i].dataset.postId==fp){ slides[i].style.display="table-cell";sdone=1; ClickPost(slides[i],0,true); cur.innerText=i+1; }
|
|
|
+ } if(!sdone){ slides[0].style.display="table-cell"; ClickPost(slides[0],0,true); cur.innerText=1; }
|
|
|
+ c=document.querySelector('.center'); if(!c) return;
|
|
|
+ c.classList.remove('center'); c.classList.add('center_slides'); if(c.dataset.fontSize){ c.style.fontSize=c.dataset.fontSize; }
|
|
|
+ c=document.querySelector('.left'); if(!c) return; c.style.display="none";
|
|
|
+ }
|
|
|
+ function SlidesCheck(offset){
|
|
|
+ slides=document.querySelectorAll('.print_column > .post'); if(!slides || !slides[0]) return; cur=document.querySelector("#slides_now");
|
|
|
+ for(i=0;i<slides.length;i++){ if(slides[i].style.display=="table-cell" && slides[i+offset] && (i+offset)>=0){
|
|
|
+ slides[i+offset].style.display="table-cell"; slides[i].style.display="none"; ClickPost(slides[i+offset],0,true); cur.innerText=i+offset+1; break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ function SlidesFontCheck(offset){
|
|
|
+ c=document.querySelector('.center_slides'); if(!c) return;
|
|
|
+ f=5; if(c.style.fontSize){ f=parseInt(c.style.fontSize); }
|
|
|
+ f+=offset; if(f<=0) f=1; if(f>12) f=12; c.style.fontSize=""+f+"vmin"; c.dataset.fontSize=c.style.fontSize;
|
|
|
+ }
|
|
|
+ function SlidesEnd(){
|
|
|
+ c=document.querySelector('.center_slides'); if(!c) return;
|
|
|
+ c.classList.remove('center_slides'); c.classList.add('center'); c.style.fontSize="";
|
|
|
+ c=document.querySelector('.left'); if(!c) return; c.style.display="inline-block";
|
|
|
+ slides=document.querySelectorAll('.print_column > .post'); if(!slides || !slides[0]) return;
|
|
|
+ for(i=0;i<slides.length;i++){ slides[i].style.display=""; }
|
|
|
+ }
|
|
|
+ //document.addEventListener("wheel", function(event){ if(event.deltaY>0) SlidesCheck(1); else SlidesCheck(-1); }, { passive: false });
|
|
|
+ document.addEventListener("click", function(event){ SlidesCheck(1); });
|
|
|
+ document.addEventListener('keydown', function(event) {
|
|
|
+ const key = event.key; // "ArrowRight", "ArrowLeft", "ArrowUp", or "ArrowDown"
|
|
|
+ switch(key){
|
|
|
+ case "ArrowUp": case "ArrowLeft": SlidesCheck(-1); break; case "ArrowDown": case "ArrowRight": SlidesCheck(1); break;
|
|
|
+ case "Escape": SlidesEnd(); break;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ </script>
|
|
|
+ <?php }
|
|
|
}
|
|
|
function MakePostSectionExp(&$post){
|
|
|
$this->Anchors = []; $is_thread = isset($post['tid']);
|
|
@@ -4750,7 +4818,7 @@ blockquote{border-left:2px solid black;}
|
|
|
</body>
|
|
|
</html>
|
|
|
<?php }
|
|
|
- function MakeFooter(&$p){ $no_title=isset($p['tid']['first']['no_title']);?>
|
|
|
+ function MakeFooter(&$p){ $is_slides=(isset($p['slides']) || (isset($p['tid'])&&isset($p['tid']['slides']))); $no_title=isset($p['tid']['first']['no_title']);?>
|
|
|
<div class='small_footer'><div>
|
|
|
<hr />
|
|
|
<?php if(isset($p['tid']['footer'])){ ?><div class='show_on_print'><?=$p['tid']['footer'];?></div><?php } ?>
|
|
@@ -4780,6 +4848,7 @@ blockquote{border-left:2px solid black;}
|
|
|
</div>
|
|
|
<?php $this->MakeImageOverlay(); $this->MakePageEnd(); ?>
|
|
|
<script>
|
|
|
+ <?php if($is_slides){ ?>SlidesStart(null);<?php } ?>
|
|
|
<?=$this->ExtraScripts?>
|
|
|
if(back = document.getElementById('button_back')){
|
|
|
if(document.referrer.indexOf(location.protocol + "//" + location.host) == 0){
|
|
@@ -4796,12 +4865,12 @@ blockquote{border-left:2px solid black;}
|
|
|
trans.href='https://translate.google.com/translate?sl=auto&tl=en-US&u='+encodeURIComponent(document.location.href);
|
|
|
}
|
|
|
function ClickPost(p,e,pushstate){if(e)e.preventDefault();
|
|
|
- id=p.dataset.postId; list=p.parentNode;active=list.getElementsByClassName('active_post');
|
|
|
- lp=p.querySelector('.lpctrl');
|
|
|
+ id=p.dataset.postId; if(!id)return; list=p.parentNode;active=list.getElementsByClassName('active_post');
|
|
|
if(active&&active[0]&&active[0]!=p){
|
|
|
if(pushstate){window.history.pushState('?post='+id,null,'?post='+id);}
|
|
|
active[0].classList.remove('active_post'); p.classList.add('active_post');
|
|
|
}
|
|
|
+ if(!active[0]){ window.location.href="?post="+id; }
|
|
|
}function InitLabel(){
|
|
|
lb=document.querySelector('#mtitle'); lb.removeAttribute('for'); lb.onclick=function()
|
|
|
{c=document.querySelector('#titlectrl');if(c.checked)c.checked=false;else c.checked=true;}
|
|
@@ -5045,11 +5114,12 @@ blockquote{border-left:2px solid black;}
|
|
|
var menus = document.querySelectorAll('.pop_menu');
|
|
|
[].forEach.call(menus, function(m){m.style.display='none';});
|
|
|
}
|
|
|
- var posts = document.querySelectorAll('.center .post');
|
|
|
+ var posts = document.querySelectorAll('.center .post'); if(!posts || !posts[0]) posts = document.querySelectorAll('.center_slides .post');
|
|
|
[].forEach.call(posts, function(p){
|
|
|
if(s=p.querySelector('._menu_hook')) s.addEventListener("click", function() {
|
|
|
ShowPostMenu(this.parentNode);ClickPost(this.parentNode,null,true)
|
|
|
});
|
|
|
+ p.addEventListener("dblclick", function(){ ClickPost(this,null,true); lp=this.querySelector('.lpctrl'); if(lp){ if(lp.checked)lp.checked=false;else lp.checked=true; }});
|
|
|
});
|
|
|
var post_clickables = document.querySelectorAll('.center .post a');
|
|
|
[].forEach.call(post_clickables, function(p){
|
|
@@ -5251,7 +5321,7 @@ blockquote{border-left:2px solid black;}
|
|
|
if(i<images_filtered.length-1) nextimg=images_filtered[i+1];
|
|
|
prevsrc=previmg?previmg.dataset.imgsrc:null; nextsrc=nextimg?nextimg.dataset.imgsrc:null;
|
|
|
img.dataset.prevsrc = prevsrc; img.dataset.nextsrc = nextsrc;
|
|
|
- function wrap(imgsrc){return function(){ShowBigImage(imgsrc, 1);}}
|
|
|
+ function wrap(imgsrc){return function(event){ShowBigImage(imgsrc, 1);}}
|
|
|
var clone = img.cloneNode(true); img.replaceWith(clone);
|
|
|
clone.addEventListener("click", wrap(img.dataset.imgsrc));
|
|
|
}
|