// ==UserScript== // @name 咕咕时代kf复数引用脚本 // @namespace https://greasyfork.org/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 // @downloadURL none // ==/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(); }); } /* 脚本结束 */ })();