// ==UserScript== // @name LuoguEmojiSender // @namespace https://github.com/Maxmilite/LuoguEmojiSender // @version 1.4.2 // @description 一款可以帮助您在洛谷轻松发送 QQ 表情信息的插件. // @author Maxmilite // @match https://www.luogu.com.cn/* // @match http://www.luogu.com.cn/* // @grant unsafeWindow // @require https://code.jquery.com/jquery-2.1.1.min.js // @downloadURL none // ==/UserScript== (function () { // -------------------------此处为用户修改配置区-------------------------------- // 此项定义前后缀功能,用于表情的识别,以默认配置为例 // 如果在此配置下,当且仅当输入的内容为大括号包裹的qq表情代码(即 "{/代码}")时才会进行替换操作。 // 当然,您可以直接将其设置为空字符串,来达到无缝衔接的效果。 const prefix = "{", suffix = "}"; // 此处为用户个性化设置区,输入格式按照 JSON 格式输入。 // 格式:" "表情代码": "", " // 请注意,如果不是最后一行,该行后必须添加逗号。 // 样例:" "/亲亲": ")", " const userElement = { } // -------------------------上方为用户修改配置区-------------------------------- // 这是第一代 LuoguEmojiSender 的最终版本,内容已经相当完善,此后作者将会着力于第二代的开发,第一代基本不会更新。 // 最后更新时间 2021.5.30 // 最后版本 1.4.2 // 第二代目标:实现图形化,近似于 QQ 发送表情 // 作者在这个版本留下了一个臭了的彩蛋 // 1.1 更新内容: // 优化操作逻辑,增加用户配置区 // 1.2 更新内容: // 增加了更多的 QQ 图片,更改了图床 // 1.3 更新内容: // 进一步优化操作逻辑,修复了图片加载的一个BUG,现在可以无忧无虑使用无缝模式了 // 1.3.1 更新内容: // 紧急修复一个由菜刀表情引发的严重BUG // 1.4 更新内容: // 修复了 1.3.1 版本更新日志版本号的bug,修复输入问题,第一代最终版本 // 修复光标漂移问题,修复无缝衔接问题,修复菜刀表情问题,修复若干问题 // 1.4.1 更新内容: // 更换表情源,增加 “替换表情” 按钮,具体详见说明文档。 // 1.4.2 更新内容: // 修复一个无缝模式的 bug,添加了部分表情 const replaceElement = { "/ybyb": "", "/wosl": "", "/hs": "", "/psj": "", "/na": "", "/bx": "", "/qdqd": "", "/zy": "", "/nqct": "", "/nzqk": "", "/mjl": "", "/gun": "", "/cb": "", "/my": "", "/mwbq": "", "/kx": "", "/jl": "", "/wyx": "", "/ww": "", "/mdfq": "", "/banzz": "", "/mgx": "", // ----------------- 以上为 1.4.2 更新内容 ----------------- "/aini": "", "/aiq": "", "/am": "", "/azgc": "", "/baiy": "", "/bangbangt": "", "/baojin": "", "/bb": "", "/bkx": "", "/bl": "", "/bobo": "", "/bp": "", "/bq": "", "/bs": "", "/bt": "", "/bu": "", "/bz": "", "/cd": "", "/cengyiceng": "", "/cg": "", "/ch": "", "/chi": "", "/cj": "", "/cp": "", "/cs": "", "/cy": "", "/dan": "", "/dao": "", "/db": "", "/dg": "", "/dgg": "", "/dk": "", "/dl": "", "/doge": "", "/dx": "", "/dy": "", "/dz": "", "/ee": "", "/emm": "", "/fad": "", "/fade": "", "/fan": "", "/fd": "", "/fendou": "", "/fj": "", "/fn": "", "/fw": "", "/gg": "", "/gy": "", "/gz": "", "/hanx": "", "/haob": "", "/hb": "", "/hc": "", "/hd": "", "/hec": "", "/hhd": "", "/hn": "", "/hp": "", "/hq": "", "/hsh": "", "/ht": "", "/huaix": "", "/hx": "", "/jd": "", "/jh": "", "/jiaybb": "", "/jiaybs": "", "/jie": "", "/jk": "", "/jw": "", "/jx": "", "/jy": "", "/ka": "", "/kb": "", "/kel": "", "/kf": "", "/kg": "", "/kk": "", "/kl": "", "/kt": "", "/kuk": "", "/kun": "", "/kzht": "", "/lb": "", "/lengh": "", "/lh": "", "/ll": "", "/lm": "", "/lq": "", "/lw": "", "/lyj": "", "/meigui": "", "/mm": "", "/ng": "", "/nkt": "", "/oh": "", "/oy": "", "/pch": "", "/pj": "", "/pp": "", "/pt": "", "/px": "", "/qd": "", "/qiang": "", "/qiao": "", "/qq": "", "/qt": "", "/ruo": "", "/sa": "", "/se": "", "/sh": "", "/shd": "", "/shl": "", "/shuai": "", "/shui": "", "/shxi": "", "/sr": "", "/tiao": "", "/tl": "", "/tnl": "", "/tp": "", "/ts": "", "/tsh": "", "/tt": "", "/tuu": "", "/tx": "", "/taiyang": "", "/tyt": "", "/wbk": "", "/whl": "", "/wl": "", "/wn": "", "/wq": "", "/ws": "", "/wul": "", "/wx": "", "/wzm": "", "/xhx": "", "/xia": "", "/xig": "", "/xin": "", "/xjj": "", "/xk": "", "/xs": "", "/xu": "", "/xw": "", "/xy": "", "/xyx": "", "/yao": "", "/yb": "", "/yhh": "", "/yiw": "", "/yl": "", "/youl": "", "/youtj": "", "/yt": "", "/yun": "", "/yx": "", "/zhd": "", "/zhem": "", "/zhh": "", "/zhm": "", "/zhq": "", "/zj": "", "/zk": "", "/zq": "", "/zt": "", "/zuotj": "", "/114514": "[](https://github.com/Maxmilite/LuoguEmojiSender)" }; const $ = unsafeWindow.$ || jQuery, markdownPalettes = unsafeWindow.markdownPalettes; function getSubString(sourceString = "", findPos = -1) { if (findPos == -1) { return "zr.tk"; } if (findPos <= 5) { return ""; } let resultString = ""; for (let i = findPos - 5; i < findPos; i++) { resultString += sourceString[i]; } // if (resultString == "tps:/") { // return "9zr.tk"; // } return resultString; } function sliceString(sourceString = "", leftSide = 0, rightSide = 0) { let resultString = "" for (let i = leftSide; i <= rightSide; i++) { resultString += sourceString[i]; } return resultString; } function replaceString(stringToChange = "") { let isChanged = false; for (let i in replaceElement) { let changedStr = prefix + i + suffix; while (getSubString(stringToChange, stringToChange.lastIndexOf(changedStr)) != "zr.tk") { console.log(getSubString(stringToChange, stringToChange.lastIndexOf(changedStr))) isChanged = true; // stringToChange = stringToChange.replace(changedStr, replaceElement[i]); stringToChange = sliceString(stringToChange, 0, stringToChange.lastIndexOf(changedStr) - 1) + replaceElement[i] + sliceString(stringToChange, stringToChange.lastIndexOf(changedStr) + changedStr.length, stringToChange.length - 1); } } for (let i in userElement) { let changedStr = prefix + i + suffix; while (getSubString(stringToChange, stringToChange.lastIndexOf(changedStr)) != "zr.tk") { isChanged = true; // stringToChange = stringToChange.replace(changedStr, userElement[i]); stringToChange = sliceString(stringToChange, 0, stringToChange.lastIndexOf(changedStr) - 1) + userElement[i] + sliceString(stringToChange, stringToChange.lastIndexOf(changedStr) + changedStr.length, stringToChange.length - 1); } } if (isChanged == true) { return stringToChange; } else { return undefined; } } function main() { if (typeof markdownPalettes != "undefined") { let changedStr = replaceString($(".CodeMirror-wrap textarea").val()); if (changedStr != undefined) { $(".CodeMirror-wrap textarea").val(changedStr); $(".CodeMirror-wrap textarea").trigger("input"); } } if (document.getElementById("feed-content") != null) { let changedStr = replaceString(document.getElementById("feed-content").value); if (changedStr != undefined) { document.getElementById("feed-content").value = changedStr; } } } function replaceAll() { if (replaceString(markdownPalettes.content) != undefined) { markdownPalettes.content = replaceString(markdownPalettes.content); } else { return; } } function init() { $(`