diff options
28 files changed, 0 insertions, 2923 deletions
diff --git a/blog/content/.htaccess b/blog/content/.htaccess deleted file mode 100644 index 93169e4..0000000 --- a/blog/content/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -Order deny,allow -Deny from all diff --git a/blog/content/util/indexer.cpp b/blog/content/util/indexer.cpp deleted file mode 100644 index b072633..0000000 --- a/blog/content/util/indexer.cpp +++ /dev/null @@ -1,48 +0,0 @@ -//filename title date tags -#include <dirent.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <cstdio> -#include <cstring> -#include <algorithm> -#include <functional> -#include <string> -#include <vector> -#define stripr(s) s[strlen(s)-1]=='\n'?s[strlen(s)-1]=0:0 -std::vector<std::string> fn; -char buf1[65536],buf2[65536],buf3[65536]; -int main() -{ - struct dirent* pd;DIR* pdir; - pdir=opendir("/var/www/html/blog/content"); - while((pd=readdir(pdir))!=NULL) - { - std::string s(pd->d_name); - if(s.length()<4)continue; - if(s.substr(s.length()-4)==".txt") - fn.push_back(s.substr(0,s.length()-4)); - } - closedir(pdir); - std::sort(fn.begin(),fn.end(),std::greater<std::string>()); - FILE *f,*rf; - f=fopen("/var/www/html/blog/content/pindex","w"); - for(size_t i=0;i<fn.size();++i) - { - puts(("/var/www/html/blog/content/"+fn[i]+".txt").c_str()); - struct stat st;struct tm* mt; - stat(("/var/www/html/blog/content/"+fn[i]+".txt").c_str(),&st); - mt=localtime(&st.st_mtime); - rf=fopen(("/var/www/html/blog/content/"+fn[i]+".txt").c_str(),"r"); - fgets(buf1,65536,rf);stripr(buf1); - fgets(buf2,65536,rf);stripr(buf2); - fgets(buf3,65536,rf);stripr(buf3); - if(strstr(buf2,"WIP")){puts(" SKIPPED");continue;} - fprintf(f,"%s\t",fn[i].c_str()); - fprintf(f,"%s\t",buf1); - fprintf(f,"%s/%d-%02d-%02d\t",buf2,mt->tm_year+1900,mt->tm_mon+1,mt->tm_mday); - fprintf(f,"%s\n",buf3); - fclose(rf); - } - fclose(f); -} diff --git a/blog/sbs_1/bloglist.php b/blog/sbs_1/bloglist.php deleted file mode 100644 index 32e59b7..0000000 --- a/blog/sbs_1/bloglist.php +++ /dev/null @@ -1,77 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT"> -<meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Chrisoft::Blog</title> - <link rel=stylesheet href='../common.css' type='text/css'> - <link rel=stylesheet href='extras.css' type='text/css'> - <script type="text/javascript"> -function ol() -{ -if( navigator.userAgent.match(/Android/i) - || navigator.userAgent.match(/webOS/i) - || navigator.userAgent.match(/iPhone/i) - || navigator.userAgent.match(/iPad/i) - || navigator.userAgent.match(/iPod/i) - || navigator.userAgent.match(/BlackBerry/i) - || navigator.userAgent.match(/Windows Phone/i) - ) - document.getElementById("tab").style.width="96%"; -} - </script> -</head> -<body onload="ol()"> - <table id="tab" border="0" style="width:70%;margin:auto;"> - <tr> - <td class="CTitle" style="font-size:2em;" colspan="2"> - <a href="../">Chrisoft</a>::Blog - </td> - </tr> - <tr> - <td class="TText" colspan="2" style="padding:10px;"> - <div style="font-size:200%">Deprecated. The new blog system is available <a href="/blog">here</a>.</div> - WARNING: You've entered the dangerous zone.<br> - I occasionally empty the trash in my brain here...<br> - Browse with care!<br> - Most posts are in Chinese... - </td> - </tr> - <tr><td class="TText" colspan="2"> - <?php - $files=scandir("/var/www/html/blog/content",1); - for($i=0,$c=count($files);$i<$c;$i++) - { - if(!(strstr($files[$i],"txt")))continue; - if(strstr($files[$i],"swp"))continue; - $fn=sprintf("/var/www/html/blog/content/%s",$files[$i]); - $handle=fopen($fn, "r"); - $title="";$date="";$tags=""; - if($handle) - { - $title=fgets($handle,4096); - $date=fgets($handle,4096); - $tags=fgets($handle,4096); - fclose($handle); - } - if(!strstr($tags,"devel")) - { - echo "<tr><td class=\"TText\" style=\"width:50%;\">"; - $cur=sprintf("<a href=\"./blogreader.php?p=%s\">%s</a>",substr($files[$i],0,strlen($files[$i])-4),$title); - echo $cur; - echo "</td><td class=\"TText\" style=\"width:50%;\">"; - echo $date; - echo "</td></tr>"; - } - } - ?> - </td></tr> - <tr> - <td class="TText" colspan="2" style="padding:10px;text-align:center;"> - Proudly powered by SBS <reduced>(the stupid blogging system)</reduced>.<br> - Content licensed under CC BY-SA 4.0. - </td> - </tr> - </table> -</body> diff --git a/blog/sbs_1/bloglista.php b/blog/sbs_1/bloglista.php deleted file mode 100644 index bb762b7..0000000 --- a/blog/sbs_1/bloglista.php +++ /dev/null @@ -1,202 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT"> - <title>Chrisoft::Blog</title> - <link rel=stylesheet href='../common.css' type='text/css'> - <link rel=stylesheet href='extras.css' type='text/css'> - <style type="text/css"> - div#button - { - display:table; - position:fixed; - top:50%; - margin-top:-3.5em; - width:4em; - height:7em; - text-align:center; - font-weight:bold; - background-color:rgba(255,204,255,0.5); - color:#EE8899; - } - div#button:hover - { - background-color:rgba(255,220,255,0.7); - color:#FF66CC; - } - </style> - <script type="text/javascript"> - var titles=[],dates=[],links=[],elems=[],oldelems=[],xs=[],ys=[]; - var numPost=5; - var startIdx=0; - var dragging=null; - var xp=0,yp=0,xe=0,ye=0; - function chk(tx,ty) - { - for(var i=0;i<xs.length;++i) - if(Math.hypot(tx-xs[i],ty-ys[i])<100)return 1; - return 0; - } - function dragInit(e) - { - dragging=e;xe=xp-dragging.offsetLeft;ye=yp-dragging.offsetTop; - e.style.transition="none"; - } - function onMove(e) - { - xp=document.all?window.event.clientX:e.pageX; - yp=document.all?window.event.clientY:e.pageY; - if(dragging!==null) - { - dragging.style.left=(xp-xe)+'px'; - dragging.style.top=(yp-ye)+'px'; - } - } - function initTile(obj,inv) - { - var t=0; - t=Math.random()*window.innerHeight; - obj.style.top=t.toString()+'px'; - t=window.innerWidth+Math.random()*window.innerWidth*0.7+window.innerWidth*0.1; - if(inv==1)t-=2*window.innerWidth; - obj.style.left=t.toString()+'px'; - t=Math.random()*360; - obj.style.transform='rotate('+t.toString()+'deg)'; - } - function launchTileIn(obj) - { - var tx=0,ty=0; - obj.style.transition="all 0.5s ease-out"; - do{ - tx=Math.random()*window.innerHeight*0.35+window.innerHeight*0.35; - ty=Math.random()*window.innerWidth*0.6+window.innerWidth*0.1; - }while(chk(tx,ty)==1); - obj.style.top=tx.toString()+'px'; - obj.style.left=ty.toString()+'px'; - xs.push(tx);ys.push(ty); - tx=Math.random()*90-45; - obj.style.transform='rotate('+tx.toString()+'deg)'; - } - function launchTileOut(obj,inv) - { - var t=0; - obj.style.transition="all 0.5s ease-in"; - t=Math.random()*window.innerHeight; - obj.style.top=t.toString()+'px'; - t=0-obj.offsetWidth-Math.random()*window.innerWidth; - if(inv==1)t=window.innerWidth-t; - obj.style.left=t.toString()+'px'; - t=Math.random()*90-45; - obj.style.transform='rotate('+t.toString()+'deg)'; - } - function createTile(id) - { - var e=document.createElement("table"); - e.className="TText"; - e.style.position="fixed"; - e.style.cursor="move"; - e.style.boxShadow="1px 1px 1px 1px #333333"; - e.innerHTML="<tr><td><a href=\""+links[id]+"\">"+titles[id]+"</a></td></tr><tr><td>"+dates[id]+"</td></tr>"; - e.onmousedown=function(){dragInit(e);return false;}; - elems.push(e); - document.getElementsByTagName("body")[0].appendChild(e); - return e; - } - function createGroup(inv) - { - xs.length=ys.length=0; - for(var i=0;i<numPost;++i) - { - if(startIdx+i>=titles.length)break; - var e=createTile(startIdx+i); - initTile(e,inv); - } - setTimeout( - function(){for(var i=0;i<elems.length;++i)launchTileIn(elems[i]);} - ,500); - } - function lastGroup() - { - if(startIdx-numPost<0)return; - oldelems=elems.slice(0);elems.length=0; - for(var i=0;i<oldelems.length;++i)launchTileOut(oldelems[i],1); - setTimeout( - function(){for(var i=0;i<oldelems.length;++i)oldelems[i].remove();} - ,500); - startIdx-=numPost; - createGroup(1); - } - function nextGroup() - { - if(startIdx+numPost>=titles.length)return; - oldelems=elems.slice(0);elems.length=0; - for(var i=0;i<oldelems.length;++i)launchTileOut(oldelems[i],0); - setTimeout( - function(){for(var i=0;i<oldelems.length;++i)oldelems[i].remove();} - ,500); - startIdx+=numPost; - createGroup(0); - } - function onWheel(e) - { - var wdelta=e.wheelDelta||-e.detail; - if(wdelta<0)nextGroup(); - if(wdelta>0)lastGroup(); - } - function init() - { - document.addEventListener("mousewheel",onWheel,false); - document.addEventListener("DOMMouseScroll",onWheel,false); - document.onmousemove=onMove; - document.onmouseup=function(){dragging=null;}; - createGroup(); - } - </script> -</head> -<body onload="init();"> - <table border="0" style="width:70%;margin:auto;"> - <tr> - <td class="CTitle" style="font-size:2em;" colspan="2"> - <a href="../">Chrisoft</a>::Blog - </td> - </tr> - <tr> - <td class="TText" colspan="2" style="padding:10px;"> - WARNING: You've entered the dangerous zone.<br> - I occasionally empty the trash in my brain here...<br> - Browse with care!<br> - Most posts are in Chinese... - </td> - </tr> - </table> - <div onmousedown="lastGroup();" id="button" style="left:0;"> - <span style="display:table-cell;vertical-align:middle;"><</span> - </div> - <div onmousedown="nextGroup();" id="button" style="right:0;"> - <span style="display:table-cell;vertical-align:middle;">></span> - </div> - <script type="text/javascript"> - <?php - $files=scandir("/var/www/html/blog/content",1); - for($i=0,$c=count($files);$i<$c;$i++) - { - if(!(strstr($files[$i],"txt")))continue; - if(strstr($files[$i],"swp"))continue; - $fn=sprintf("/var/www/html/blog/content/%s",$files[$i]); - $handle=fopen($fn, "r"); - $title="";$date=""; - if($handle) - { - $title=fgets($handle,4096); - $date=fgets($handle,4096); - fclose($handle); - } - $title=substr($title,0,strlen($title)-1); - $date=substr($date,0,strlen($date)-1); - $cur=sprintf("links.push(\"./blogreader.php?p=%s\");titles.push(\"%s\");dates.push(\"%s\");\n",substr($files[$i],0,strlen($files[$i])-4),$title,$date); - echo $cur; - } - ?> - </script> -</body> diff --git a/blog/sbs_1/blogreader.php b/blog/sbs_1/blogreader.php deleted file mode 100644 index 5f55cc7..0000000 --- a/blog/sbs_1/blogreader.php +++ /dev/null @@ -1,90 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT"> -<meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Chrisoft::Blog</title> - <link rel=stylesheet href='../common.css' type='text/css'> - <link rel=stylesheet href='extras.css' type='text/css'> - <script type="text/javascript" src="footnoter.js"></script> - <script type="text/javascript" src="decryptor.js"></script> - <script type="text/javascript"> -function ol() -{ -if( navigator.userAgent.match(/Android/i) - || navigator.userAgent.match(/webOS/i) - || navigator.userAgent.match(/iPhone/i) - || navigator.userAgent.match(/iPad/i) - || navigator.userAgent.match(/iPod/i) - || navigator.userAgent.match(/BlackBerry/i) - || navigator.userAgent.match(/Windows Phone/i) - ) - document.getElementById("tab").style.width="96%"; - footnoter(); -} - </script> -</head> -<body onload="ol()"> - <table id="tab" border="0" style="width:70%;margin:auto;"> - <tr> - <td class="CTitle" style="font-size:2em;"> - <a href="../">Chrisoft</a>::<a href="./bloglist.php">Blog</a> - </td> - </tr> - <tr> - <td class="TText"> - <?php - require_once("simple_html_dom.php"); - $path=sprintf("/var/www/html/blog/content/%s.txt",$_GET["p"]); - $file=fopen($path,"r"); - if(!$file) - {echo "Invalid parameter...";exit;} - $str=fgets($file,4096); - echo "<div style=\"text-align:center;font-size:1.7em\">".$str."</div><br>"; - $str=fgets($file,4096); - echo "<div style=\"text-align:center;\">".$str."</div><br>"; - $str=fgets($file,4096); - $str=fread($file,262144); - $html=str_get_html($str); - $encrypted=$html->find("encrypted"); - for($i=0;$i<count($encrypted);++$i) - { - $key=$html->find("encrypted",$i)->key; - $html->find("encrypted",$i)->key=null; - $cont=$html->find("encrypted",$i)->innertext; - $html->find("encrypted",$i)->innertext="Encrypted content here. Click <a href=\"javascript:void(0)\" onclick=\"decryptui(".$i.")\">here</a> to decrypt."; - $contarr=str_split($cont); - $lcont=count($contarr); - $keyarr=str_split($key); - $lkey=count($keyarr); - $hash=5381; - for($j=0;$j<$lcont;++$j) - { - $hash=(($hash<<5)+$hash)+ord($contarr[$j]); - $hash&=0xFFFFFFFF; - $contarr[$j]^=$keyarr[$j%$lkey]; - } - $retstr=''; - array_walk($contarr,function($value)use(&$retstr){$retstr.=chr(ord($value));}); - $html->find("encrypted",$i)->encont=base64_encode($retstr); - $html->find("encrypted",$i)->hash=$hash; - $html->find("encrypted",$i)->id="encrypted".$i; - } - echo $html; - fclose($file); - ?> - </td> - </tr> - <tr><td><hr><reduced id="notediv"></reduced></td></tr> - </table> - <div id="decryptui" style="display:none;opacity:0;color:white;z-index:10;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;"> - <div class="TText" style="padding:20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);"> - <span id="keyhint"></span><br><br> - Key: <input id="keyinp" type="text"><br><br> - <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button> - <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button> - </form> - </div> - </body> -</html> diff --git a/blog/sbs_1/blossom.png b/blog/sbs_1/blossom.png Binary files differdeleted file mode 100644 index 6f2c304..0000000 --- a/blog/sbs_1/blossom.png +++ /dev/null diff --git a/blog/sbs_1/dbloglist.php b/blog/sbs_1/dbloglist.php deleted file mode 100644 index c2bd137..0000000 --- a/blog/sbs_1/dbloglist.php +++ /dev/null @@ -1,75 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT"> -<meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Chrisoft::Development Blog</title> - <link rel=stylesheet href='../common.css' type='text/css'> - <link rel=stylesheet href='extras.css' type='text/css'> - <script type="text/javascript"> -function ol() -{ -if( navigator.userAgent.match(/Android/i) - || navigator.userAgent.match(/webOS/i) - || navigator.userAgent.match(/iPhone/i) - || navigator.userAgent.match(/iPad/i) - || navigator.userAgent.match(/iPod/i) - || navigator.userAgent.match(/BlackBerry/i) - || navigator.userAgent.match(/Windows Phone/i) - ) - document.getElementById("tab").style.width="96%"; -} - </script> -</head> -<body onload="ol()"> - <table id="tab" border="0" style="width:70%;margin:auto;"> - <tr> - <td class="CTitle" style="font-size:2em;" colspan="2"> - <a href="../">Chrisoft</a>::Development Blog - </td> - </tr> - <tr> - <td class="TText" colspan="2" style="padding:10px;"> - <div style="font-size:200%">Deprecated. The new blog system is available <a href="/blog">here</a>.</div> - Development blog.<br> - Most posts here are in English... - </td> - </tr> - <tr><td class="TText" colspan="2"> - <?php - $files=scandir("/var/www/html/blog/content",1); - for($i=0,$c=count($files);$i<$c;$i++) - { - if(!(strstr($files[$i],"txt")))continue; - if(strstr($files[$i],"swp"))continue; - $fn=sprintf("/var/www/html/blog/content/%s",$files[$i]); - $handle=fopen($fn, "r"); - $title="";$date="";$tags=""; - if($handle) - { - $title=fgets($handle,4096); - $date=fgets($handle,4096); - $tags=fgets($handle,4096); - fclose($handle); - } - if(strstr($tags,"devel")) - { - echo "<tr><td class=\"TText\" style=\"width:50%;\">"; - $cur=sprintf("<a href=\"./dblogreader.php?p=%s\">%s</a>",substr($files[$i],0,strlen($files[$i])-4),$title); - echo $cur; - echo "</td><td class=\"TText\" style=\"width:50%;\">"; - echo $date; - echo "</td></tr>"; - } - } - ?> - </td></tr> - <tr> - <td class="TText" colspan="2" style="padding:10px;text-align:center;"> - Proudly powered by SBS <reduced>(the stupid blogging system)</reduced>.<br> - Content licensed under CC BY-SA 4.0. - </td> - </tr> - </table> -</body> diff --git a/blog/sbs_1/dblogreader.php b/blog/sbs_1/dblogreader.php deleted file mode 100644 index d252c19..0000000 --- a/blog/sbs_1/dblogreader.php +++ /dev/null @@ -1,90 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT"> -<meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Chrisoft::Development Blog</title> - <link rel=stylesheet href='../common.css' type='text/css'> - <link rel=stylesheet href='extras.css' type='text/css'> - <script type="text/javascript" src="footnoter.js"></script> - <script type="text/javascript" src="decryptor.js"></script> - <script type="text/javascript"> -function ol() -{ -if( navigator.userAgent.match(/Android/i) - || navigator.userAgent.match(/webOS/i) - || navigator.userAgent.match(/iPhone/i) - || navigator.userAgent.match(/iPad/i) - || navigator.userAgent.match(/iPod/i) - || navigator.userAgent.match(/BlackBerry/i) - || navigator.userAgent.match(/Windows Phone/i) - ) - document.getElementById("tab").style.width="96%"; - footnoter(); -} - </script> -</head> -<body onload="ol()"> - <table id="tab" border="0" style="width:70%;margin:auto;"> - <tr> - <td class="CTitle" style="font-size:2em;"> - <a href="../">Chrisoft</a>::<a href="./dbloglist.php">Development Blog</a> - </td> - </tr> - <tr> - <td class="TText"> - <?php - require_once("simple_html_dom.php"); - $path=sprintf("/var/www/html/blog/content/%s.txt",$_GET["p"]); - $file=fopen($path,"r"); - if(!$file) - {echo "Invalid parameter...";exit;} - $str=fgets($file,4096); - echo "<div style=\"text-align:center;font-size:1.7em\">".$str."</div><br>"; - $str=fgets($file,4096); - echo "<div style=\"text-align:center;\">".$str."</div><br>"; - $str=fgets($file,4096); - $str=fread($file,262144); - $html=str_get_html($str); - $encrypted=$html->find("encrypted"); - for($i=0;$i<count($encrypted);++$i) - { - $key=$html->find("encrypted",$i)->key; - $html->find("encrypted",$i)->key=null; - $cont=$html->find("encrypted",$i)->innertext; - $html->find("encrypted",$i)->innertext="Encrypted content here. Click <a href=\"javascript:void(0)\" onclick=\"decryptui(".$i.")\">here</a> to decrypt."; - $contarr=str_split($cont); - $lcont=count($contarr); - $keyarr=str_split($key); - $lkey=count($keyarr); - $hash=5381; - for($j=0;$j<$lcont;++$j) - { - $hash=(($hash<<5)+$hash)+ord($contarr[$j]); - $hash&=0xFFFFFFFF; - $contarr[$j]^=$keyarr[$j%$lkey]; - } - $retstr=''; - array_walk($contarr,function($value)use(&$retstr){$retstr.=chr(ord($value));}); - $html->find("encrypted",$i)->encont=base64_encode($retstr); - $html->find("encrypted",$i)->hash=$hash; - $html->find("encrypted",$i)->id="encrypted".$i; - } - echo $html; - fclose($file); - ?> - </td> - </tr> - <tr><td><hr><reduced id="notediv"></reduced></td></tr> - </table> - <div id="decryptui" style="display:none;opacity:0;color:white;z-index:10;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;"> - <div class="TText" style="padding:20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);"> - <span id="keyhint"></span><br><br> - Key: <input id="keyinp" type="text"><br><br> - <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button> - <button onclick="hidedecryptui();">Cancel</button> - </form> - </div> - </body> -</html> diff --git a/blog/sbs_1/decryptor.js b/blog/sbs_1/decryptor.js deleted file mode 100644 index dcd64e3..0000000 --- a/blog/sbs_1/decryptor.js +++ /dev/null @@ -1,73 +0,0 @@ -//License: Expat(MIT) -//Chrisoft Xiong 2017 -// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt -function Utf8ArrayToStr(array){ - var out,i,len,c; - var char2,char3; - out=""; - len=array.length; - i=0; - while(i<len){ - c=array[i++]; - switch(c>>4) - { - case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7: - // 0xxxxxxx - out+=String.fromCharCode(c); - break; - case 12:case 13: - // 110x xxxx 10xx xxxx - char2=array[i++]; - out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F)); - break; - case 14: - // 1110 xxxx 10xx xxxx 10xx xxxx - char2=array[i++]; - char3=array[i++]; - out+=String.fromCharCode(((c&0x0F)<<12)| - ((char2&0x3F)<<6)| - ((char3&0x3F)<<0)); - break; - } - } - return out; -} -var decid; -function decryptui(id) -{ - document.getElementById("decryptui").style.display="block"; - document.getElementById("keyinp").focus(); - setTimeout(function(){document.getElementById("decryptui").style.opacity="1";},20); - decid=id; - document.getElementById("keyhint").innerHTML="Hint: "+document.getElementById("encrypted"+id).getAttribute("hint"); - document.getElementById("keyinp").onkeypress=function(e){if(e.keyCode==13)document.getElementById('btndecrypt').click();} -} -function hidedecryptui() -{ - document.getElementById("decryptui").style.opacity="0"; - setTimeout(function(){ - document.getElementById("decryptui").style.display="none"; - document.getElementById("keyinp").value=""; - },500); -} -function decryptor(id,key) -{ - var e=document.getElementById("encrypted"+id); - var cont=e.getAttribute("encont"); - var bc=atob(cont); - var b=new Array(bc.length); - for(var i=0;i<bc.length;++i)b[i]=bc.charCodeAt(i); - var lkey=key.length; - var u8arr=new Uint8Array(b); - var hash=5381; - for(var i=0;i<u8arr.length;++i){u8arr[i]^=key.charCodeAt(i%lkey);hash=(hash*33)+u8arr[i];hash%=4294967296;} - if(hash!=parseInt(e.getAttribute("hash"))) - { - alert("The decryption key you have entered could be wrong, please try again."); - return; - } - //e.innerHTML=new TextDecoder("utf-8").decode(u8arr); - e.innerHTML=Utf8ArrayToStr(u8arr); - footnoter(); - hidedecryptui(); -} diff --git a/blog/sbs_1/extras.css b/blog/sbs_1/extras.css deleted file mode 100644 index 6409ebe..0000000 --- a/blog/sbs_1/extras.css +++ /dev/null @@ -1,50 +0,0 @@ -.CTitle { - color: #fff; -} -.TText { - color: #fff; -} -body { - background: #000; - background-image: url(blossom.png); -} -table { - background: rgba(0,0,0,0.8); -} -p { - text-indent: 2em; -} -note, .note { - vertical-align: super; - font-size: 60%; -} -reduced, .reduced { - font-size: 75%; -} -blockquote { - padding: 1em; - margin-left:4em;margin-right:4em; -} -enlarged, .enlarged { - font-size: 125%; -} -button { - border:none; - color:white; - padding:0.5em 2em; - text-align:center; - background-color:#C6C; - -webkit-transition-duration:0.4s; - transition-duration:0.4s; -} -button:hover { - background-color:#E9E; -} -input { - border: none; - border-bottom: 2px solid #C6C; - outline: none !important; - background-color: rgba(0,0,0,0) !important; - color: white; -} - diff --git a/blog/sbs_1/footnoter.js b/blog/sbs_1/footnoter.js deleted file mode 100644 index a1b2d8b..0000000 --- a/blog/sbs_1/footnoter.js +++ /dev/null @@ -1,24 +0,0 @@ -//License: MIT -//Chrisoft Xiong 2017 -var starting=0; -function footnoter() -{ - var footnotes=document.body.getElementsByTagName("footnote"); - for(var i=0;i<footnotes.length;++i) - { - var s=footnotes[i].innerHTML; - footnotes[i].innerHTML="";//IE is stupid - var a=document.createElement("a"); - a.setAttribute("id","n"+(starting+i+1)); - a.setAttribute("href","#note"+(starting+i+1)); - a.setAttribute("class","note"); - a.innerHTML="["+(starting+i+1)+"]"; - footnotes[i].parentNode.insertBefore(a,footnotes[i]); - var span=document.createElement("span"); - span.setAttribute("class","TText"); - span.innerHTML="<a id=\"note"+(starting+i+1)+"\" href=\"#n"+(starting+i+1)+"\">["+(starting+i+1)+"]</a>: "+s+"<br>"; - document.getElementById("notediv").appendChild(span); - } - starting+=footnotes.length; - while(footnotes.length)footnotes[0].remove(); -} diff --git a/blog/sbs_1/simple_html_dom.php b/blog/sbs_1/simple_html_dom.php deleted file mode 100644 index 19e5f66..0000000 --- a/blog/sbs_1/simple_html_dom.php +++ /dev/null @@ -1,975 +0,0 @@ -<?php -/******************************************************************************* -Version: 1.11 ($Rev: 175 $) -Website: http://sourceforge.net/projects/simplehtmldom/ -Author: S.C. Chen <me578022@gmail.com> -Acknowledge: Jose Solorzano (https://sourceforge.net/projects/php-html/) -Contributions by: - Yousuke Kumakura (Attribute filters) - Vadim Voituk (Negative indexes supports of "find" method) - Antcs (Constructor with automatically load contents either text or file/url) -Licensed under The MIT License -Redistributions of files must retain the above copyright notice. -*******************************************************************************/ - -define('HDOM_TYPE_ELEMENT', 1); -define('HDOM_TYPE_COMMENT', 2); -define('HDOM_TYPE_TEXT', 3); -define('HDOM_TYPE_ENDTAG', 4); -define('HDOM_TYPE_ROOT', 5); -define('HDOM_TYPE_UNKNOWN', 6); -define('HDOM_QUOTE_DOUBLE', 0); -define('HDOM_QUOTE_SINGLE', 1); -define('HDOM_QUOTE_NO', 3); -define('HDOM_INFO_BEGIN', 0); -define('HDOM_INFO_END', 1); -define('HDOM_INFO_QUOTE', 2); -define('HDOM_INFO_SPACE', 3); -define('HDOM_INFO_TEXT', 4); -define('HDOM_INFO_INNER', 5); -define('HDOM_INFO_OUTER', 6); -define('HDOM_INFO_ENDSPACE',7); - -// helper functions -// ----------------------------------------------------------------------------- -// get html dom form file -function file_get_html() { - $dom = new simple_html_dom; - $args = func_get_args(); - $dom->load(call_user_func_array('file_get_contents', $args), true); - return $dom; -} - -// get html dom form string -function str_get_html($str, $lowercase=true) { - $dom = new simple_html_dom; - $dom->load($str, $lowercase); - return $dom; -} - -// dump html dom tree -function dump_html_tree($node, $show_attr=true, $deep=0) { - $lead = str_repeat(' ', $deep); - echo $lead.$node->tag; - if ($show_attr && count($node->attr)>0) { - echo '('; - foreach($node->attr as $k=>$v) - echo "[$k]=>\"".$node->$k.'", '; - echo ')'; - } - echo "\n"; - - foreach($node->nodes as $c) - dump_html_tree($c, $show_attr, $deep+1); -} - -// get dom form file (deprecated) -function file_get_dom() { - $dom = new simple_html_dom; - $args = func_get_args(); - $dom->load(call_user_func_array('file_get_contents', $args), true); - return $dom; -} - -// get dom form string (deprecated) -function str_get_dom($str, $lowercase=true) { - $dom = new simple_html_dom; - $dom->load($str, $lowercase); - return $dom; -} - -// simple html dom node -// ----------------------------------------------------------------------------- -class simple_html_dom_node { - public $nodetype = HDOM_TYPE_TEXT; - public $tag = 'text'; - public $attr = array(); - public $children = array(); - public $nodes = array(); - public $parent = null; - public $_ = array(); - private $dom = null; - - function __construct($dom) { - $this->dom = $dom; - $dom->nodes[] = $this; - } - - function __destruct() { - $this->clear(); - } - - function __toString() { - return $this->outertext(); - } - - // clean up memory due to php5 circular references memory leak... - function clear() { - $this->dom = null; - $this->nodes = null; - $this->parent = null; - $this->children = null; - } - - // dump node's tree - function dump($show_attr=true) { - dump_html_tree($this, $show_attr); - } - - // returns the parent of node - function parent() { - return $this->parent; - } - - // returns children of node - function children($idx=-1) { - if ($idx===-1) return $this->children; - if (isset($this->children[$idx])) return $this->children[$idx]; - return null; - } - - // returns the first child of node - function first_child() { - if (count($this->children)>0) return $this->children[0]; - return null; - } - - // returns the last child of node - function last_child() { - if (($count=count($this->children))>0) return $this->children[$count-1]; - return null; - } - - // returns the next sibling of node - function next_sibling() { - if ($this->parent===null) return null; - $idx = 0; - $count = count($this->parent->children); - while ($idx<$count && $this!==$this->parent->children[$idx]) - ++$idx; - if (++$idx>=$count) return null; - return $this->parent->children[$idx]; - } - - // returns the previous sibling of node - function prev_sibling() { - if ($this->parent===null) return null; - $idx = 0; - $count = count($this->parent->children); - while ($idx<$count && $this!==$this->parent->children[$idx]) - ++$idx; - if (--$idx<0) return null; - return $this->parent->children[$idx]; - } - - // get dom node's inner html - function innertext() { - if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER]; - if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); - - $ret = ''; - foreach($this->nodes as $n) - $ret .= $n->outertext(); - return $ret; - } - - // get dom node's outer text (with tag) - function outertext() { - if ($this->tag==='root') return $this->innertext(); - - // trigger callback - if ($this->dom->callback!==null) - call_user_func_array($this->dom->callback, array($this)); - - if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER]; - if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); - - // render begin tag - $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup(); - - // render inner text - if (isset($this->_[HDOM_INFO_INNER])) - $ret .= $this->_[HDOM_INFO_INNER]; - else { - foreach($this->nodes as $n) - $ret .= $n->outertext(); - } - - // render end tag - if(isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0) - $ret .= '</'.$this->tag.'>'; - return $ret; - } - - // get dom node's plain text - function text() { - if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER]; - switch ($this->nodetype) { - case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); - case HDOM_TYPE_COMMENT: return ''; - case HDOM_TYPE_UNKNOWN: return ''; - } - if (strcasecmp($this->tag, 'script')===0) return ''; - if (strcasecmp($this->tag, 'style')===0) return ''; - - $ret = ''; - foreach($this->nodes as $n) - $ret .= $n->text(); - return $ret; - } - - function xmltext() { - $ret = $this->innertext(); - $ret = str_ireplace('<![CDATA[', '', $ret); - $ret = str_replace(']]>', '', $ret); - return $ret; - } - - // build node's text with tag - function makeup() { - // text, comment, unknown - if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); - - $ret = '<'.$this->tag; - $i = -1; - - foreach($this->attr as $key=>$val) { - ++$i; - - // skip removed attribute - if ($val===null || $val===false) - continue; - - $ret .= $this->_[HDOM_INFO_SPACE][$i][0]; - //no value attr: nowrap, checked selected... - if ($val===true) - $ret .= $key; - else { - switch($this->_[HDOM_INFO_QUOTE][$i]) { - case HDOM_QUOTE_DOUBLE: $quote = '"'; break; - case HDOM_QUOTE_SINGLE: $quote = '\''; break; - default: $quote = ''; - } - $ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote; - } - } - $ret = $this->dom->restore_noise($ret); - return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>'; - } - - // find elements by css selector - function find($selector, $idx=null) { - $selectors = $this->parse_selector($selector); - if (($count=count($selectors))===0) return array(); - $found_keys = array(); - - // find each selector - for ($c=0; $c<$count; ++$c) { - if (($levle=count($selectors[0]))===0) return array(); - if (!isset($this->_[HDOM_INFO_BEGIN])) return array(); - - $head = array($this->_[HDOM_INFO_BEGIN]=>1); - - // handle descendant selectors, no recursive! - for ($l=0; $l<$levle; ++$l) { - $ret = array(); - foreach($head as $k=>$v) { - $n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k]; - $n->seek($selectors[$c][$l], $ret); - } - $head = $ret; - } - - foreach($head as $k=>$v) { - if (!isset($found_keys[$k])) - $found_keys[$k] = 1; - } - } - - // sort keys - ksort($found_keys); - - $found = array(); - foreach($found_keys as $k=>$v) - $found[] = $this->dom->nodes[$k]; - - // return nth-element or array - if (is_null($idx)) return $found; - else if ($idx<0) $idx = count($found) + $idx; - return (isset($found[$idx])) ? $found[$idx] : null; - } - - // seek for given conditions - protected function seek($selector, &$ret) { - list($tag, $key, $val, $exp, $no_key) = $selector; - - // xpath index - if ($tag && $key && is_numeric($key)) { - $count = 0; - foreach ($this->children as $c) { - if ($tag==='*' || $tag===$c->tag) { - if (++$count==$key) { - $ret[$c->_[HDOM_INFO_BEGIN]] = 1; - return; - } - } - } - return; - } - - $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0; - if ($end==0) { - $parent = $this->parent; - while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) { - $end -= 1; - $parent = $parent->parent; - } - $end += $parent->_[HDOM_INFO_END]; - } - - for($i=$this->_[HDOM_INFO_BEGIN]+1; $i<$end; ++$i) { - $node = $this->dom->nodes[$i]; - $pass = true; - - if ($tag==='*' && !$key) { - if (in_array($node, $this->children, true)) - $ret[$i] = 1; - continue; - } - - // compare tag - if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;} - // compare key - if ($pass && $key) { - if ($no_key) { - if (isset($node->attr[$key])) $pass=false; - } - else if (!isset($node->attr[$key])) $pass=false; - } - // compare value - if ($pass && $key && $val && $val!=='*') { - $check = $this->match($exp, $val, $node->attr[$key]); - // handle multiple class - if (!$check && strcasecmp($key, 'class')===0) { - foreach(explode(' ',$node->attr[$key]) as $k) { - $check = $this->match($exp, $val, $k); - if ($check) break; - } - } - if (!$check) $pass = false; - } - if ($pass) $ret[$i] = 1; - unset($node); - } - } - - protected function match($exp, $pattern, $value) { - switch ($exp) { - case '=': - return ($value===$pattern); - case '!=': - return ($value!==$pattern); - case '^=': - return preg_match("/^".preg_quote($pattern,'/')."/", $value); - case '$=': - return preg_match("/".preg_quote($pattern,'/')."$/", $value); - case '*=': - if ($pattern[0]=='/') - return preg_match($pattern, $value); - return preg_match("/".$pattern."/i", $value); - } - return false; - } - - protected function parse_selector($selector_string) { - // pattern of CSS selectors, modified from mootools - $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is"; - preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER); - $selectors = array(); - $result = array(); - //print_r($matches); - - foreach ($matches as $m) { - $m[0] = trim($m[0]); - if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue; - // for borwser grnreated xpath - if ($m[1]==='tbody') continue; - - list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false); - if(!empty($m[2])) {$key='id'; $val=$m[2];} - if(!empty($m[3])) {$key='class'; $val=$m[3];} - if(!empty($m[4])) {$key=$m[4];} - if(!empty($m[5])) {$exp=$m[5];} - if(!empty($m[6])) {$val=$m[6];} - - // convert to lowercase - if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);} - //elements that do NOT have the specified attribute - if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;} - - $result[] = array($tag, $key, $val, $exp, $no_key); - if (trim($m[7])===',') { - $selectors[] = $result; - $result = array(); - } - } - if (count($result)>0) - $selectors[] = $result; - return $selectors; - } - - function __get($name) { - if (isset($this->attr[$name])) return $this->attr[$name]; - switch($name) { - case 'outertext': return $this->outertext(); - case 'innertext': return $this->innertext(); - case 'plaintext': return $this->text(); - case 'xmltext': return $this->xmltext(); - default: return array_key_exists($name, $this->attr); - } - } - - function __set($name, $value) { - switch($name) { - case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value; - case 'innertext': - if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value; - return $this->_[HDOM_INFO_INNER] = $value; - } - if (!isset($this->attr[$name])) { - $this->_[HDOM_INFO_SPACE][] = array(' ', '', ''); - $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE; - } - $this->attr[$name] = $value; - } - - function __isset($name) { - switch($name) { - case 'outertext': return true; - case 'innertext': return true; - case 'plaintext': return true; - } - //no value attr: nowrap, checked selected... - return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]); - } - - function __unset($name) { - if (isset($this->attr[$name])) - unset($this->attr[$name]); - } - - // camel naming conventions - function getAllAttributes() {return $this->attr;} - function getAttribute($name) {return $this->__get($name);} - function setAttribute($name, $value) {$this->__set($name, $value);} - function hasAttribute($name) {return $this->__isset($name);} - function removeAttribute($name) {$this->__set($name, null);} - function getElementById($id) {return $this->find("#$id", 0);} - function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);} - function getElementByTagName($name) {return $this->find($name, 0);} - function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);} - function parentNode() {return $this->parent();} - function childNodes($idx=-1) {return $this->children($idx);} - function firstChild() {return $this->first_child();} - function lastChild() {return $this->last_child();} - function nextSibling() {return $this->next_sibling();} - function previousSibling() {return $this->prev_sibling();} -} - -// simple html dom parser -// ----------------------------------------------------------------------------- -class simple_html_dom { - public $root = null; - public $nodes = array(); - public $callback = null; - public $lowercase = false; - protected $pos; - protected $doc; - protected $char; - protected $size; - protected $cursor; - protected $parent; - protected $noise = array(); - protected $token_blank = " \t\r\n"; - protected $token_equal = ' =/>'; - protected $token_slash = " />\r\n\t"; - protected $token_attr = ' >'; - // use isset instead of in_array, performance boost about 30%... - protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, 'link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1); - protected $block_tags = array('root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1); - protected $optional_closing_tags = array( - 'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1), - 'th'=>array('th'=>1), - 'td'=>array('td'=>1), - 'li'=>array('li'=>1), - 'dt'=>array('dt'=>1, 'dd'=>1), - 'dd'=>array('dd'=>1, 'dt'=>1), - 'dl'=>array('dd'=>1, 'dt'=>1), - 'p'=>array('p'=>1), - 'nobr'=>array('nobr'=>1), - ); - - function __construct($str=null) { - if ($str) { - if (preg_match("/^http:\/\//i",$str) || is_file($str)) - $this->load_file($str); - else - $this->load($str); - } - } - - function __destruct() { - $this->clear(); - } - - // load html from string - function load($str, $lowercase=true) { - // prepare - $this->prepare($str, $lowercase); - // strip out comments - $this->remove_noise("'<!--(.*?)-->'is"); - // strip out cdata - $this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true); - // strip out <style> tags - $this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is"); - $this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is"); - // strip out <script> tags - $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is"); - $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is"); - // strip out preformatted tags - $this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is"); - // strip out server side scripts - $this->remove_noise("'(<\?)(.*?)(\?>)'s", true); - // strip smarty scripts - $this->remove_noise("'(\{\w)(.*?)(\})'s", true); - - // parsing - while ($this->parse()); - // end - $this->root->_[HDOM_INFO_END] = $this->cursor; - } - - // load html from file - function load_file() { - $args = func_get_args(); - $this->load(call_user_func_array('file_get_contents', $args), true); - } - - // set callback function - function set_callback($function_name) { - $this->callback = $function_name; - } - - // remove callback function - function remove_callback() { - $this->callback = null; - } - - // save dom as string - function save($filepath='') { - $ret = $this->root->innertext(); - if ($filepath!=='') file_put_contents($filepath, $ret); - return $ret; - } - - // find dom node by css selector - function find($selector, $idx=null) { - return $this->root->find($selector, $idx); - } - - // clean up memory due to php5 circular references memory leak... - function clear() { - foreach($this->nodes as $n) {$n->clear(); $n = null;} - if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);} - if (isset($this->root)) {$this->root->clear(); unset($this->root);} - unset($this->doc); - unset($this->noise); - } - - function dump($show_attr=true) { - $this->root->dump($show_attr); - } - - // prepare HTML data and init everything - protected function prepare($str, $lowercase=true) { - $this->clear(); - $this->doc = $str; - $this->pos = 0; - $this->cursor = 1; - $this->noise = array(); - $this->nodes = array(); - $this->lowercase = $lowercase; - $this->root = new simple_html_dom_node($this); - $this->root->tag = 'root'; - $this->root->_[HDOM_INFO_BEGIN] = -1; - $this->root->nodetype = HDOM_TYPE_ROOT; - $this->parent = $this->root; - // set the length of content - $this->size = strlen($str); - if ($this->size>0) $this->char = $this->doc[0]; - } - - // parse html content - protected function parse() { - if (($s = $this->copy_until_char('<'))==='') - return $this->read_tag(); - - // text - $node = new simple_html_dom_node($this); - ++$this->cursor; - $node->_[HDOM_INFO_TEXT] = $s; - $this->link_nodes($node, false); - return true; - } - - // read tag info - protected function read_tag() { - if ($this->char!=='<') { - $this->root->_[HDOM_INFO_END] = $this->cursor; - return false; - } - $begin_tag_pos = $this->pos; - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - - // end tag - if ($this->char==='/') { - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - $this->skip($this->token_blank_t); - $tag = $this->copy_until_char('>'); - - // skip attributes in end tag - if (($pos = strpos($tag, ' '))!==false) - $tag = substr($tag, 0, $pos); - - $parent_lower = strtolower($this->parent->tag); - $tag_lower = strtolower($tag); - - if ($parent_lower!==$tag_lower) { - if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower])) { - $this->parent->_[HDOM_INFO_END] = 0; - $org_parent = $this->parent; - - while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower) - $this->parent = $this->parent->parent; - - if (strtolower($this->parent->tag)!==$tag_lower) { - $this->parent = $org_parent; // restore origonal parent - if ($this->parent->parent) $this->parent = $this->parent->parent; - $this->parent->_[HDOM_INFO_END] = $this->cursor; - return $this->as_text_node($tag); - } - } - else if (($this->parent->parent) && isset($this->block_tags[$tag_lower])) { - $this->parent->_[HDOM_INFO_END] = 0; - $org_parent = $this->parent; - - while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower) - $this->parent = $this->parent->parent; - - if (strtolower($this->parent->tag)!==$tag_lower) { - $this->parent = $org_parent; // restore origonal parent - $this->parent->_[HDOM_INFO_END] = $this->cursor; - return $this->as_text_node($tag); - } - } - else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower) { - $this->parent->_[HDOM_INFO_END] = 0; - $this->parent = $this->parent->parent; - } - else - return $this->as_text_node($tag); - } - - $this->parent->_[HDOM_INFO_END] = $this->cursor; - if ($this->parent->parent) $this->parent = $this->parent->parent; - - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return true; - } - - $node = new simple_html_dom_node($this); - $node->_[HDOM_INFO_BEGIN] = $this->cursor; - ++$this->cursor; - $tag = $this->copy_until($this->token_slash); - - // doctype, cdata & comments... - if (isset($tag[0]) && $tag[0]==='!') { - $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>'); - - if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') { - $node->nodetype = HDOM_TYPE_COMMENT; - $node->tag = 'comment'; - } else { - $node->nodetype = HDOM_TYPE_UNKNOWN; - $node->tag = 'unknown'; - } - - if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>'; - $this->link_nodes($node, true); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return true; - } - - // text - if ($pos=strpos($tag, '<')!==false) { - $tag = '<' . substr($tag, 0, -1); - $node->_[HDOM_INFO_TEXT] = $tag; - $this->link_nodes($node, false); - $this->char = $this->doc[--$this->pos]; // prev - return true; - } - - if (!preg_match("/^[\w-:]+$/", $tag)) { - $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>'); - if ($this->char==='<') { - $this->link_nodes($node, false); - return true; - } - - if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>'; - $this->link_nodes($node, false); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return true; - } - - // begin tag - $node->nodetype = HDOM_TYPE_ELEMENT; - $tag_lower = strtolower($tag); - $node->tag = ($this->lowercase) ? $tag_lower : $tag; - - // handle optional closing tags - if (isset($this->optional_closing_tags[$tag_lower]) ) { - while (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)])) { - $this->parent->_[HDOM_INFO_END] = 0; - $this->parent = $this->parent->parent; - } - $node->parent = $this->parent; - } - - $guard = 0; // prevent infinity loop - $space = array($this->copy_skip($this->token_blank), '', ''); - - // attributes - do { - if ($this->char!==null && $space[0]==='') break; - $name = $this->copy_until($this->token_equal); - if($guard===$this->pos) { - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - continue; - } - $guard = $this->pos; - - // handle endless '<' - if($this->pos>=$this->size-1 && $this->char!=='>') { - $node->nodetype = HDOM_TYPE_TEXT; - $node->_[HDOM_INFO_END] = 0; - $node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name; - $node->tag = 'text'; - $this->link_nodes($node, false); - return true; - } - - // handle mismatch '<' - if($this->doc[$this->pos-1]=='<') { - $node->nodetype = HDOM_TYPE_TEXT; - $node->tag = 'text'; - $node->attr = array(); - $node->_[HDOM_INFO_END] = 0; - $node->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1); - $this->pos -= 2; - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - $this->link_nodes($node, false); - return true; - } - - if ($name!=='/' && $name!=='') { - $space[1] = $this->copy_skip($this->token_blank); - $name = $this->restore_noise($name); - if ($this->lowercase) $name = strtolower($name); - if ($this->char==='=') { - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - $this->parse_attr($node, $name, $space); - } - else { - //no value attr: nowrap, checked selected... - $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO; - $node->attr[$name] = true; - if ($this->char!='>') $this->char = $this->doc[--$this->pos]; // prev - } - $node->_[HDOM_INFO_SPACE][] = $space; - $space = array($this->copy_skip($this->token_blank), '', ''); - } - else - break; - } while($this->char!=='>' && $this->char!=='/'); - - $this->link_nodes($node, true); - $node->_[HDOM_INFO_ENDSPACE] = $space[0]; - - // check self closing - if ($this->copy_until_char_escape('>')==='/') { - $node->_[HDOM_INFO_ENDSPACE] .= '/'; - $node->_[HDOM_INFO_END] = 0; - } - else { - // reset parent - if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this->parent = $node; - } - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return true; - } - - // parse attributes - protected function parse_attr($node, $name, &$space) { - $space[2] = $this->copy_skip($this->token_blank); - switch($this->char) { - case '"': - $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE; - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('"')); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - break; - case '\'': - $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE; - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('\'')); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - break; - default: - $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO; - $node->attr[$name] = $this->restore_noise($this->copy_until($this->token_attr)); - } - } - - // link node's parent - protected function link_nodes(&$node, $is_child) { - $node->parent = $this->parent; - $this->parent->nodes[] = $node; - if ($is_child) - $this->parent->children[] = $node; - } - - // as a text node - protected function as_text_node($tag) { - $node = new simple_html_dom_node($this); - ++$this->cursor; - $node->_[HDOM_INFO_TEXT] = '</' . $tag . '>'; - $this->link_nodes($node, false); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return true; - } - - protected function skip($chars) { - $this->pos += strspn($this->doc, $chars, $this->pos); - $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - } - - protected function copy_skip($chars) { - $pos = $this->pos; - $len = strspn($this->doc, $chars, $pos); - $this->pos += $len; - $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - if ($len===0) return ''; - return substr($this->doc, $pos, $len); - } - - protected function copy_until($chars) { - $pos = $this->pos; - $len = strcspn($this->doc, $chars, $pos); - $this->pos += $len; - $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return substr($this->doc, $pos, $len); - } - - protected function copy_until_char($char) { - if ($this->char===null) return ''; - - if (($pos = strpos($this->doc, $char, $this->pos))===false) { - $ret = substr($this->doc, $this->pos, $this->size-$this->pos); - $this->char = null; - $this->pos = $this->size; - return $ret; - } - - if ($pos===$this->pos) return ''; - $pos_old = $this->pos; - $this->char = $this->doc[$pos]; - $this->pos = $pos; - return substr($this->doc, $pos_old, $pos-$pos_old); - } - - protected function copy_until_char_escape($char) { - if ($this->char===null) return ''; - - $start = $this->pos; - while(1) { - if (($pos = strpos($this->doc, $char, $start))===false) { - $ret = substr($this->doc, $this->pos, $this->size-$this->pos); - $this->char = null; - $this->pos = $this->size; - return $ret; - } - - if ($pos===$this->pos) return ''; - - if ($this->doc[$pos-1]==='\\') { - $start = $pos+1; - continue; - } - - $pos_old = $this->pos; - $this->char = $this->doc[$pos]; - $this->pos = $pos; - return substr($this->doc, $pos_old, $pos-$pos_old); - } - } - - // remove noise from html content - protected function remove_noise($pattern, $remove_tag=false) { - $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE); - - for ($i=$count-1; $i>-1; --$i) { - $key = '___noise___'.sprintf('% 3d', count($this->noise)+100); - $idx = ($remove_tag) ? 0 : 1; - $this->noise[$key] = $matches[$i][$idx][0]; - $this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0])); - } - - // reset the length of content - $this->size = strlen($this->doc); - if ($this->size>0) $this->char = $this->doc[0]; - } - - // restore noise to html content - function restore_noise($text) { - while(($pos=strpos($text, '___noise___'))!==false) { - $key = '___noise___'.$text[$pos+11].$text[$pos+12].$text[$pos+13]; - if (isset($this->noise[$key])) - $text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos+14); - } - return $text; - } - - function __toString() { - return $this->root->innertext(); - } - - function __get($name) { - switch($name) { - case 'outertext': return $this->root->innertext(); - case 'innertext': return $this->root->innertext(); - case 'plaintext': return $this->root->text(); - } - } - - // camel naming conventions - function childNodes($idx=-1) {return $this->root->childNodes($idx);} - function firstChild() {return $this->root->first_child();} - function lastChild() {return $this->root->last_child();} - function getElementById($id) {return $this->find("#$id", 0);} - function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);} - function getElementByTagName($name) {return $this->find($name, 0);} - function getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);} - function loadFile() {$args = func_get_args();$this->load(call_user_func_array('file_get_contents', $args), true);} -} -?>
\ No newline at end of file diff --git a/blog/sbs_2/blogext.css b/blog/sbs_2/blogext.css deleted file mode 100644 index 7b6916c..0000000 --- a/blog/sbs_2/blogext.css +++ /dev/null @@ -1,65 +0,0 @@ -span.right{ - display:table-cell; - text-align:right; - white-space:nowrap; - min-width:12em; -} -a.toctarg{ - margin-left:-160px; - padding-left:160px !important; -} -ul#tagslist{ - list-style-type:none; - padding-left:0; -} -ul#tocroot{ - list-style-type:none; - padding-left:24px; -} -ul.tocnode{ - list-style-type:none; - padding-left:16px; -} -span.left{ - display:table-cell; - text-align:left; - text-overflow:ellipsis; - overflow:hidden; - white-space:nowrap; -} -div h3{ - margin: 0.5em 0; -} -#content .block{ - margin: 1em 0; -} -p{ - text-indent:2em; -} -.noindent{ - text-indent:0 !important; -} -note, .note { - vertical-align: super; - font-size: 60%; -} -reduced, .reduced { - font-size: 75%; -} -enlarged, .enlarged { - font-size: 125%; -} -blockquote { - padding: 1em; - margin-left:4em;margin-right:4em; -} -.rightaligned { - text-align: right; -} -.nospace{font-size:0;} -.nospace>span{font-size:16px;} -#decryptdlg{max-width:30%;} -@media (max-width:768px) -{ - #decryptdlg{max-width:90%;} -} diff --git a/blog/sbs_2/bloglist.js b/blog/sbs_2/bloglist.js deleted file mode 100644 index c117afb..0000000 --- a/blog/sbs_2/bloglist.js +++ /dev/null @@ -1,216 +0,0 @@ -//License: Expat(MIT) -//Chris Xiong 2017 -var pp=5,pn=0,animating,adir=1; -var t,c,psw,curp,cbuf,cmdtl,flt; -function request(url,func) -{ - var h=new XMLHttpRequest(); - h.open("GET",url); - h.onload=()=>{func(h.response,h.status)}; - h.send(); -} -function parsetags(tgs) -{ - var r=""; - var a=tgs.split(","); - r="#"+a[0]; - for(var i=1;i<a.length;++i)r+=" #"+a[i]; - return r; -} -function rmblk(i) -{ - var l=c.querySelectorAll("div.pendingrm"); - if(i>=l.length) - { - setTimeout(function(){for(var i of l)c.removeChild(i);},500); - return; - } - var e=l.item(i); - var w=e.getBoundingClientRect().width; - e.style.left=adir*-1.3*w+"px"; - setTimeout(rmblk,100,i+1); -} -function etrblk(i) -{ - var l=c.querySelectorAll("div.block:not(.pendingrm)"); - if(!i) - { - for(var e of l) - if(e.id!="ptemplate")e.style.left=(adir*1.2*e.getBoundingClientRect().width)+"px"; - } - if(i>=l.length) - { - setTimeout(()=>{animating=false;},500); - return; - } - var e=l.item(i); - if(e.id!="ptemplate") - e.style.left="0"; - setTimeout(etrblk,100,i+1); -} -function setfilter(f,nlp) -{ - if(animating)return; - if(f[0]=='#')f=f.substr(1); - var ch=document.getElementById('tagslist').children; - var ff=false; - for(var i=0;i<ch.length;++i) - if(ch[i].children[0].innerHTML=="#"+f) - if(ch[i].children[0].classList.contains('active'))ch[i].children[0].classList.remove('active'),ff=true; - else ch[i].children[0].classList.add('active');else ch[i].children[0].classList.remove('active'); - flt=f;if(ff)flt=""; - pn=-1;if(!nlp)loadpage(0); -} -function modloc() -{ - var base=window.location.toString().substr(0,window.location.toString().search('/blog/list')+10); - var ret=base+(flt.length?'/'+flt:'')+'/'+pn; - window.history.replaceState("","Chrisoft::Blog",ret); -} -function loadpage(_pn) -{ - if(animating||_pn==pn)return; - if(_pn>pn)adir=1;else adir=-1; - pn=_pn;animating=true;modloc(); - var l=c.querySelectorAll("div.block"); - for(var i of l) - if(i.id!="ptemplate") - { - i.classList.add("pendingrm"); - r=i.getBoundingClientRect(); - i.style.top=(r.top-16)+"px"; - i.style.left=r.left+"px"; - i.style.width=r.width+"px"; - } - for(var i of l)if(i.id!="ptemplate")i.style.position="fixed"; - setTimeout(rmblk,10,0); - curp.innerHTML=(pn+1)+"/"; - request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pc"+(flt.length?"&f="+flt:""), - function(r){curp.innerHTML+=Number(r).toString();}); - request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pn="+pn+(flt.length?"&f="+flt:""), - function(r,s) - { - if(s!=200){animating=false;return;} - o=JSON.parse(r); - for(var i=0;i<o.postsOnPage;++i) - { - var e=t.cloneNode(true); - e.style.display="block";e.id=""; - e.querySelector("h3").innerHTML='<a href=/blog/post/'+o.posts[i].filename+'>'+o.posts[i].title+'</a>'; - e.querySelector("span.left").innerHTML=parsetags(o.posts[i].tags); - e.querySelector("span.right").innerHTML=o.posts[i].date; - c.insertBefore(e,psw); - } - setTimeout(etrblk,10,0); - } - ); -} -function lastpage(){loadpage(pn-1<0?0:pn-1);} -function nextpage(){request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pc"+(flt.length?"&f="+flt:""),function(r){var pc=Number(r);if(pn+1<pc)loadpage(pn+1);});} -function blinit() -{ - var parr=window.location.pathname.substr(10).split('/'); - var pflt="";ppn=0; - if(parr.length>1&&parr[1].length) - { - if(!isNaN(parr[1]))ppn=Number(parr[1]); - else if(parr.length>2&&parr[2].length&&!isNaN(parr[2])){pflt=parr[1];ppn=Number(parr[2]);} - else if(parr.length>=2)pflt=parr[1]; - } - t=document.getElementById("ptemplate"); - c=document.getElementById("content"); - psw=document.getElementById("insanch"); - curp=document.getElementById("curp"); - cbuf=document.getElementById("cmdbuf"); - document.onkeypress=keypress; - document.onkeydown=(e)=>{switch(e.key){case "ArrowLeft":lastpage();break;case "ArrowRight":nextpage();break;}}; - request("/blog/cgi-bin/get-archive-list.cgi?gt", - (r)=> - { - o=JSON.parse(r); - for(var i=0;i<o.length;++i) - { - var l=document.createElement('li'); - l.innerHTML='<a href="javascript:void(0);" onclick="setfilter(\''+o[i]+'\');">'+o[i]+"</a>"; - document.getElementById('tagslist').appendChild(l); - } - pn=-1;setfilter("#"+pflt,true);loadpage(ppn); - } - ); -} - -function showcmdbuf() -{ - cbuf.style.opacity="1"; - if(cmdtl){clearTimeout(cmdtl);cmdtl=0;} - cmdtl=setTimeout(execcmd,1000); -} -function execcmd() -{ - var v=false; - switch(cbuf.innerHTML) - { - case "h":case "k": - lastpage();v=true; - break; - case "j":case "l": - nextpage();v=true; - break; - case "gg": - loadpage(0);v=true; - break; - case "G": - v=true; - request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pc", - function(r){var pc=Number(r);loadpage(pc-1);} - ); - break; - case "xyzzy": - cbuf.innerHTML="Going minesweeping!"; - v=true;setTimeout(()=>{window.location.href="/minesweeper";},500); - break; - } - if(parseInt(cbuf.innerHTML).toString()+"G"==cbuf.innerHTML.trim()) - { - v=true; - request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pc", - function(r) - {var pc=Number(r),tpn=parseInt(cbuf.innerHTML)-1;if(tpn>=pc)tpn=pc-1;if(tpn<0)tpn=0;loadpage(tpn);} - ); - } - if(cbuf.innerHTML[0]==':') - { - var sparr=cbuf.innerHTML.split(' '); - switch(sparr[0]) - { - case ':setfilter': - case ':filter': - case ':flt': - v=true; - if(sparr.length<2) - { - cbuf.innerHTML='require 1 parameter'; - } - else setfilter(sparr[1]); - break; - case ':nofilter': - case ':noflt': - v=true; - setfilter(''); - break; - } - } - cbuf.style.opacity="0"; - if(!v)cbuf.innerHTML="Unknown command."; -} -function keypress(e) -{ - if(cbuf.style.opacity=="0")cbuf.innerHTML=""; - if(e.key.length==1) - { - cbuf.innerHTML+=e.key;showcmdbuf(); - if(cbuf.innerHTML.length==1&&'hjkl'.search(cbuf.innerHTML)!=-1) - execcmd(); - } - if(e.key=="Enter")execcmd(); -} diff --git a/blog/sbs_2/blogpost.js b/blog/sbs_2/blogpost.js deleted file mode 100644 index 4c17772..0000000 --- a/blog/sbs_2/blogpost.js +++ /dev/null @@ -1,103 +0,0 @@ -//License: Expat (MIT) -//Chrisoft Xiong 2017 -var prev,succ,tocid=0,headerlist=[]; -function request(url,func) -{ - var h=new XMLHttpRequest(); - h.open("GET",url); - h.onload=()=>{func(h.response,h.status)}; - h.send(); -} -function parsetags(tgs) -{ - var r=""; - var a=tgs.split(","); - r="#"+a[0]; - for(var i=1;i<a.length;++i)r+=" #"+a[i]; - return r; -} -function dfs(el,le,p) -{ - var e=document.createElement('li'); - e.innerHTML='<a class="toctarg" href="#tocanch'+tocid+'">'+el.innerHTML+'</a>'; - le.appendChild(e); - el.id='tocanch'+(tocid++); - el.classList.add('tvis'); - var che=null,i; - for(i=p+1;i<headerlist.length;) - { - if(headerlist[i].tagName<=el.tagName)break; - if(headerlist[i].classList.contains('notoc'))continue; - if(che===null) - { - var te=document.createElement('li'); - che=document.createElement('ul'); - che.classList.add('tocnode'); - te.appendChild(che); - le.appendChild(te); - } - i=dfs(headerlist[i],che,i); - } - return i; -} -function bpinit() -{ - var parr=window.location.pathname.substr(10).split('/'); - var pflt="";ppn=0; - if(parr.length>1&&parr[1].length) - { - request("/blog/cgi-bin/get-post-content.cgi?p="+parr[1], - (r,s)=> - { - if(s>=400)window.location="/blog"; - var p1=r.search('\n'); - var title=r.substr(0,r.search('\n')); - var p2=r.substr(p1+1).search('\n'); - var date=r.substr(p1+1,p2); - var p3=r.substr(p1+p2+2).search('\n'); - var tags=r.substr(p1+p2+2,p3); - document.getElementById("title").innerHTML=title; - document.getElementById("titleh").innerHTML=title; - document.getElementById("datetags").innerHTML=date+"<br>"+parsetags(tags); - document.getElementById("article").innerHTML=r.substr(p1+p2+p3+3); - var l=document.getElementById("article").querySelectorAll("script"); - for(var i of l) - { - var s=document.createElement("script"); - s.async=true; - s.src=i.src; - document.getElementById("article").appendChild(s); - } - var tgs=tags.split(','); - for(var i=0;i<tgs.length;++i) - { - var l=document.createElement('li'); - l.innerHTML='<a href="/blog/list/'+tgs[i]+'/">'+tgs[i]+"</a>"; - document.getElementById('tagslist').appendChild(l); - } - request("/blog/cgi-bin/get-archive-list.cgi?qn="+parr[1], - (r,s)=> - { - if(s>=400)return; - var o=JSON.parse(r); - prev=o.prev;succ=o.succ; - } - ); - l=document.getElementById('article').querySelectorAll('h2,h3,h4,h5,h6'); - var tocroot=document.getElementById('tocroot'); - for(var i of l) - { - if(!i.classList.contains('notoc'))headerlist.push(i); - } - for(var i=0;i<headerlist.length;)i=dfs(headerlist[i],tocroot,i); - if(!tocroot.children.length)document.getElementById('tocouter').style.display='none'; - for(var i=0;i<tgs.length;++i) - footnoter(); - if(window.location.hash.length&&document.querySelector(window.location.hash)) - window.scroll(window.scrollX,document.querySelector(window.location.hash).getBoundingClientRect().top); - } - ); - } -} -function prevpost(){if(prev.length)window.location="/blog/post/"+prev;} -function succpost(){if(succ.length)window.location="/blog/post/"+succ;} diff --git a/blog/sbs_2/cgi-bin/.htaccess b/blog/sbs_2/cgi-bin/.htaccess deleted file mode 100644 index 84df3ac..0000000 --- a/blog/sbs_2/cgi-bin/.htaccess +++ /dev/null @@ -1,3 +0,0 @@ -Options +ExecCGI -AddHandler cgi-script cgi pl - diff --git a/blog/sbs_2/cgi-bin/get-archive-list.cgi b/blog/sbs_2/cgi-bin/get-archive-list.cgi deleted file mode 120000 index 4024897..0000000 --- a/blog/sbs_2/cgi-bin/get-archive-list.cgi +++ /dev/null @@ -1 +0,0 @@ -../cgi-src/get-archive-list
\ No newline at end of file diff --git a/blog/sbs_2/cgi-bin/get-post-content.cgi b/blog/sbs_2/cgi-bin/get-post-content.cgi deleted file mode 120000 index 17ef753..0000000 --- a/blog/sbs_2/cgi-bin/get-post-content.cgi +++ /dev/null @@ -1 +0,0 @@ -../cgi-src/get-post-content
\ No newline at end of file diff --git a/blog/sbs_2/cgi-src/cgiutils.hpp b/blog/sbs_2/cgi-src/cgiutils.hpp deleted file mode 100644 index 3eca4dc..0000000 --- a/blog/sbs_2/cgi-src/cgiutils.hpp +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright 2017 Chris Xiong - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -#ifndef CGILIB_HPP -#define CGILIB_HPP -#include <cstdlib> -#include <map> -#include <string> -#include <vector> -const char* base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; -std::string base64_encode(std::string s) -{ - std::string r=""; - for(unsigned i=0;i<s.length();i+=3) - { - int b=(s[i]&0xFC)>>2; - r+=base64_table[b]; - b=(s[i]&0x03)<<4; - if(i+1<s.length()) - { - b|=(s[i+1]&0xF0)>>4; - r+=base64_table[b]; - b=(s[i+1]&0x0F)<<2; - if(i+2<s.length()) - { - b|=(s[i+2]&0xC0)>>6; - r+=base64_table[b]; - b=s[i+2]&0x3F; - r+=base64_table[b]; - }else r+=base64_table[b],r+='='; - }else r+=base64_table[b],r+="=="; - } - return r; -} -void split(std::string s,char c,std::vector<std::string>& v) -{ - v.clear(); - for(size_t anch=0;;) - { - std::string sec; - if(s.find(c,anch)==std::string::npos) - sec=s.substr(anch); - else sec=s.substr(anch,s.find(c,anch)-anch); - v.push_back(sec); - if(s.find(c,anch)==std::string::npos)break; - anch=s.find(c,anch)+1; - } -} -std::string trim(std::string s) -{ - int l=0;for(;isblank(s[l]);++l) - s=s.substr(l); - while(isblank(s.back()))s.pop_back(); - return s; -} -class QueryStrParser -{ - private: - std::map<std::string,std::string> q; - void parse(std::string es) - { - for(size_t anch=0;;) - { - std::string sec; - if(es.find('&',anch)==std::string::npos) - sec=es.substr(anch); - else sec=es.substr(anch,es.find('&',anch)-anch); - if(sec.find('=')==std::string::npos) - q[sec.substr(0)]=""; - else - q[sec.substr(0,sec.find('='))]=sec.substr(sec.find('=')+1); - if(es.find('&',anch)==std::string::npos)break; - anch=es.find('&',anch)+1; - } - } - public: - QueryStrParser() - { - char* e=getenv("QUERY_STRING"); - if(!e)return; - parse(std::string(e)); - } - QueryStrParser(std::string s) - { - parse(s); - } - bool exist(std::string s) - { - return q.find(s)!=q.end(); - } - std::string value(std::string s) - { - if(!exist(s))return ""; - return q.find(s)->second; - } -}; -class RequestCookies -{ - private: - std::map<std::string,std::string> m; - void parse(std::string cookie) - { - std::vector<std::string> v; - split(cookie,';',v); - } - public: - RequestCookies() - { - char* e=getenv("HTTP_COOKIE"); - if(!e)return; - parse(std::string(e)); - } -}; -class DOMAttrib -{ - private: - std::map<std::string,std::string> m; - public: - DOMAttrib(std::string s="") - { - for(size_t anch=0;;) - { - std::string sec; - if(s.find('"',anch)==std::string::npos) - sec=s.substr(anch); - else sec=s.substr(anch,s.find('"',s.find('"',anch)+1)-anch+1); - if(sec.find('=')==std::string::npos) - m[sec.substr(0)]=""; - else - m[sec.substr(0,sec.find('='))]=sec.substr(sec.find('=')+2), - m[sec.substr(0,sec.find('='))].pop_back(); - if(s.find(' ',anch+sec.length())==std::string::npos)break; - anch=s.find(' ',anch+sec.length())+1; - } - } - void setAttrib(std::string a,std::string v){m[a]=v;} - void eraseAttrib(std::string a){if(existAttrib(a))m.erase(m.find(a));} - bool existAttrib(std::string a){return m.find(a)!=m.end();} - std::string getAttrib(std::string a){if(!existAttrib(a))return "";return m[a];} - std::string to_string() - { - std::string r;bool cf=false; - for(auto i=m.begin();i!=m.end();++i) - { - if(cf)r+=' ';else cf=true; - r+=i->first+"=\""+i->second+"\""; - } - return r; - } -}; -static const char* twoxx[]={ - "OK", - "Created", - "Accepted", - "Non-Authoritative Information", - "No Content", - "Reset Content", - "Partial Content", - "Multi-Status", - "Already Reported" -}; -static const char* threexx[]={ - "Multiple Choices", - "Moved Permanently", - "Found", - "See Other", - "Not Modified", - "Use Proxy", - "???", - "Temporary Redirect" -}; -static const char* fourxx[]={ - "Bad Request", - "Unauthorized", - "Payment Required", - "Forbidden", - "Not Found", - "Method Not Allowed", - "Not Acceptable", - "Proxy Authentication Required", - "Request Timeout", - "Conflict", - "Gone", - "Length Required", - "Precondition Failed", - "Request Entity Too Large", - "Request-URI Too Long", - "Unsupported Media Type", - "Requested Range Not Satisfiable", - "Expectation Failed" -}; -static const char* fivexx[]={ - "Internal Server Error", - "Not Implemented", - "Bad Gateway", - "Service Unavailable", - "Gateway Timeout", - "HTTP Version Not Supported" -}; -class HTTPHeader -{ -private: - int status; - std::vector<std::string> hdr; -public: - HTTPHeader(){status=200;} - void setStatusCode(int c){status=c;} - int statusCode(){return status;} - void appendHeader(std::string s){hdr.push_back(s);} - void print() - { - if(status>=200&&status<=208) - printf("Status: %d %s\r\n",status,twoxx[status-200]); - if(status>=300&&status<=307) - printf("Status: %d %s\r\n",status,threexx[status-300]); - if(status>=400&&status<=417) - printf("Status: %d %s\r\n",status,fourxx[status-400]); - if(status>=500&&status<=505) - printf("Status: %d %s\r\n",status,fivexx[status-500]); - for(unsigned i=0;i<hdr.size();++i) - printf("%s\r\n",hdr[i].c_str()); - printf("\r\n"); - } -}; -#endif diff --git a/blog/sbs_2/cgi-src/get-archive-list b/blog/sbs_2/cgi-src/get-archive-list Binary files differdeleted file mode 100755 index 4285a4d..0000000 --- a/blog/sbs_2/cgi-src/get-archive-list +++ /dev/null diff --git a/blog/sbs_2/cgi-src/get-archive-list.cpp b/blog/sbs_2/cgi-src/get-archive-list.cpp deleted file mode 100644 index 28f316d..0000000 --- a/blog/sbs_2/cgi-src/get-archive-list.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright 2017 Chris Xiong - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -/* - * Get list of archives - * query parameters: - * pn=<int>: page number, defaults to 0 - * pp=<int>: number of posts per page, defaults to 20 - * pc: if exists, gets how many pages are there from the current pp value - * f: tag filter. - * gt: get a list of tags used by posts instead. - * qn=<filename>: query the neibouring posts of the given post. - * returned object: - * A number if pc exists denoting number of pages. - * Or the following JSON object if gf exists. - * ["tag1","tag2",...] - * Or the following JSON object if qn exists. - * { - * "prev": <last post> - * "succ": <next post> - * } - * Otherwise returns archive list in JSON: - * { - * "postsPerPage": <requested pp> - * "postsOnPage": <number of posts on this page> - * "page": <requested pn> - * "posts": [ - * { - * "filename": ... - * "title": ... - * "date": ... - * "tags": ... - * }, - * ... - * ] - * } - */ -#include <dirent.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <cstdio> -#include <cstring> -#include <algorithm> -#include <functional> -#include <vector> -#include <map> -#include <set> -#include <string> -#include "cgiutils.hpp" -#define stripr(s) s[strlen(s)-1]=='\n'?s[strlen(s)-1]=0:0 -struct post -{ - std::string t,d,tg; -}; -std::map<std::string,post,std::greater<std::string>> f; -char buf[65536]; -int main(int argc,char** argv,char** envp) -{ - struct stat idxs,cdirs; - stat("/var/www/html/blog/content/pindex",&idxs); - stat("/var/www/html/blog/content",&cdirs); - if(cdirs.st_mtim.tv_sec>idxs.st_mtim.tv_sec) - system("/var/www/html/blog/content/util/indexer > /dev/null 2> /dev/null"); - QueryStrParser a; - FILE *fidx=fopen("/var/www/html/blog/content/pindex","r"); - while(fgets(buf,65536,fidx)) - { - stripr(buf);std::vector<std::string> v; - split(std::string(buf),'\t',v); - if(v.size()==4) - f[v[0]]=post{v[1],v[2],v[3]}; - } - fclose(fidx); - HTTPHeader h; - if(a.exist("gt")) - { - std::set<std::string> s; - std::vector<std::string> v; - for(auto i=f.begin();i!=f.end();++i) - { - split(i->second.tg,',',v); - for(size_t j=0;j<v.size();++j) - s.insert("\"#"+v[j]+"\""); - } - h.appendHeader("Content-type: text/plain; charset=utf-8"); - h.print(); - printf("["); - auto it=s.begin(); - printf("%s",it->c_str()); - while(++it!=s.end())printf(",%s",it->c_str()); - printf("]"); - } - else - { - if(a.exist("f")) - for(auto i=f.begin();i!=f.end();) - { - std::vector<std::string> v; - split(i->second.tg,',',v); - std::set<std::string> sv=std::set<std::string>(v.begin(),v.end()); - if(sv.find(a.value("f"))==sv.end()){auto t=i++;f.erase(t);} - else i++; - } - if(a.exist("pc")) - { - int pp=0; - if(!a.exist("pp"))pp=20; - else{ - try{ - pp=std::stoi(a.value("pp")); - }catch(std::exception e){h.setStatusCode(400);} - } - if(!pp)h.setStatusCode(400); - h.appendHeader("Content-type: text/plain; charset=utf-8"); - h.print(); - printf("%lu\n",f.size()/pp+((f.size()%pp)?1:0)); - return 0; - } - else if(a.exist("qn")) - { - if(f.find(a.value("qn"))==f.end()) - h.setStatusCode(400); - h.print();if(h.statusCode()>=400)return 0; - auto i=f.find(a.value("qn")); - std::string pr="",sc=""; - auto t=i;if(t!=f.begin())pr=(--t)->first; - t=i;if(!(++t==f.end()))sc=t->first; - printf("{\"prev\":\"%s\",\"succ\":\"%s\"}",sc.c_str(),pr.c_str()); - return 0; - } - else - { - unsigned pp=20,pn=0; - if(!a.exist("pp"))pp=20; - else{ - try{ - pp=std::stoi(a.value("pp")); - }catch(std::exception e){h.setStatusCode(400);} - } - if(!a.exist("pn"))pn=0; - else{ - try{ - pn=std::stoi(a.value("pn")); - }catch(std::exception e){h.setStatusCode(400);} - } - if(!pp)h.setStatusCode(400); - if(pn>=f.size()/pp+((f.size()%pp)?1:0))h.setStatusCode(400); - int rpp=(pn!=f.size()/pp+((f.size()%pp)?1:0)-1)?pp: - f.size()-pp*(f.size()/pp+((f.size()%pp)?1:0)-1); - h.appendHeader("Content-type: text/plain; charset=utf-8"); - h.print(); - if(h.statusCode()>=400)return 0; - puts("{"); - printf("\t\"postsPerPage\":%d,\n",pp); - printf("\t\"postsOnPage\":%d,\n",rpp); - printf("\t\"page\":%d,\n",pn); - puts("\t\"posts\": ["); - auto it=f.begin();std::advance(it,pn*pp); - for(int i=0;i<rpp-1;++i) - { - puts("\t\t{"); - printf("\t\t\t\"filename\":\"%s\",\n",it->first.c_str()); - printf("\t\t\t\"title\":\"%s\",\n",it->second.t.c_str()); - printf("\t\t\t\"date\":\"%s\",\n",it->second.d.c_str()); - printf("\t\t\t\"tags\":\"%s\"\n",it->second.tg.c_str()); - puts("\t\t},");++it; - } - puts("\t\t{"); - printf("\t\t\t\"filename\":\"%s\",\n",it->first.c_str()); - printf("\t\t\t\"title\":\"%s\",\n",it->second.t.c_str()); - printf("\t\t\t\"date\":\"%s\",\n",it->second.d.c_str()); - printf("\t\t\t\"tags\":\"%s\"\n",it->second.tg.c_str()); - puts("\t\t}"); - puts("\t]"); - puts("}"); - } - } - return 0; -} diff --git a/blog/sbs_2/cgi-src/get-post-content b/blog/sbs_2/cgi-src/get-post-content Binary files differdeleted file mode 100755 index e6701c8..0000000 --- a/blog/sbs_2/cgi-src/get-post-content +++ /dev/null diff --git a/blog/sbs_2/cgi-src/get-post-content.cpp b/blog/sbs_2/cgi-src/get-post-content.cpp deleted file mode 100644 index 62cd5d8..0000000 --- a/blog/sbs_2/cgi-src/get-post-content.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2017 Chris Xiong - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -/* - * Get content of a post - * query parameters: - * p=<string>: post file name - * returned object: - * HTML fragment of the post - */ -#include <dirent.h> -#include <cstdio> -#include <cstring> -#include <algorithm> -#include <functional> -#include <vector> -#include <string> -#include "cgiutils.hpp" -#define stripr(s) s[strlen(s)-1]=='\n'?s[strlen(s)-1]=0:0 -std::vector<std::string> fn; -char buf[262144]; -size_t sz; -void encrypt() -{ - std::string b(buf,sz); - for(size_t p=b.find("<encrypted"),i=0;p!=std::string::npos;p=b.find("<encrypted",p),++i) - { - size_t tag_end=b.find(">",p); - std::string attrib=b.substr(p+11,tag_end-p-11); - DOMAttrib a(attrib); - std::string cont=b.substr(tag_end+1,b.find("</encrypted>",p)-tag_end-1); - unsigned hash=5381; - std::string key=a.getAttrib("key"); - a.eraseAttrib("key"); - for(size_t j=0;j<cont.length();++j) - { - hash=((hash<<5)+hash)+*reinterpret_cast<unsigned char*>(&cont[j]); - cont[j]^=key[j%key.length()]; - } - a.setAttrib("encont",base64_encode(cont)); - a.setAttrib("hash",std::to_string(hash)); - a.setAttrib("id","encrypted"+std::to_string(i)); - cont="Encrypted content here. Click <a href=\"javascript:void(0)\" onclick=\"decryptui("+std::to_string(i)+")\">here</a> to decrypt."; - b.replace(p,b.find("</encrypted>",p)-p,"<encrypted "+a.to_string()+">"+cont); - p=b.find("</encrypted>",p); - } - memcpy(buf,b.c_str(),b.length());sz=b.length(); -} -int main(int argc,char** argv,char** envp) -{ - QueryStrParser a; - HTTPHeader h; - if(!a.exist("p")){h.setStatusCode(400);h.print();return 0;} - FILE* f=fopen(("/var/www/html/blog/content/"+a.value("p")+".txt").c_str(),"r"); - if(!f){h.setStatusCode(400);h.print();return 0;} - h.appendHeader("Content-type: text/plain; charset=utf-8"); - h.print(); - sz=fread(buf,sizeof(char),262144,f); - encrypt(); - fwrite(buf,sizeof(char),sz,stdout); - fclose(f); - return 0; -} diff --git a/blog/sbs_2/decryptor.js b/blog/sbs_2/decryptor.js deleted file mode 100644 index dcd64e3..0000000 --- a/blog/sbs_2/decryptor.js +++ /dev/null @@ -1,73 +0,0 @@ -//License: Expat(MIT) -//Chrisoft Xiong 2017 -// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt -function Utf8ArrayToStr(array){ - var out,i,len,c; - var char2,char3; - out=""; - len=array.length; - i=0; - while(i<len){ - c=array[i++]; - switch(c>>4) - { - case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7: - // 0xxxxxxx - out+=String.fromCharCode(c); - break; - case 12:case 13: - // 110x xxxx 10xx xxxx - char2=array[i++]; - out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F)); - break; - case 14: - // 1110 xxxx 10xx xxxx 10xx xxxx - char2=array[i++]; - char3=array[i++]; - out+=String.fromCharCode(((c&0x0F)<<12)| - ((char2&0x3F)<<6)| - ((char3&0x3F)<<0)); - break; - } - } - return out; -} -var decid; -function decryptui(id) -{ - document.getElementById("decryptui").style.display="block"; - document.getElementById("keyinp").focus(); - setTimeout(function(){document.getElementById("decryptui").style.opacity="1";},20); - decid=id; - document.getElementById("keyhint").innerHTML="Hint: "+document.getElementById("encrypted"+id).getAttribute("hint"); - document.getElementById("keyinp").onkeypress=function(e){if(e.keyCode==13)document.getElementById('btndecrypt').click();} -} -function hidedecryptui() -{ - document.getElementById("decryptui").style.opacity="0"; - setTimeout(function(){ - document.getElementById("decryptui").style.display="none"; - document.getElementById("keyinp").value=""; - },500); -} -function decryptor(id,key) -{ - var e=document.getElementById("encrypted"+id); - var cont=e.getAttribute("encont"); - var bc=atob(cont); - var b=new Array(bc.length); - for(var i=0;i<bc.length;++i)b[i]=bc.charCodeAt(i); - var lkey=key.length; - var u8arr=new Uint8Array(b); - var hash=5381; - for(var i=0;i<u8arr.length;++i){u8arr[i]^=key.charCodeAt(i%lkey);hash=(hash*33)+u8arr[i];hash%=4294967296;} - if(hash!=parseInt(e.getAttribute("hash"))) - { - alert("The decryption key you have entered could be wrong, please try again."); - return; - } - //e.innerHTML=new TextDecoder("utf-8").decode(u8arr); - e.innerHTML=Utf8ArrayToStr(u8arr); - footnoter(); - hidedecryptui(); -} diff --git a/blog/sbs_2/footnoter.js b/blog/sbs_2/footnoter.js deleted file mode 100644 index a1b2d8b..0000000 --- a/blog/sbs_2/footnoter.js +++ /dev/null @@ -1,24 +0,0 @@ -//License: MIT -//Chrisoft Xiong 2017 -var starting=0; -function footnoter() -{ - var footnotes=document.body.getElementsByTagName("footnote"); - for(var i=0;i<footnotes.length;++i) - { - var s=footnotes[i].innerHTML; - footnotes[i].innerHTML="";//IE is stupid - var a=document.createElement("a"); - a.setAttribute("id","n"+(starting+i+1)); - a.setAttribute("href","#note"+(starting+i+1)); - a.setAttribute("class","note"); - a.innerHTML="["+(starting+i+1)+"]"; - footnotes[i].parentNode.insertBefore(a,footnotes[i]); - var span=document.createElement("span"); - span.setAttribute("class","TText"); - span.innerHTML="<a id=\"note"+(starting+i+1)+"\" href=\"#n"+(starting+i+1)+"\">["+(starting+i+1)+"]</a>: "+s+"<br>"; - document.getElementById("notediv").appendChild(span); - } - starting+=footnotes.length; - while(footnotes.length)footnotes[0].remove(); -} diff --git a/blog/sbs_2/index.html b/blog/sbs_2/index.html deleted file mode 100644 index d7c31c9..0000000 --- a/blog/sbs_2/index.html +++ /dev/null @@ -1 +0,0 @@ -<script>window.location="list/"</script> diff --git a/blog/sbs_2/list b/blog/sbs_2/list deleted file mode 100644 index e1f751e..0000000 --- a/blog/sbs_2/list +++ /dev/null @@ -1,94 +0,0 @@ -<!DOCTYPE html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<meta name="viewport" content="width=device-width,initial-scale=1">
-<title>Chrisoft::Blog</title>
-<script type="text/javascript" src="/panel.js"></script>
-<script type="text/javascript" src="/blog/bloglist.js"></script>
-<link rel="stylesheet" type="text/css" href="/common.css">
-<link rel="stylesheet" type="text/css" href="/panel.css">
-<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
-<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
-<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
-<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
-<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
-<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
-<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
-<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
-<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
-<script>
-function ol()
-{
- window.onresize=function()
- {
- if(window.innerWidth<768)
- setupevents();
- else unsetevents();
- }
- window.onresize();
- blinit();
-}
-function loadTheme(){
- var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
- if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
- var ent="";
- var d=new Date();
- if(thm[0]=='z')
- {
- var m=d.getMonth()+1;
- if(m>=3&&m<6)thm='0'+thm[1];
- else if(m>=6&&m<9)thm='1'+thm[1];
- else if(m>=9&&m<12)thm='2'+thm[1];
- else thm='3'+thm[1];
- }
- if(thm[1]=='z')
- {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
- ent=`theme${thm}`;
- var R=new RegExp('theme[0-4][ab]');
- for(var i=0;i<document.styleSheets.length;++i)
- {
- if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
- document.styleSheets[i].disabled=true;
- else document.styleSheets[i].disabled=false;
- }
-}
-loadTheme();
-</script>
-</head>
-<body onload="ol()" style="overflow-x:hidden;">
- <div id="panel" class="TText">
- <ul id="panellist">
- <li><a href="/"><h1>Chrisoft</h1></a></li>
- <li><a href="/blog"><h2>Blog</h2></a></li>
- <li><span>Tags filter</span>
- <ul id="tagslist">
- </ul>
- </li>
- </ul>
- </div>
- <div id="content">
- <div class="block TText" id="ptemplate" style="position:relative;transition:500ms;">
- <h3 style="line-height:1.5em;">Title</h3>
- <br>
- <div style="display:table;width:100%;table-layout:fixed;"><span class="left">tags</span>
- <span class="right">time</span></div>
- </div>
- <div id="insanch" style="height:5em;"></div>
- <div id="footer" style="">
- <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
- <span style="display:table-cell;"><a href="javascript:void(0);" onclick="lastpage();"><<</a></span>
- <span style="text-align:center;display:table-cell;" id="curp"></span>
- <span style="text-align:right;display:table-cell;"><a href="javascript:void(0);" onclick="nextpage();">>></a></span>
- </div>
- <div style="text-align:center;" class="TText">
- Proudly powered by SBS <reduced style="font-size:70%;">(the stupid blogging system)</reduced> 2.1
- <br>
- Content licensed under CC BY-SA 4.0.
- </div>
- </div>
- <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
- </div>
- </div>
-</body>
-</html>
diff --git a/blog/sbs_2/post b/blog/sbs_2/post deleted file mode 100644 index 4ea512d..0000000 --- a/blog/sbs_2/post +++ /dev/null @@ -1,108 +0,0 @@ -<!DOCTYPE html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<meta name="viewport" content="width=device-width,initial-scale=1">
-<title>Chrisoft::Blog</title>
-<script type="text/javascript" src="/panel.js"></script>
-<script type="text/javascript" src="/blog/blogpost.js"></script>
-<script type="text/javascript" src="/blog/footnoter.js"></script>
-<script type="text/javascript" src="/blog/decryptor.js"></script>
-<link rel="stylesheet" type="text/css" href="/common.css">
-<link rel="stylesheet" type="text/css" href="/panel.css">
-<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
-<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
-<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
-<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
-<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
-<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
-<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
-<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
-<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
-<script>
-function ol()
-{
- window.onresize=function()
- {
- if(window.innerWidth<768)
- setupevents();
- else unsetevents();
- }
- window.onresize();
- bpinit();
-}
-function loadTheme(){
- var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
- if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
- var ent="";
- var d=new Date();
- if(thm[0]=='z')
- {
- var m=d.getMonth()+1;
- if(m>=3&&m<6)thm='0'+thm[1];
- else if(m>=6&&m<9)thm='1'+thm[1];
- else if(m>=9&&m<12)thm='2'+thm[1];
- else thm='3'+thm[1];
- }
- if(thm[1]=='z')
- {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
- ent=`theme${thm}`;
- var R=new RegExp('theme[0-4][ab]');
- for(var i=0;i<document.styleSheets.length;++i)
- {
- if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
- document.styleSheets[i].disabled=true;
- else document.styleSheets[i].disabled=false;
- }
-}
-loadTheme();
-</script>
-</head>
-<body onload="ol()" style="overflow-x:hidden;">
- <div id="panel" class="TText">
- <ul id="panellist">
- <li><a href="/"><h1>Chrisoft</h1></a></li>
- <li><a href="/blog"><h2>Blog</h2></a></li>
- <li><a href="#"><h3 id="title"></h3></a></li>
- <li><span>Tags</span>
- <ul id="tagslist">
- </ul>
- </li>
- <li id="tocouter">
- <span>Table of Contents</span>
- <ul id="tocroot">
- </ul>
- </li>
- <li style="margin-left:-0.5em"><a href="javascript:void(0);" onclick="prevpost();">Prev post</a></li>
- <li style="margin-left:-0.5em"><a href="javascript:void(0);" onclick="succpost();">Next post</a></li>
- </ul>
- </div>
- <div id="content">
- <h2 id="titleh" class="TText" style="font-wight:normal;"></h2>
- <div id="datetags" class="TText" style="margin-bottom:1em;"></div>
- <div id="article" class="TText"></div><br><hr>
- <div class="TText" id="notediv" style="font-size:80%;"></div>
- <div id="insanch" style="height:3em;"></div>
- <div id="footer" style="">
- <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
- <div style="text-align:center;" class="TText">
- Proudly powered by SBS <reduced style="font-size:70%;">(the stupid blogging system)</reduced> 2.1
- <br>
- Content licensed under CC BY-SA 4.0.
- </div>
- </div>
- <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
- </div>
- </div>
- <div id="decryptui" style="display:none;opacity:0;color:white;z-index:10;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
- <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
- <div id="keyhint" style="margin-bottom:8px;"></div>
- <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text"></div>
- <div style="height:2.25em;">
- <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
- <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
- </div>
- </form>
- </div>
-</body>
-</html>
|