Greasy Fork

妖火网增强插件

获得焦点时回复框自动停靠、加载更多楼层、回复任意楼层、回复后快速返回、双击定位评论区、发帖增强、图床直达

当前为 2022-08-27 提交的版本,查看 最新版本

// ==UserScript==
// @name         妖火网增强插件
// @namespace    https://yaohuo.me/
// @version      0.41
// @description  获得焦点时回复框自动停靠、加载更多楼层、回复任意楼层、回复后快速返回、双击定位评论区、发帖增强、图床直达
// @author       外卖不用券(id:23825)
// @match        https://*.yaohuo.me/*
// @icon         https://yaohuo.me/css/favicon.ico
// @license      MIT
// ==/UserScript==

if (
  /^\/bbs-.*\.html$/.test(window.location.pathname) ||
  "/bbs/book_view.aspx" === window.location.pathname
) {
  // 回复框停靠
  let content = document.getElementsByClassName("content")[1];
  let form = document.getElementsByName("f")[0];
  content.removeChild(form);
  let newDiv = document.createElement("div");
  let clazz = document.createAttribute("class");
  clazz.value = "sticky";
  newDiv.setAttributeNode(clazz);
  newDiv.style.cssText = "padding: 7px; background-color: #fff";
  newDiv.innerHTML = form.outerHTML;
  document.body.insertBefore(newDiv, content);
  let sticky = false;
  newDiv.onclick = () => {
    let form = document.getElementsByName("f")[0];
    let sendmsg = document.getElementsByName("sendmsg")[0];
    let span = document.createElement("span");
    let textNode = document.createTextNode("取消回复停靠");
    span.appendChild(textNode);
    span.style.cssText = "float: right";
    span.onclick = (e) => {
      e.cancelBubble = true;
      newDiv.style.cssText = "padding: 7px; background-color: #fff";
      form.removeChild(span);
      sticky = false;
    };
    if (!sticky) {
      newDiv.style.cssText =
        "position: sticky; top: 0; bottom: 0; padding: 7px; background-color: #fff";
      form.insertBefore(span, sendmsg);
      sticky = true;
    }
  };
  // 加载更多回复
  let more = document.getElementsByClassName("more")[0];
  let moreLink = more.getElementsByTagName("a")[0];
  let totalpage = Math.ceil(
    /getTotal=\d+/.exec(moreLink.href)[0].slice(9) / 15
  );
  let currpage = 1;
  let topage = parseInt(/&page=\d+/.exec(moreLink.href)[0].slice(6));
  let tourl = moreLink.href.replace("&page=" + topage, "");
  //   more.removeChild(moreLink);
  let newMoreLink = document.createElement("a");
  let span1 = document.createElement("span");
  let span1_id = document.createAttribute("id");
  span1_id.value = "YH_show_loadimg";
  span1.setAttributeNode(span1_id);
  newMoreLink.appendChild(span1);
  let span2 = document.createElement("span");
  let span2_id = document.createAttribute("id");
  span2_id.value = "YH_show_tip";
  span2.setAttributeNode(span2_id);
  span2.appendChild(
    document.createTextNode("加载更多(" + currpage + "/" + totalpage + ")")
  );
  newMoreLink.appendChild(span2);
  newMoreLink.style.width = "50%";
  more.appendChild(newMoreLink);
  moreLink.style.width = "50%";
  more.appendChild(moreLink);
  newMoreLink.onclick = () =>
    YH_show_next(totalpage, 15, currpage, tourl, "page");
  // 回复任意楼层
  replyAny();
  // 双击定位评论区
  let bbscontent = document.getElementsByClassName("bbscontent")[0];
  bbscontent.ondblclick = () =>
    document.getElementsByClassName("sticky")[0].scrollIntoView(true);
  // 妖火图床
  form = document.getElementsByName("f")[0];
  form.removeChild(form.lastChild);
  form.insertAdjacentHTML(
    "beforeend",
    `<a href='https://yh-pic.ihcloud.net/' style='font-size:14px; margin-left: 10px'>妖火图床</a><br>`
  );
} else if (
  "/bbs/book_re.aspx" === window.location.pathname &&
  !window.location.search
) {
  // 回复后快速返回
  window.location.href = document
    .getElementsByClassName("tip")[0]
    .getElementsByTagName("a")[0].href;
} else if (
  [
    "/bbs/book_view_add.aspx",
    "/bbs/book_view_sendmoney.aspx",
    "/bbs/book_view_addvote.aspx",
    "/bbs/book_view_addfile.aspx",
    "/bbs/book_view_mod.aspx",
  ].includes(window.location.pathname)
) {
  let bookContent = document.getElementsByName("book_content")[0];
  bookContent.insertAdjacentHTML(
    "beforebegin",
    `<div class='btBox'>
        <div class='bt2'>
            <a style='width:25%' id='ubb_a'>超链接</a>
            <a style='width:25%' id='ubb_img'>图片</a>
            <a style='width:25%' id='ubb_movie'>视频</a>
            <a style='width:25%' id='ubb_more'">更多...</a>
        </div>
    </div>
    <div class='more_ubb_tools' style='display: none'>
        <div class='btBox'>
            <div class='bt2'>
                <a style='width:25%' id='ubb_f'>颜色</a>
                <a style='width:25%' id='ubb_b'">加粗</a>
                <a style='width:25%' id='ubb_s'>删除</a>
                <a style='width:25%' id='ubb_audio'>音频</a>
            </div>
        </div>
        <div class='btBox'>
            <div class='bt2'>
                <a href='https://yaohuo.me/tuchuang/'>妖火图床</a>
                <a href='https://aapi.eu.org/dy'>好记解析</a>
            </div>
        </div>
    </div>`
  );
  document.getElementById("ubb_a").addEventListener("click", () => {
    insertText(bookContent, "[url][/url]", 6);
  });
  document.getElementById("ubb_f").addEventListener("click", () => {
    insertText(bookContent, "[forecolor=#FF0000][/forecolor]", 12);
  });
  document.getElementById("ubb_b").addEventListener("click", () => {
    insertText(bookContent, "[b][/b]", 4);
  });
  document.getElementById("ubb_s").addEventListener("click", () => {
    insertText(bookContent, "[strike][/strike]", 9);
  });
  document.getElementById("ubb_img").addEventListener("click", () => {
    insertText(bookContent, "[img][/img]", 6);
  });
  document.getElementById("ubb_movie").addEventListener("click", () => {
    insertText(bookContent, "[movie=100%*100%][/movie]", 8);
  });
  document.getElementById("ubb_audio").addEventListener("click", () => {
    insertText(bookContent, "[audio=X][/audio]", 8);
  });
  document.getElementById("ubb_more").addEventListener("click", () => {
    let ubb_tool = document.getElementsByClassName("more_ubb_tools")[0];
    ubb_tool.style.display =
      ubb_tool.style.display === "none" ? "block" : "none";
  });
}

