查看: 2512|回复: 0

[原创发布] 修正Firefox/火狐浏览器的代码框复制问题(油猴脚本)

[复制链接]
梦石
0
星屑
17038
在线时间
6058 小时
注册时间
2011-7-18
回帖
152

开拓者

发表于 2022-12-10 07:16:30 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 gqxastg 于 2022-12-11 19:25 编辑

前言

起因是最近就我所看到的,连续发生了两起由于论坛的代码复制问题引发的提问
(除了每行开头会多四个空格外,我还是第一次发现会把某些空格转义为不间断空格...)
个人也是最近几个月把主力浏览器改为了Firefox,虽然知道问题所在但每次都得手动处理还是很烦人
于是我疯狂翻阅文档,凭借我贫瘠(x)的JS知识试着写出了以下的用户脚本,虽然不够精细但完全够用,在此分享给有同样困扰的大家

说明

针对两种代码框([code]和[pre])均进行了修正,除了上述两个问题外,额外修正了@和链接会被错误解析加上[url]字样的问题(仅复制代码时生效,显示无变化)
使用前需安装 Tampermonkey 或其他用户脚本扩展(Greasemonkey、Violentmonkey、FireMonkey),具体步骤这里不多做赘述
为了测试,可以复制这个帖子的代码来检验效果,没用脚本时很可能会有上述前两种问题
已在 Win10,Firefox 107.0.1 (64 位),Tampermonkey v4.18.1 环境下测试通过
脚本很简短,未经过详细测试,如有BUG欢迎在贴内反馈

下载/安装

已上传至 GreasyFork,请点击此处进行安装[fold=仅作留档,建议从GreasyFork安装][pre lang="javascript"]// ==UserScript==
// @name         Firefox Project1论坛代码框复制修正
// @namespace    rpg.blue
// @license      MIT
// @version      0.3
// @description  修正Firefox浏览器在使用Project1论坛中代码框的复制功能时,代码每行头部会多出四个空格和把某些空格错误转义为不间断空格(U+00A0)的问题(附带修正链接带字样的问题)
// @author       岚风 雷
// @match        *://rpg.blue/thread-*
// @match        *://rpg.blue/forum.php*tid=*
// @icon         [url]https://rpg.blue/favicon.ico

// @grant        unsafeWindow
// @run-at       document-body
// ==/UserScript==

var _copycodeEx_firefoxfix;
var _copycode_firefoxfix;
var _showDialog_firefoxfix;
var last_obj;
// var is_copied = false;
var s_reg = [/\u00A0/gm, '\u0020'];
var url_reg = [/\[url(?:=\S+?)?\](\S+?)\[\/url\]/gm, '$1'];
var dialog_info = ['代码已复制到剪贴板', 'notice', '【已修正】'];

(function() {
    if ((typeof(copycode) != 'function') && (typeof(copycodeEx) != 'function')) { return }
    if ((typeof(_copycode_firefoxfix) != 'undefined') || (typeof(_copycodeEx_firefoxfix) != 'undefined')) { return }

    // 参考自:https://juejin.cn/post/6924934285992394760(作者:Tyric)
    function copycode_copyevent(e) {
        // if (is_copied) { if (last_obj) { last_obj.removeEventListener('copy', copycode_copyevent); }; return }
        let selectText = document.getSelection().toString();
        // console.log(selectText);
        let retText = selectText.replace(s_reg[0], s_reg[1]); // 不间断空格转换
        retText = retText.replace(url_reg[0], url_reg[1]); // url解析清除
        e.clipboardData.setData('text/plain', retText);
        e.preventDefault();
        // is_copied = true;
        if (last_obj) { last_obj.removeEventListener('copy', copycode_copyevent) };
    }

    // copycodeEx
    if (typeof(copycodeEx) == 'function') {
        _copycodeEx_firefoxfix = copycodeEx;

        unsafeWindow.copycodeEx = function(obj) {
            // console.log('已注入');
            if (last_obj) { last_obj.removeEventListener('copy', copycode_copyevent); }
            last_obj = obj;
            // is_copied = false;
            obj.addEventListener('copy', copycode_copyevent, false);
            let ret = _copycodeEx_firefoxfix(obj);
            // obj.removeEventListener('copy', copycode_copyevent);
            return ret;
        }
    }

    // copycode
    if (typeof(copycode) == 'function') {
        _copycode_firefoxfix = copycode;

        unsafeWindow.copycode = function(obj) {
            if (last_obj) { last_obj.removeEventListener('copy', copycode_copyevent); }
            last_obj = obj;
            obj.addEventListener('copy', copycode_copyevent, false);
            let ret = _copycode_firefoxfix(obj);
            // obj.removeEventListener('copy', copycode_copyevent);
            return ret;
        }
    }

    // showDialog
    if (typeof(showDialog) == 'function') {
        _showDialog_firefoxfix = showDialog;

        unsafeWindow.showDialog = function(...args) {
            if (last_obj && (args[0] == dialog_info[0]) && (args[1] == dialog_info[1])) {
                args[0] += dialog_info[2];
                last_obj = undefined;
            }
            return _showDialog_firefoxfix(...args);
        }
    }

})();[/pre][/fold]


说起来其他Discuz!的论坛好像没有这种事...不知道问题出在哪呢

评分

参与人数 1赞 +1 收起 理由
Cupidk爱呗茶 + 1 精品文章

查看全部评分

这里岚风·雷,任饭、PM理性粉、UT/DR原作粉、(Trans)Furry自萌,半吊子技术一枚_(:з」∠)_    游戏制作交流工(liao)作(tian)室欢迎来玩!
【无偿/有偿】RGSS3(VA)脚本定制 + 合作招募/同好交友    修正Firefox/火狐浏览器的代码框复制问题(油猴脚本)
Click→←Click
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部