Awn_pastebin

Op2ools.js

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