function insertText(obj, str, offset) {
  if (document.selection) {
    var sel = document.selection.createRange();
    sel.text = str;
  } else if (
    typeof obj.selectionStart === "number" &&
    typeof obj.selectionEnd === "number"
  ) {
    var startPos = obj.selectionStart,
      endPos = obj.selectionEnd,
      cursorPos = startPos,
      tmpStr = obj.value;
    obj.value =
      tmpStr.substring(0, startPos) +
      str +
      tmpStr.substring(endPos, tmpStr.length);
    cursorPos += str.length;
    obj.selectionStart = obj.selectionEnd = cursorPos - offset;
  } else {
    obj.value += str;
  }
  document.getElementsByName("book_content")[0].focus();
}

function replyAny() {
  let sticky = document.getElementsByClassName("sticky")[0];
  let recontent = document.getElementsByClassName("recontent")[0].childNodes;
  for (let i = 0; i < recontent.length; i++) {
    let replyLink = recontent[i].getElementsByTagName("a")[0].href;
    recontent[i].onclick = () => {
      let reply = /reply=\d+/.exec(replyLink)[0].slice(6);
      let touserid = /touserid=\d+/.exec(replyLink)[0].slice(9);
      sticky.style.cssText =
        "position: sticky; top: 0; bottom: 0; padding: 7px; background-color: #fff";
      sticky.click();
      let form = document.getElementsByName("f")[0];
      if (form.firstChild.tagName === "B") {
        form.removeChild(form.firstChild);
        form.removeChild(form.firstChild);
        form.removeChild(form.firstChild);
        form.removeChild(form.firstChild);
      }
      form.insertAdjacentHTML(
        "afterbegin",
        "<b>回复" +
          reply +
          '楼</b><select name="sendmsg2"><option value="1">通知对方</option><option value="0">不予通知</option></select><span class="noreply" style="float: right">取消回复楼层</span><br>'
      );
      if (form.lastChild.tagName === "INPUT") {
        form.removeChild(form.lastChild);
        form.removeChild(form.lastChild);
      }
      form.insertAdjacentHTML(
        "beforeend",
        '<input type="hidden" name="reply" value="' + reply + '">'
      );
      form.insertAdjacentHTML(
        "beforeend",
        '<input type="hidden" name="touserid" value="' + touserid + '">'
      );
      document.getElementsByClassName("noreply")[0].onclick = () => {
        form.removeChild(form.firstChild);
        form.removeChild(form.firstChild);
        form.removeChild(form.firstChild);
        form.removeChild(form.firstChild);
        form.removeChild(form.lastChild);
        form.removeChild(form.lastChild);
      };
    };
  }
}

// YH_common.js
var xmlhttp = null;
var YH_now_currpage = 0;
var YH_page_total = 0;
var YH_scoll_downEnd = 0;

function YH_show_next(YH_total, YH_pagesize, YH_currpage, tourl, pagetype) {
  YH_page_total = parseInt(YH_total);
  var pagesize = parseInt(YH_pagesize);
  var currpage = parseInt(YH_currpage);
  if (YH_now_currpage == 0) {
    YH_now_currpage = currpage + 1;
  } else {
    YH_now_currpage = YH_now_currpage + 1;
  }
  document.getElementById("YH_show_loadimg").innerHTML =
    '<span id="loadimg">&nbsp;</span>';
  document.getElementById("YH_show_tip").innerHTML =
    "正在努力加载(" + YH_now_currpage + "/" + YH_page_total + ")中";
  if (YH_now_currpage > YH_page_total) {
    document.getElementById("YH_show_loadimg").innerHTML = "";
    document.getElementById("YH_show_tip").innerHTML = "没有更多了";
  } else {
    tourl = tourl + "&" + pagetype + "=" + YH_now_currpage;
    LoadXML_Async(tourl);
  }
}

function LoadXML_Async(tourl) {
  try {
    if (window.XMLHttpRequest) {
      xmlhttp = new XMLHttpRequest();
      if (xmlhttp.overrideMimeType) {
        xmlhttp.overrideMimeType("text/xml");
      }
    } else if (window.ActiveXObject) {
      var activexName = ["MSXML2.XMLHTTP", "Microsoft.XMLHTTP", ""];
      for (var i = 0; i < activexName.length; i++) {
        try {
          xmlhttp = new ActiveXObject(activexName[i]);
          break;
        } catch (e) {}
      }
    }
    xmlhttp.onreadystatechange = YH_CallBack;
    xmlhttp.open("GET", tourl, true);
    xmlhttp.send(null);
  } catch (e) {
    document.getElementById("YH_show_loadimg").innerHTML =
      '<span id="loadimg">&nbsp;</span>';
    document.getElementById("YH_show_tip").innerHTML = "加载出错了!";
  }
}

function YH_CallBack() {
  if (xmlhttp == null) {
    return;
  }
  if (xmlhttp.readyState == 4) {
    if (xmlhttp.status == 200) {
      var responseText = xmlhttp.responseText;
      var st = responseText.indexOf("<!--listS-->");
      var et = responseText.indexOf("<!--listE-->");
      if (st < 0 || et < 0) {
        document.getElementById("YH_show_loadimg").innerHTML = "";
        document.getElementById("YH_show_tip").innerHTML = "加载完全部了!";
      } else {
        responseText = responseText.substring(st + 12, et);
        document.getElementsByClassName("recontent")[0].style.display = "block";
        document.getElementsByClassName("recontent")[0].innerHTML +=
          responseText;
        replyAny();
        if (YH_now_currpage == YH_page_total) {
          document.getElementById("YH_show_loadimg").innerHTML = "";
          document.getElementById("YH_show_tip").innerHTML = "没有更多了";
        } else {
          document.getElementById("YH_show_loadimg").innerHTML = "";
          document.getElementById("YH_show_tip").innerHTML =
            "加载更多(" + YH_now_currpage + "/" + YH_page_total + ")";
        }
      }
    }
  }
}