Advertisement
Awn_pastebin

Op2ools.js

Oct 28th, 2016
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //////////////////////////////////////////////////////////////////////////
  2. //
  3. //@title おーぷん2ちゃんねるツール
  4. //@include http://*.open2ch.net
  5. //@private
  6. //
  7. //作った人: Awn(@Awn_tw)
  8. //
  9. //改定履歴
  10. //-20161021(ver 1.0.0): とりあえず作ってみた。
  11. //-20161024(ver 1.1.0): isSurenusiを追加。
  12. //-20161025(ver 1.2.0): _getNameを追加。モジュールパターンっぽくしてみた。isSurenusi -> _isSurenusiに変更。
  13. //-20161025(ver 1.3.0): _getName -> _getResNameに変更。_getResRawと_getResTimeと_getResIDを追加。
  14. //-20161025(ver 1.4.0): _isBrokenと_getValidNumを追加。
  15. //-20161025(ver 1.4.1): モジュールパターンではあるが、より正確に言えばリビーリングモジュールパターンっぽい。
  16. //-20161025(ver 1.4.2): URLの末尾に半角ハイフンを含む場合も"[全部]のURLに移動します。"のケースに含める。
  17. //-20161027(ver 1.4.3): (面倒なので)canonicalなURLで無い時はcanonicalなURLに飛ばす。kari_compの取得方法を変更(splitを減らし正規表現で取得)
  18. //-20161029(ver 1.5.0): _getValidNumを廃止 -> _gvnに変更。_getDTを追加。jQueryっぽいものをquerySelectorAllやDOM APIに変更。とても速くなった(当社比)。
  19. //
  20. //諸注意
  21. //-ご利用は自己責任でお願いします。
  22. //-スクリプトは予告なく修正または廃止されることがあります。
  23. //-コンソールでしか動かない、と思います。
  24. //-悪用は厳禁です。
  25. //-改造改良改悪はご自由にどうぞ。
  26. //
  27. //////////////////////////////////////////////////////////////////////////
  28.  
  29. var Op2ools = (function(){
  30.  
  31. /* private member */
  32.     var _VERSION = "1.5.0";
  33.     var _BBSNAME = "";
  34.     var _SURETAI = "";
  35.     var _isInitSuccess = false;
  36.  
  37.  
  38. /* private initializer */
  39.     _init();
  40.  
  41.  
  42. /* private method */
  43.     function _init(){
  44.     /*
  45.     ------------------
  46.         _init : 初期化メソッド。失敗したらOp2oolsをundefinedにする
  47.     ------------------
  48.     */
  49.         var _hostname = location.hostname;
  50.         var _url = location.href;
  51.         var _urlcanonical = document.querySelector("link[rel='canonical']").href;
  52.  
  53.         //init failure
  54.         if( _hostname.indexOf("open2ch") === -1 ){
  55.             _failureMessage("このツールはおーぷん2ちゃんねる(http://*.open2ch.net)での動作しか保証しておりません。");
  56.             return _isInitSuccess;
  57.         }
  58.  
  59.         if( _url.indexOf("read.cgi") === -1 ){
  60.             _failureMessage("特定のスレを開いてください。");
  61.             return _isInitSuccess;
  62.         }
  63.  
  64.         if( _url !== _urlcanonical ){
  65.             _failureMessage("[全部]のURLに移動します。\n再度、Op2oolsを実行してください。");
  66.             location.href = _urlcanonical;
  67.             return _isInitSuccess;
  68.         }
  69.  
  70.         //init success
  71.         _BBSNAME = _url.split("/")[5];
  72.         _SURETAI = document.title;
  73.         _isInitSuccess = true;
  74.  
  75.         console.log("Op2ools: init success!");
  76.         return _isInitSuccess;
  77.     }
  78.  
  79.     function _failureMessage(mes){
  80.     /*
  81.     ------------------
  82.         _failureMessage : エラーメッセージを書き出したりalertしたりする
  83.     ------------------
  84.     */
  85.         console.warn(mes);
  86.         alert(mes);
  87.         console.log("Op2ools: init failure!");
  88.     }
  89.  
  90.     function _getLastResNum(){
  91.     /*
  92.     ------------------
  93.         _getLastResNum : 最終レス番号を返す
  94.     ------------------
  95.     */
  96.         var d = document.querySelectorAll("dt");
  97.         var dnum = d[d.length-1].getElementsByClassName("num")[0];
  98.         var rtn = dnum !== undefined ? dnum.innerText -0 : d[d.length-2].getElementsByClassName("num")[0].innerText - 0;
  99.         return rtn;
  100.     }
  101.  
  102.     function _getRes(num){
  103.     /*
  104.     ------------------
  105.         _getRes : レス番号に対応する書き込みメッセージを"改行コード付きで"返す
  106.     ------------------
  107.     */
  108.         num = _gvn(num);
  109.         var rtn;
  110.         if( num !== undefined ){
  111.             rtn = document.querySelectorAll("dd")[num].innerText;
  112.             return rtn;
  113.         }else{
  114.             return rtn;
  115.         }
  116.     }
  117.  
  118.     function _getResName(num){
  119.     /*
  120.     ------------------
  121.         _getResName : レス番号に対応する名前欄を返す
  122.     ------------------
  123.     */
  124.         num = _gvn(num);
  125.         var dt;
  126.         var rtn;
  127.         if( num !== undefined){
  128.             dt = _getDT(num);
  129.             rtn = dt.split(":")[1];
  130.             rtn = rtn.substr(rtn.length -1) === " " ? rtn.substr(0,rtn.length-1) : rtn;
  131.             return rtn;
  132.         }else{
  133.             return rtn;
  134.         }
  135.     }
  136.  
  137.     function _getResTime(num){
  138.     /*
  139.     ------------------
  140.         _getResTime : レス番号に対応する書き込み時間を返す
  141.     ------------------
  142.     */
  143.         num = _gvn(num);
  144.         var dt;
  145.         var rtn;
  146.         if( num !== undefined){
  147.             dt = _getDT(num);
  148.             rtn = dt.split(":")[2].split(" ")[0];
  149.             return rtn;
  150.         }else{
  151.             return rtn;
  152.         }
  153.     }
  154.  
  155.     function _getResID(num){
  156.     /*
  157.     ------------------
  158.         _getResID : レス番号に対応するIDを返す
  159.     ------------------
  160.     */
  161.         num = _gvn(num);
  162.         var dt;
  163.         var rtn;
  164.         if( num !== undefined){
  165.             dt = _getDT(num);
  166.             rtn = dt.split(":")[2].split(" ")[1].split(":")[1];
  167.             return rtn;
  168.         }else{
  169.             return rtn;
  170.         }
  171.     }
  172.  
  173.     function _isSurenusi(num){
  174.     /*
  175.     ------------------
  176.         _isSurenusi : スレ主かどうかチェックし、trueかfalseで返す
  177.     ------------------
  178.     */
  179.         num = _gvn(num);
  180.         var dt;
  181.         var rtn = false;
  182.         if( num !== undefined ){
  183.             dt = _getDT(num);
  184.             rtn = dt.split(":")[2].indexOf("主") > -1 ? true : false;
  185.             return rtn;
  186.         }else{
  187.             return rtn;
  188.         }
  189.     }
  190.  
  191.     function _getDT(num){
  192.     /*
  193.     ------------------
  194.         _getDT : dt[num]のinnerTextを返す
  195.         num    : _gvn済みのnum
  196.     ------------------
  197.     */
  198.         var rtn = document.querySelectorAll("dt")[num].innerText;
  199.         return rtn;
  200.     }
  201.  
  202.     function _gvn(kari){
  203.     /*
  204.     ------------------
  205.         _gvn : 入力したレス番号が存在するかチェックすると共に補正する関数(_gvnは_getValidNumberの改良版)。該当するレス番号が無い場合はundefinedを返す
  206.         kari : 入力したレス番号
  207.     ------------------
  208.     */
  209.     //変数
  210.         var rtn;
  211.         var isTypeOK = false;
  212.         var isRangeOK = false;
  213.         var kariBreakFlag = true;
  214.         var inc = 0;
  215.         var inc_computed = 0;
  216.         var d;
  217.         var d_temp;
  218.  
  219.     //形式チェック
  220.         isTypeOK = typeof(kari) === "number" ? true : false;
  221.         isRangeOK = kari > 0 && kari < 1006 ? true : false;
  222.  
  223.     //論理チェック
  224.         if(isTypeOK && isRangeOK){
  225.             //dtタグのノードリストを取得
  226.             d = document.querySelectorAll("dt");
  227.  
  228.             do{
  229.                 inc_computed = inc % 2 === 0 ? (-1) * (inc/2) : (inc+1)/2;//inc_computed := {-0,+1,-1,+2,-2,...}
  230.                 rtn = kari - 1 + inc_computed;//添字の補正
  231.                 d_temp = d[ rtn ];//d[ rtn ] is Object if exists unless undefined
  232.                 d_temp = d_temp !== undefined ? d_temp.getElementsByClassName("num")[0] : undefined;
  233.                 d_temp = d_temp !== undefined ? d_temp.innerText - 0 : undefined;
  234.  
  235.                 if( d_temp === kari ){
  236.                     kariBreakFlag = false;
  237.                 }else{
  238.                     inc++;
  239.                     //incが1000を超えていた場合、探索打ち切り
  240.                     kariBreakFlag = inc > 1000 ? false : true;
  241.                     rtn = inc > 1000 ? undefined : rtn;
  242.                 }
  243.             }while(kariBreakFlag);
  244.             return rtn;
  245.         }else{
  246.             return rtn;
  247.         }
  248.     }
  249.  
  250. /* public API */
  251.     if(_isInitSuccess){
  252.         return{
  253.             VERSION : _VERSION,
  254.             BBSNAME : _BBSNAME,
  255.             SURETAI : _SURETAI,
  256.  
  257.             getLastResNum : _getLastResNum,
  258.             getRes : _getRes,
  259.             getResName : _getResName,
  260.             getResTime : _getResTime,
  261.             getResID : _getResID,
  262.  
  263.             isSurenusi : _isSurenusi
  264.         };
  265.     }else{
  266.         return undefined;
  267.     }
  268. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement