咕咕时代kf复数引用脚本

在咕咕镇时代对kf的帖子进行复数引用

目前為 2020-03-02 提交的版本,檢視 最新版本

// ==UserScript==
// @name        咕咕时代kf复数引用脚本
// @namespace   https://gf.qytechs.cn/users/14059
// @description 在咕咕镇时代对kf的帖子进行复数引用
// @include     https://bbs.ikfol.com/read.php*
// @include     https://kf.miaola.info/read.php*
// @author      setycyas
// @icon        https://gitee.com/miaolapd/KF_Online_Assistant/raw/master/icon.png
// @version     0.01
// @grant       GM_getValue
// @grant       GM_setValue
// @run-at      document-end
// @license     MIT
// ==/UserScript==

(function(){
'use strict';
console.log("咕咕时代kf复数引用脚本正在运行!");

/* 我的kf帖子阅读class */
class kfReader{
  
  /* 以阅读的帖子的url进行初始化 */
  constructor(url){
    
    this.RECORDS_PER_PAGE = 10; // 每一页的主题数,常量
    
    this.url = url;
    // 从url找出帖子的pid与页数
    var pidAndPage = this._getPidAndPage(url);
    this.pid = pidAndPage['pid'];
    this.page = pidAndPage['page'];
    // 有效楼层表
    this.floors = [];
    for(var i = 0;i < this.RECORDS_PER_PAGE;i++){
      var floor = i+(this.page-1)*this.RECORDS_PER_PAGE; // 楼层
      if (!document.getElementById('floor'+floor)){
        break; // 楼层结束
      }else{
        this.floors.push(floor);
      }
    }      
    // 各层的内容,包括作者,文本,引用的a元素,格式为:
    // {楼层:{'author'(字符串),'text'(字符串), 'a'(html元素)}}
    this.floorContent = {};
    for(var i = 0;i < this.floors.length;i++){
      var floor = this.floors[i]; // 楼层
      this.floorContent[floor] = {}
      this.floorContent[floor]['author'] = this._getAuthor(floor);
      this.floorContent[floor]['text'] = this._getText(floor);
      this.floorContent[floor]['a'] = this._getQuoteA(floor);     
    }
  }
  
  /* 在控制台显示阅读结果 */
  show(){
    var log = console.log;
    log('kfReader本页面阅读结果显示:');
    log('pid =', this.pid);
    log('page =', this.page);
    log('楼层信息:');
    for(var i = 0;i < this.floors.length;i++){
      var floor = this.floors[i];
      log('--- 第'+floor+'楼信息: ---');
      log('作者:', this.floorContent[floor]['author']);
      log('内容前20字:', this.floorContent[floor]['text'].substr(0,20));
      if (this.floorContent[floor]['a']){
        log('是否找到了引用的a标签:', '是');
      }else{
        log('是否找到了引用的a标签:', '否');
      }
    }
  }
  
  /* 获取当前url的pid(帖子唯一标识号码)与页数. */
  _getPidAndPage(url){
    // 指定返回对象,设定默认值
    var result = {'pid':null, 'page':1};
    // 匹配pid
    var pidReg = /\?tid\=(\d+)/;
    var matchPid = url.match(pidReg);
    if (matchPid){
      result['pid'] = matchPid[1];
    }
    // 匹配page
    var pageReg = /&page\=(\d+)/;
    var matchPage = url.match(pageReg);
    if (matchPage){
      result['page'] = parseInt(matchPage[1]);
    }
    // 返回
    return result;
  }
  
  /* 获取第floor层的作者,查找失败返回null */
  _getAuthor(floor){
    var n = floor%10;
    var authorsA = document.getElementsByClassName('readidmsbottom_n');
    if (authorsA.length <= n){return null;}
    return authorsA[n].innerText;
  }
  
  /* 获取第floor层的文本,查找失败返回null */
  _getText(floor){
    // 首先获取楼层标识div,同时测试该楼层是否存在
    var floorFlagDiv = document.getElementById('floor'+floor);
    if (!floorFlagDiv){
      console.log('找不到楼层'+floor);
      return null;
    }
    // 获取文本相关的div,并处理其中文本
    var textDiv = floorFlagDiv.parentElement;
    var textSplit = textDiv.innerText.split('TOP\n看TA\n回复\n菜单\n')[1].split('关键词');
    var text = '';
    if (textSplit.length == 1){
      text = textSplit[0];
    }else{
      for(var i = 0;i < textSplit.length-1;i++){
        if (i > 0){text = text+'关键词';}
        text = text + textSplit[i];
      }
    }
    return text;
  }
  
  /* 查找第floor楼的引用帖子a标签,查找失败返回null */
  _getQuoteA(floor){
    //第floor层
    var div = document.getElementById('floor'+floor);
    if (!div){return null;}
    //查找所有的a,直到内部文本为包含'引用'
    var a = div.getElementsByTagName('a');
    for(var i = 0;i < a.length;i++){
      if(a[i].innerText.indexOf('引用') > -1){
        return a[i];
      }
    }
    return null;
  }
 
}
  
/* 脚本开始 */

/* 使用了GM数据库记录,有3个量:
1.pid,记录上一次的帖子pid,若当前新开帖子pid一样,则使用上次的记录,否则清空记录
2.names,引用的姓名字符串,每个名字都以逗号结尾
3.text,所有的引用文本
*/

var kf = new kfReader(window.location.href);
//通过对比帖子pid,决定是否刷新记录,打开新帖子后旧帖子的引用就无效了.
var oldPid = GM_getValue('pid', '');
if (kf.pid != oldPid){
  GM_setValue('pid', kf.pid);
  GM_setValue('text', '');
  GM_setValue('names', '');
}
var text = GM_getValue('text', ''); //引用文本
var names = GM_getValue('names', '');//引用的名字

// 改变引用帖子的a标签的行为
for(var i = 0;i < kf.floors.length;i++){
  var floor = kf.floors[i];
  var a = kf.floorContent[floor]['a'];
  a.href = 'javascript:';
  a['quoteFloor'] = floor; // 指定一个叫做quoteId的属性,方便引用
  jQuery(a).click(function(e){
    var quoteFloor = e.target['quoteFloor'];  // a标签指定的回复楼层
    // 作者处理
    var author = kf.floorContent[quoteFloor]['author'];
    // 当作者不在names中才添加作者名
    if (names.indexOf(author+',') < 0){
      names = names+author+',';
      GM_setValue('names', names);
    }
    // 文本处理
    text = text+'[quote]引用'+quoteFloor+'楼 '+author+'的帖子\n'+kf.floorContent[quoteFloor]['text']+'\n[/quote]\n\n'; // 添加文本
    GM_setValue('text', text);
    // 显示
    jQuery('input.input[name=diy_guanjianci]').val(names.replace(/,$/, ''));
    jQuery('textarea[name=atc_content]').val(text).focus();
  });
}

/* 脚本结束 */
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址