fork download
  1. //【登録場所】レス表示
  2. //【ラベル】[latfilter.js] 取得済みの現スレからIDでレス抽出
  3. //【コマンド】${SCRIPT:Frw} latfilterId.js ローカル板のフォルダ名
  4. //【コマンド】${SCRIPT:Frw} latfilterId.js ローカル板のフォルダ名 $TODAYSPAN
  5. // ↑ 引数 $TODAYSPAN … 現スレに加えて、DAT落ちスレッドのレスの内同じ日付のレスも抽出対象に含める
  6. //【ラベル2】[latfilter.js] 元レスにジャンプ
  7. //【コマンド2】${SCRIPT:Frw} latfilterId.js ローカル板のフォルダ名 $GOTORES
  8. //【内容】右クリした位置のレスのIDで、そのスレッドの所属板のDAT落ちを除く既得ログから
  9. // IDでレスを抽出して、ローカルスレッドを作成する。
  10. //【更新日】 2012/01/27
  11. //【スクリプト】
  12. function log(format /*, ...*/)
  13. {
  14. var args = arguments;
  15. var message = format.replace(/\{(\d)\}/g, function(m, c) { return args[parseInt(c) + 1]; });
  16. v2c.println("[latfilter.js] " + message);
  17. }
  18. function statuslog(format /*, ...*/)
  19. {
  20. var args = arguments;
  21. var message = format.replace(/\{(\d)\}/g, function(m, c) { return args[parseInt(c) + 1]; });
  22. v2c.context.setStatusBarText('[latfilter.js] ' + message);
  23. }
  24. function getMSec(date) {
  25. var yy = date.getYear();
  26. var mm = date.getMonth();
  27. var dd = date.getDate();
  28. if (yy < 2000) { yy += 1900; }
  29. return (new Date(yy, mm, dd)).getTime();
  30. }
  31. (function() {
  32. if (v2c.context.args.length == 0) {
  33. statuslog("外部コマンドにローカル板のフォルダ名が指定されていません");
  34. return false;
  35. }
  36. var GOTORES = false;
  37. var TODAYSPAN = false;
  38. var local = null;
  39. for (var i = 0; i < v2c.context.args.length; i++) {
  40. if (v2c.context.args[i].match(/\$GOTORES/i)) {
  41. GOTORES = true;
  42. continue;
  43. }
  44. if (v2c.context.args[i].match(/\$TODAYSPAN/i)) {
  45. TODAYSPAN = true;
  46. continue;
  47. }
  48. local = v2c.context.args[i];
  49. }
  50.  
  51. local = v2c.getLocalBoard(local);
  52. if (!local) {
  53. v2c.context.setStatusBarText("ローカル板( " + v2c.context.args[0] + " )を取得できませんでした");
  54. return false;
  55. }
  56. if (GOTORES) {
  57. var th = v2c.context.thread;
  58. if ((!th) || (!th.local)) {
  59. statuslog("latfilterId.jsで作成したローカルスレッド以外では元レスジャンプ機能が使用できません。");
  60. return false;
  61. }
  62. var ldat = v2c.readLinesFromFile(new java.io.File(v2c.saveDir + '/log/localboard/' + local.key + '/' + th.key + '.dat'));
  63. var resNum = v2c.context.res.number - 1;
  64. if ((!ldat) || ldat.length <= resNum) { statuslog("ローカルスレッドのDATが読み込めませんでした。"); return false; }
  65. if (String(ldat[resNum]).match(/<!--V2CANOT src="([^"]+)"-->/)) {
  66. var refURL = RegExp.$1.replace(/:/g, '/').split('/');
  67. refURL = 'http://' + refURL[0] + '/test/read.cgi/' + refURL[1] + '/' + refURL[2] + '/' + refURL[3];
  68.  
  69. v2c.openURL(new java.net.URL(refURL));
  70. return true;
  71. }
  72. return false;
  73. }
  74.  
  75. var tmp = v2c.context.res;
  76. if (!tmp) { return; }
  77. var today, tomorrow, spanKeys = {};
  78. if (TODAYSPAN) {
  79. var tdtmp = v2c.context.res.time;
  80. if (tdtmp == 0) {
  81. TODAYSPAN = false;
  82. log("レスから日時を取得出来ませんでした。TODAYSPANモードを解除して実行します");
  83. } else {
  84. today = new Date();
  85. today.setTime(tdtmp);
  86. today = getMSec(today);
  87. tomorrow = today + 86400000;
  88. }
  89. var threadst = v2c.readStringFromFile(new java.io.File(v2c.context.thread.localFile.getParent() + '/threadst.txt'));
  90. threadst = String(threadst).split('\n');
  91. var tp, sres, lres, key;
  92. for (var i = threadst.length - 1; i > 0; i--) {
  93. if (threadst[i].length == 0) { continue; }
  94. tp = threadst[i].split(',');
  95.  
  96. key = tp[1].split('.')[0];
  97. sres = parseInt(key + '000');
  98.  
  99. if (tomorrow < sres) { continue; } // 日付変更でIDが変わったあとのスレッドは対象外
  100. lres = tp[11]; // TLAST 最終レス時刻
  101. if (lres.length < 4) {
  102. lres = tp[6]; // TLASTGET 最終取得時刻
  103. if (lres.length < 4) { continue; }
  104. }
  105. lres = parseInt(lres);
  106. if (lres < today) { continue; } // 最終レスがレスの日以前のスレッドは対象外
  107. spanKeys[key] = true;
  108. }
  109. }
  110. var resId = tmp.id;
  111. if ((!resId) || resId.length < 4) { v2c.context.setStatusBarText('[latfilterId.js] IDが取得できませんでした。(レスNo.' + tmp.number + ')'); return; }
  112. var resDate = tmp.date.split(' ')[0];
  113. var bdlog = v2c.context.thread.board.threadsWithLog;
  114. var outresArray = [];
  115.  
  116. nextthread:
  117. for (var i = 0; i < bdlog.length; i++) {
  118. var atfirst = true;
  119. if (!bdlog[i].live) {
  120.  
  121. if ((!TODAYSPAN) || (!spanKeys[bdlog[i].key])) { continue; }
  122. for (var j = bdlog[i].localResCount - 1; j >= 0; j--) {
  123. if (j >= 1000) { j = 999; }
  124. var tres = bdlog[i].getRes(j);
  125. if (tres.time < today) {
  126. continue nextthread;
  127. }
  128. if (tres.time < tomorrow && tres.id == resId) {
  129. if (atfirst) {
  130. outresArray.push(v2c.createResSeparator(bdlog[i].title + ' ( ' + bdlog[i].url + ' )'));
  131. atfirst = false;
  132. }
  133. outresArray.push(tres);
  134. }
  135. }
  136. continue;
  137. }
  138. for (var j = 0; j < bdlog[i].localResCount; j++) {
  139. tmp = bdlog[i].getRes(j);
  140. if (tmp.id == resId) {
  141. if (atfirst) {
  142. outresArray.push(v2c.createResSeparator(bdlog[i].title + ' ( ' + bdlog[i].url + ' )'));
  143. atfirst = false;
  144. }
  145. outresArray.push(tmp);
  146. }
  147. }
  148. }
  149. if (outresArray.length == 0) {
  150. statuslog('IDに一致するレスが見つかりませんでした。現スレ以外では外部コマンドに$TODAYSPAN引数を指定して下さい。');
  151. return false;
  152. }
  153. var lth = local.createLocalThread("ID:"+resId+"でレス抽出@"+v2c.context.thread.board.name, outresArray);
  154. if (!lth) {
  155. statuslog("ローカルスレッドが作成できませんでした。");
  156. return false;
  157. }
  158. lth.open(false);
  159. return true;
  160. })();
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty