南加工具

for all

// ==UserScript==
// @name         南加工具
// @namespace    http://tampermonkey.net/
// @version      1.1.6
// @description  for all
// @license      GPLv3
// @author       unascribed
// @match        *://bbs.summer-plus.net/*
// @match        *://www.spring-plus.net/*
// @match        *://www.level-plus.net/*
// @match        *://www.snow-plus.net/*
// @match        *://www.north-plus.net/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';
    const spIndex = {
        "main": "48",
        "prefix": "thread.php?fid=",
        "suffix": ".html",
        "deliIndex": 3,
    }
    const spPrefix = [
        "south",
        "north",
        "summer",
        "snow",
        "spring",
        "level",

    ]
    const hoverArgs = {
        "basic": "black",
        "dest": "rgb(52, 152, 219)",
    }
    const fontCss = {
        "fontWeight": "600",
        "fontFamily": "SF Pro Text,SF Pro Icons,Helvetica Neue,Helvetica,Arial,sans-serif",
    }
    const aCss = {
        "cursor": "pointer",
        "textDecoration": "none",
        "color": hoverArgs.basic,
    }
    const regToUse = {
        "bd": {
            "code": "提取码",
            "url": /https:[\w\/\.\?\-_&=]*/g,
            "urlStr": "pan.baidu.com",
            "codeStr": /[\w]*/,
        },
    }
    const webs = {
        "sp": "-plus",
    }
    const sp = {
        "spMsg": "action-read",
        "spRead": "thread",
        "spSell": "tid"
    }
    const spFont = {
        "basic": "rgb(255, 255, 255)",
        "dest": hoverArgs.dest,
    }
    function getSp() {
        if (!matchAny(spPrefix)) return;
        spInit()
        adapt(sp)
    }

    // current url
    const crtUrl = window.location.href

    for (let w in webs) {
        let re = webs[w];
        if (crtUrl.match(re) != null && crtUrl.match(re)[0] === re) {
            let methodName = "get" + w.replace(w[0], w[0].toUpperCase()) + "()"
            try {
                eval(methodName)
            } catch (ignore) {
            }
        }
    }

    function adapt(site) {
        for (let i in site) {
            let re = site[i];
            if (crtUrl.match(re) != null && crtUrl.match(re)[0] === re) {
                eval(i + "()")
            }
        }
    }
    //*********************** south-plus ***********************
    function spInit() {
        let barCss = spBarCss()
        let bar = spBar();
        let stuff = create("span", "main")
        let cp = clearPic(null, "span")
        let scrollBtn = create("span", "fall")
        scrollBtn.style.marginRight = "100px"
        addBefore(bar.bar, [stuff, cp, scrollBtn], bar.son)
        stuff.onclick = function () {
            let crt = window.location.href
            window.location.href = "https://" + crt.split("/")[2] + "/thread.php?fid=48&page=1"
            scrollDown()
        }
        scrollBtn.onclick = function () {
            scrollDown();
        }
        let arr = [scrollBtn, stuff, cp]
        wrapEles(arr, barCss, spFont)
    }
    function spBar() {
        let bar = ele("guide")
        return {
            "bar": bar,
            "son": eles("li", "tag", bar)[0]
        }
    }
    function spBarCss() {
        return {
            "color": "#ffffff",
            "float": "left",
            "marginTop": "7px",
            "display": "inline-block",
            "padding": "0px 10px",
            "fontWeight": "unset",
        }
    }
    //sp message
    function spMsg() {
        let btn = eles("current link5 b")[0]
        setText(btn, "点我跳转")
        let btnCss = {
            "fontSize": "13px",
        }
        wrapEle(btn, merge(btnCss, fontCss))
        btn.onclick = function () {
            gotoArticle()
        }
    }
    function gotoArticle() {
        let re = /http.*\w/g;
        let dest = eles("td1")[3].nextElementSibling;
        let sender = firstChild(eles("td1")[0].nextElementSibling).textContent

        if (sender == "SYSTEM" || sender == "3ccc287a") {
            dest = dest.getElementsByTagName("a")[0].href
        } else {
            dest = dest.textContent.match(re)[0]
        }
        window.open(dest.replace(dest.split("/")[2], crtUrl.split("/")[2]))
    }
    //sp mainpage order
    function spRead() {
        let btnCss = {
            "background": "#D6D6D6 transparent",
            "color": "#333333",
            "height": "18px",
            "padding": ".2em .6em",
            "display": "inline-block",
            "line-height": "16px",
            "fontSize": "12px",
            "cursor": "pointer",
            "textDecoration": "none"
        }
        let p = eles("fl")[6];
        let opts = eles("orderway", "name")[0].options
        for (let i = 0, len = opts.length; i < len; i++) {
            let btn = create("span");
            setText(btn, opts[i].textContent);
            setCss(btn, btnCss)
            p.appendChild(btn)
            btn.onclick = function () {
                spOrder(opts, i)
                scrollDown()
            }
            btn.onmousemove = function () {
                if (this.style.color == "rgb(51, 51, 51)") {
                    this.style.color = "#fff";
                    this.style.background = "#bbbbbb"
                }
            }
            btn.onmouseleave = function () {
                if (this.style.color == "rgb(255, 255, 255)") {
                    this.style.background = ""
                    this.style.color = "#333333";
                    this.style.background = "#D6D6D6 transparent"
                }
            }
        }
    }

    function spOrder(opts, i) {
        opts[i].selected = true;
        eles("btn")[0].click()
    }
    function spSell() {
        let sellLevel = [0, 1, 2, 3, 5]
        let candicates = eles("tpc_content")
        let total = candicates.length
        let p = candicates[total - 1]
        let s = eles("span", "tag", p)[1]
        let btnCss = {
            "display": "inline-block",
            "padding": "4px 8px",
            "position": "relative",
            "top": "35px",
        }
        for (let i = 0, len = sellLevel.length; i < len; i++) {
            let levelBtn = create("a");
            setText(levelBtn, levelBtn.value = sellLevel[i]);
            wrapEle(levelBtn, merge(btnCss, fontCss, aCss))
            p.appendChild(levelBtn)
            levelBtn.onclick = function () {
                doSpSell(levelBtn);
            }
        }
        let sellInput = create("input");
        sellInput.setAttribute("type", "text");
        sellInput.setAttribute("id", "linkInput");
        sellInput.setAttribute('placeholder', 'type link');
        let siCss = {
            "position": "relative",
            "top": "34px",
            "left": "10px",
            "border": "1px solid #3498db",
        }
        setCss(sellInput, merge(siCss, fontCss))
        p.appendChild(sellInput)

        let diyPrice = create("input");
        diyPrice.setAttribute("type", "text");
        let diyCss = {
            "left": "25px",
            "width":"26px",
            "height":"15px",
        }
        setCss(diyPrice, merge(siCss,diyCss))
        p.appendChild(diyPrice)
        diyPrice.addEventListener("keyup", function(event) {
            event.preventDefault();
            if (event.keyCode === 13) {
                doSpSell(this)
            }
        })

        let cdcs = eles("tipad")
        let cdcsSize = cdcs.length - 1
        let tipsParent = cdcs[cdcsSize]
        let tipsText = "(复制内容到输入框、再点击左侧的数字,即可生成对应数字价格的出售内容)"
        let diyText = "(自定义价格,在右边的小框中输入价格后按回车)"
        let tips = create("span", tipsText);
        let diyTips = create("span", diyText);
        let tipCss = {
            "position": "relative",
            "top": "-32px",
            "left": "132px",
            "fontSize": "12px",
        }
        let diyTipsCss = {
            "top": "-60px",
            "left": "-47px",
        }
        setCss(tips, tipCss)
        setCss(diyTips, merge(tipCss,diyTipsCss))
        tipsParent.appendChild(tips)
        tipsParent.appendChild(diyTips)

    }
    function doSpSell(btn) {
        let price = btn.value;
        let link = ele("linkInput").value;
        let text = eles("textarea", "tag")[0].value
        if (text) {
            eles("textarea", "tag")[0].value += "\n"
        }
        let msg = "";
        if (link.match(regToUse.bd.urlStr)) {
            let mt = link.match(regToUse.bd.url)
            msg = mt[0] + "\n";
            link = getBdCode(link)
        }
        msg += "[sell=" + price + "]" + link;
        msg += "[/sell]"
        eles("textarea", "tag")[0].value += msg;
    }


    //************* tool *******************
    function scrollBtn(parent = null) {
        let btn = create("a", "fall")
        if (parent) {
            parent.appendChild(btn)
        }
        let btnCss = {
            "marginLeft": "5px",
            "display": "inline-block",
        }
        wrapEle(btn, btnCss)
        btn.onclick = function () {
            scrollDown(900);
        }
        return btn;
    }
    //scroll
    function scrollDown(offset = 1399) {
        document.documentElement.scrollTop = offset;
    }

    function clearPic(parent = null, type = "a") {
        let clear = "clear";
        let resume = "resume";
        let btn = create(type, clear)
        if (parent) {
            parent.appendChild(btn)
        }
        let btnCss = {
            "display": "inline-block",
        }
        let flag = true;
        let oldDisplays = []
        wrapEle(btn, btnCss)
        btn.onclick = function () {
            let imgs = eles("img", "tag");
            let dp = imgs[0].style.display;
            if (!flag && oldDisplays.length > 0) {
                for (let i = 0, len = imgs.length; i < len; i++) {
                    imgs[i].style.display = oldDisplays[i]
                }
                flag = true;
                setText(btn, clear)
            } else {
                if (oldDisplays.length == 0) {
                    for (let i = 0, len = imgs.length; i < len; i++) {
                        oldDisplays.push(imgs[i].style.display);
                    }
                }
                for (let i = 0, len = imgs.length; i < len; i++) {
                    imgs[i].style.display = "none"
                }
                flag = false;
                setText(btn, resume)
            }
        }
        return btn;
    }
    function ele(id, parent = null) {
        return parent ? parent.getElementById(id) : document.getElementById(id)
    }
    function eles(name, type = "cls", parent = null) {
        if (parent) {
            switch (type) {
                case "cls":
                    return parent.getElementsByClassName(name);
                case "name":
                    return parent.getElementsByName(name);
                case "tag":
                    return parent.getElementsByTagName(name);
            }
        } else {
            switch (type) {
                case "cls":
                    return document.getElementsByClassName(name);
                case "name":
                    return document.getElementsByName(name);
                case "tag":
                    return document.getElementsByTagName(name);
            }
        }
    }
    //set hover
    function hover(ele, args = hoverArgs) {
        let basic = args.basic;
        let dest = args.dest;
        ele.onmousemove = function () {
            if (this.style.color == basic) {
                this.style.color = dest;
            }
        }
        ele.onmouseleave = function () {
            if (this.style.color == dest) {
                this.style.color = basic;
            }
        }
    }
    function hovers(eles, args = hoverArgs) {
        eles.forEach(ele => {
            hover(ele, args)
        });
    }
    function setText(ele, name = "login") {
        ele.textContent = name
    }

    function newBtn(text = null) {
        return text ? create("button", text) : create("button", "login");
    }
    function create(type, text = null) {
        let ele = document.createElement(type)
        if (text) ele.textContent = text;
        return ele;
    }
    function setCss(ele, styles = {}) {
        if (!styles) {
            console.log("setCss不能为空!")
        }
        for (let i in styles) {
            ele.style[i] = styles[i];
        }
    }
    function setCsses(eles, styles) {
        eles.forEach(ele => {
            setCss(ele, styles)
        });
    }
    function wrapEle(ele, styles = {}, args = hoverArgs) {
        setCss(ele, merge(fontCss, aCss, styles))
        hover(ele, args)
    }
    function wrapEles(eles, styles = {}, args = hoverArgs) {
        eles.forEach(ele => {
            wrapEle(ele, styles, args)
        })
    }
    function addChildren(parent, children) {
        children.forEach(child => {
            parent.appendChild(child)
        });
    }
    function addBefore(parent, children, before) {
        children.forEach(child => {
            parent.insertBefore(child, before)
        });
    }
    function spGoto(target, needRemoveTail = false, idx = spIndex.deliIndex, deli = "/") {
        gotoUrl(target, needRemoveTail, idx, deli)
    }
    function gotoUrl(target, needRemoveTail, idx, deli) {
        let newUrl = crtUrl.replace(crtUrl.split(deli)[idx], target)
        if (needRemoveTail) {
            newUrl = removeTail(newUrl, target)
        }
        window.location.href = newUrl
    }
    function gotoUrlReg(target, reg) {
        window.location.href = crtUrl.replace(reg, target)
    }
    function removeTail(url, seg) {
        return url.substr(0, url.indexOf(seg) + seg.length)
    }
    function firstChild(p, layer = 1) {
        let temp = p;
        for (let i = 0; i < layer; i++) {
            temp = temp.firstElementChild
        }
        return temp;
    }
    function buildUrl(target, index) {
        return target.prefix + index + target.suffix;
    }
    function matchAny(prefixes) {
        let flag = false;
        prefixes.forEach(prefix => {
            if (crtUrl.match(prefix)) {
                flag = true;
                return;
            }
        });
        return flag;
    }
    function merge() {
        let arr = [...arguments]
        if (arr.length == 1) return arr;
        let target = {}
        arr.forEach(obj => {
            for (let p in obj) {
                target[p] = obj[p]
            }
        });
        return target;
    }
    function getBdCode(link) {
        let idx = link.indexOf(regToUse.bd.code)
        if (idx > -1) {
            link = link.substr(idx)
            return link;
        }
        let lkArr = link.split(" ")
        if (lkArr) {
            let len = lkArr.length
            let matched = 0;
            for (let i = 0; i < len; i++) {
                if (lkArr[i].match(regToUse.bd.codeStr)) {
                    matched = i;
                    break;
                }
            }
            if (matched > 0) {
                link = "";
                for (let i = matched; i < len; i++) {
                    link += lkArr[i]
                }
            }
        }
        return link;
    }
})();