通过js脚本处理剪切板(简单而强大的效率工具)

简介

一直以来,我们在复制数据的时候往往需要对数据进行处理。我用 WPF 做了一个工具,只要你提供一个 js 文件作为函数库,则可以动态调用js脚本去处理剪切板的内容。

  • 该工具的特点
    • 支持V8引擎,支持大部分 ES6 的语法
    • 扩展性强,脚本可以动态更新,不用重新启动程序

项目源码
软件直接下载
提取码:yb0l
在这里插入图片描述

  • 强大的文本处理工具,以前我是用ConyEdit快速处理文本的,但现在这个工具成为了我处理文本的主力。
  • “自动拷贝"指的是处理文本后立即拷贝到剪切板,js函数模块是指定的js文件的位置,参数是指函数调用时传进的参数,参数为数组,用”____"4个下划线来分隔
  • 后期我打算把常见的加密解密也添加进去,让这个工具更强大。

功能示例

通过正则表达式来截取内容并且用逗号拼接。
如下图所示,将上面HTML标签当中的 name=“要截取的内容” 或者 name=‘要截取的内容’ 提取出来并拼接
在这里插入图片描述

函数库

你需要写一个js脚本,格式如下

  • 函数必须写在functions 对象里面,getMethodsName 方法和 handler方法不能修改
/**
 * 规定参数的分隔符为4个下划线,即____
 */
let functions = {
  "1.字符串常规处理": function (str) {
    return "";
  },
  /**
   * 全局替换
   * @param {String} str
   * @param {String} paramArr 需要替换的字符
   *                给定一个参数的时候,替换为空
   *                给定两个参数的时候,替换为指定字符
   *                第三个参数代表开头需要补充的东西
   *                第四个参数代表末尾需要补充的东西
   * @returns
   */
  全局替换: function (str, paramArr) {
    if (paramArr.length === 1) {
      return str.replaceAll(paramArr[0], "");
    }
    let start = paramArr.length >= 3 ? paramArr[2] : "";
    let end = paramArr.length >= 4 ? paramArr[3] : "";
    return start + str.replaceAll(paramArr[0], paramArr[1]) + end;
  },
  /**
   * 替换换行符
   * @param {String} str
   * @param {String} paramArr 不给定参数时,默认替换为空
   *                给定一个参数的时候,替换为指定的字符串
   * @returns
   */
  替换换行符: function (str, paramArr) {
    let strArr = str.split("\n");
    let retArr = [];
    let split = "";
    if (paramArr.length >= 1) {
      split = paramArr[0];
    }
    strArr.forEach((item) => {
      retArr.push(item.trim());
    });
    return retArr.join(split);
  },
  删除印象笔记列表拷贝的前缀: function (str, paramArr) {
    let strArr = str.split("\n");
    let retArr = [];
    let startWithX = true;
    if (paramArr.length > 0 && paramArr[0] !== "") {
      startWithX = paramArr[0] === "*";
    }
    let lastWord = "";
    strArr.forEach((item) => {
      let trimItem = item.trim();
      if (trimItem === "") {
        // 不要空行
        return;
      }
      if (trimItem === "*") {
        let temp = item.substring(1, item.length - 1);
        let tempArr = temp.split("*");
        lastWord = tempArr[0].replaceAll(" ", "\t") + "*" + tempArr[1];
        return;
      } else if (trimItem.startsWith("*")) {
        retArr.push(startWithX ? item.substring(1) : trimItem.substring(2));
        return;
      } else {
        retArr.push(startWithX ? lastWord + trimItem : trimItem);
        // 使用完后清空
        lastWord = "";
      }
    });
    return retArr.join("\n");
  },
  /**
   * 删除所有空行和两侧空白,去掉前面的数字(例如(1),(1))
   * @param {String} str
   */
  删除空行空白及开头数字: function (str) {
    let strArr = str.split("\n");
    let ret = "";
    strArr.forEach((item) => {
      item = item.trim();
      if (item !== "") {
        if (item.startsWith("(") || item.startsWith("(")) {
          item = item.substring(3);
        }
        ret += item + "\n";
      }
    });
    return ret;
  },
  /**
   *
   * @param {String} str
   */
  数组去重: function (str) {
    let strArr = str.split("\n");
    let retObj = {};
    strArr.forEach((item) => {
      item = item.trim();
      retObj[item] = true;
    });
    let retArr = Object.keys(retObj);
    return retArr.join("\n");
  },
  /**
   * 
   * @param {String} str
   */
  数组排序: function (str) {
    let strArr = str.split("\n");
    let retArr = [];
    strArr.forEach((item) => {
      item = item.trim();
      retArr.push(item)
    });
    retArr.sort((a,b)=>a.localeCompare(b))
    return retArr.join("\n");
  },
  /**
   * Oracle 的decode函数转mysql
   * decode(ps.type_code, 3, '是', '否') -> IF(ps.type_code=3,'是','否')
   * @param {String} str
   */
  oracle的Decode转mysql的IF: function (str) {
    // 提取
    str = str.replaceAll("\n", "").trim();
    let strMatchStr = str.match(/(?<=decode\().*(?=\))/)[0];
    let paramArr = strMatchStr.split(",");
    paramArr.forEach((item, i) => (paramArr[i] = item.trim()));
    // 条件数组
    let conditionArr = [];
    // 结果数组
    let resultArr = [];
    paramArr.forEach((item, i) => {
      item = item.trim();
      paramArr[i] = item;
      if (i > 0 && i !== paramArr.length - 1 && i % 2 === 1) {
        conditionArr.push(item);
      } else if ((i > 0 && i % 2 === 0) || i === paramArr.length - 1) {
        resultArr.push(item);
      }
    });
    let field = paramArr[0];
    let ret = resultArr[conditionArr.length];
    for (let i = conditionArr.length - 1; i >= 0; i--) {
      let condition = conditionArr[i];
      let value1 = resultArr[i];
      let value2 = ret;
      // IF(condition,value1,value2)
      ret = `IF(${field}=${condition},${value1},${value2})`;
    }
    return ret;
  },

  /**
   *  pagingFlag=true, busiType=null, advisoryDate=null, page=1, rows=10, userId=950751436809961472, consNo=null
   *  变成"pagingFlag":true,"busiType":null,
   * @param {String} str
   */
  等式变json式: function (str) {
    str = str.trim();
    let strArr = str.split(",");
    let jsonRet = "";
    strArr.forEach((item) => {
      item = item.trim();
      let itemArr = item.split("=");
      let field = `"${itemArr[0].trim()}"`;
      let value = itemArr[1].trim();
      if (value !== "true" && value !== "false" && value !== "null") {
        value = `"${value}"`;
      }
      jsonRet += field + ":" + value + ",";
    });
    return jsonRet;
  },

  /**
   * 通过正则筛选数据
   * @param {String} str
   */
  通过正则筛选数据: function (str, paramArr) {
    let strArr = str.split("\n");
    let reg = new RegExp(paramArr[0], "g");
    let retArr = [];
    strArr.forEach((item) => {
      // 提取name标签的值
      let m = item.match(reg);
      if (m !== null) {
        m.forEach((mItem) => retArr.push(mItem));
      }
    });
    return retArr.join(",");
  },
  /**
   * 数组合并_加引号和逗号,数组由\n分割
   * 加上','
   * @param {String} str
   */
  数组合并_加引号和逗号: function (str) {
    let strArr = str.split("\n");
    let ret = "";
    strArr.forEach((item) => {
      let temp = item.trim();
      if (temp.length > 0) {
        ret += temp + "','";
      }
    });
    ret = "'" + ret;
    return ret.substring(0, ret.length - 2);
  },
  /**
   * 数组合并_加引号和逗号,数组由\n分割
   * 加上','
   * @param {String} str 数组以\n来分割
   * @param {String} paramArr
   *              [0]: 合并时用的间隔符号
   *              [1]: 前缀
   *              [2]: 后缀
   */
  数组合并_自定义组合符号: function (str, paramArr) {
    let strArr = str.split("\n");
    let ret = "";
    retArr = [];
    strArr.forEach((item) => {
      let temp = item.trim();
      if (temp.length > 0) {
        retArr.push(temp);
      }
    });
    ret = retArr.join(paramArr[0]);
    if (paramArr.length >= 3) {
      ret = paramArr[1].trim() + ret + paramArr[2].trim();
    }
    return ret;
  },
  去掉整合的数组的引号和逗号: function (str) {
    let strArr = str.split(",");
    let ret = "";
    strArr.forEach((item) => {
      let temp = item.trim();
      if (temp.length > 1) {
        ret += temp.substring(1, temp.length - 1) + "\n";
      }
    });
    return ret;
  },
  数组拆分_根据指定字符: function (str, paramArr) {
    let split = ",";
    if (paramArr[0] !== "") {
      split = paramArr[0].toString();
    }
    return str.split(split).join("\n");
  },
  中文字符转英文: function (str) {
    let transfer = {
      ",": ",",
      "(": "(",
      ")": ")",
      "“": `"`,
      "”": `"`,
      "。": `.`,
      "?": `?`,
      ":": `:`,
      "{": `{`,
      "}": `}`,
      "【": `[`,
      "】": `]`,
      "《": `<`,
      "》": `>`,
    };
    let ret = [];
    for (let i = 0; i < str.length; i++) {
      let c = str.charAt(i);
      ret.push(transfer[c] !== undefined ? transfer[c] : c);
    }
    return ret.join("");
  },
  /**
   * 找到不存在的数据,空行分割两组数据
   * 第一组数据为原数据,第二组数据为新数据
   * 判断第一组数据是否都存在于第二组数据中,少哪些数据,第二组数据有哪些多余的?
   * @param {String} str
   */
  对比两数组_找到不存在和多余的数据: function (str) {
    let strArr = str.split("\n");
    // 第一次遍历
    let konghangI = -1;
    let firstWordI = -1;
    let map = {};
    for (let i = 0; i < strArr.length; i++) {
      // 找到分割的空行
      let item = strArr[i].trim();
      if (firstWordI >= 0 && item === "") {
        // 如果已经找到过第一个非空行又遇到了空行,则这是分割行
        konghangI = i;
        break;
      }
      // 找到第一个非空行
      if (firstWordI < 0 && item !== "") {
        firstWordI = i;
      }
      // 处理数据
      map[item] = true;
    }
    let notExistArr = [];
    let unnecessaryArr = [];
    // 第二次遍历
    for (let i = konghangI + 1; i < strArr.length; i++) {
      let item = strArr[i].trim();
      if (map[item] === true) {
        // 找到了
        map[item] = false;
      } else if (map[item] === false) {
        continue;
      } else {
        // 没找到
        unnecessaryArr.push(item);
      }
    }
    // 查找剩余的
    Object.keys(map).forEach((key) => {
      if (map[key] === true) {
        notExistArr.push(key);
      }
    });
    return `${"缺少的数据的个数:" + notExistArr.length}
${"'" + notExistArr.join("','") + "'"}
${"多余的数据的个数:" + unnecessaryArr.length}
${"'" + unnecessaryArr.join("','") + "'"}
  `;
  },
  /**
   * 对调两个字符串
   * @param {String} str
   * @param {Array} params 不给参数默认分隔符为',',给参数的话,第一个参数为分隔符
   * @returns
   */
  颠倒两个字符串: function (str, params) {
    let split = ",";
    if (params.length > 0 && params[0] !== "") {
      split = params[0];
    }
    let findArr = [];
    let cur = 0;
    while (true) {
      let find = str.indexOf(split, cur);
      if (find === -1) {
        break;
      }
      findArr.push(find);
      cur = find + 1;
    }
    if (findArr.length === 0) {
      return str;
    }
    let index = findArr[parseInt((findArr.length + 1) / 2) - 1];
    return str.substring(index + 2) + split + str.substring(0, index);
  },
  "2.自动生成": function () {
    return "";
  },
  /**
   *
   * @param {String} str
   * @param {Array} params
   * @returns
   */
  自动生成_手机号: function (str, params) {
    const prefixArray = new Array(
      "139",
      "138",
      "137",
      "136",
      "135",
      "134",
      "159",
      "158",
      "157",
      "150",
      "151",
      "152",
      "188",
      "187",
      "182",
      "183",
      "184",
      "178",
      "130",
      "131",
      "132",
      "156",
      "155",
      "186",
      "185",
      "176",
      "133",
      "153",
      "189",
      "180",
      "181",
      "177"
    );
    const i = parseInt(Math.random() * prefixArray.length);
    let prefix = prefixArray[i];
    for (let j = 0; j < 8; j++) {
      prefix += Math.floor(Math.random() * 10);
    }
    return prefix;
  },
  /**
   *
   * @param {String} str
   * @param {Array} params
   * @returns
   */
  自动生成_身份证: function (str, params) {
    /**根据15位身份证或者18位身份证的前17位生成18位身份证号码*/
    function getCheckID(_pid) {
      var arrVerifyCode = [1, 0, "x", 9, 8, 7, 6, 5, 4, 3, 2];
      var wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
      if (_pid.length != 15 && _pid.length != 17) return false;
      var ai =
        _pid.length == 17 ? _pid : _pid.substr(0, 6) + "19" + _pid.substr(6);
      if (!/^\d+$/.test(ai)) return false;
      var yyyy = ai.substr(6, 4),
        mm = ai.substr(10, 2) - 1,
        dd = ai.substr(12, 2);
      var d = new Date(yyyy, mm, dd),
        year = d.getFullYear(),
        mon = d.getMonth(),
        day = d.getDate(),
        now = new Date();
      if (
        year != yyyy ||
        mon != mm ||
        day != dd ||
        d > now ||
        now.getFullYear() - year > 140
      )
        return false;
      for (var i = 0, ret = 0; i < 17; i++) ret += ai.charAt(i) * wi[i];
      ai += arrVerifyCode[(ret %= 11)];
      return ai;
    }
    /**生成一定范围的随机数*/
    function fRandomBy(under, over) {
      switch (arguments.length) {
        case 1:
          return parseInt(Math.random() * under + 1);
        case 2:
          return parseInt(Math.random() * (over - under + 1) + under);
        default:
          return 0;
      }
    }
    function _RandomCreateID() {
      var aid = 432427,
        ac = null,
        yyyy = 0,
        mm = 0,
        dd = 0,
        rnd = 0;
      (yyyy = fRandomBy(1940, 1990)),
        (mm = fRandomBy(1, 12)),
        (dd = fRandomBy(1, 31));
      rnd = fRandomBy(1, 999);
      mm = mm < 10 ? "0" + mm : mm;
      dd = dd < 10 ? "0" + dd : dd;
      return "" + aid + yyyy + mm + dd + rnd;
    }
    var ff = false;
    //如果生成的身份证校验不通过,则再生成,直到校验通过为止
    while (!ff) {
      ff = getCheckID(_RandomCreateID());
    }
    return ff;
  },
  /**
   *
   * @param {String} str
   * @param {Array} params 如果不给参数则邮箱前缀随机长度3-9,给定1个参数则为定长,给定两个参数则随机长度a,b
   * @returns
   */
  自动生成_邮箱: function (str, params) {
    let tailArr = [
      "@163.com",
      "@126.com",
      "@129.com",
      "@qq.com",
      "@vip.qq.com",
      "@foxmail.com",
      "@live.cn",
      "@hotmail.com",
      "@sina.com",
      "@sina.cn",
      "@vip.sina.com",
    ];
    let n = Math.floor(Math.random() * tailArr.length);
    let start = 3;
    let end = 9;
    if (params.length === 1 && params[0] !== "") {
      start = parseInt(params[0]);
      end = parseInt(params[0]);
    } else if (params.length === 2) {
      start = parseInt(params[0]);
      end = parseInt(params[1]);
    }
    let head = this["自动生成_字母"]("", [start, end]);
    return head + tailArr[n];
  },
  /**
   *
   * @param {String} str
   * @param {Array} params 如果不给参数则默认生成长度为8,给定1个参数则是默认长度,给定两个参数则是在[a,b]的随机整数作为长度
   * @returns
   */
  自动生成_字母: function (str, params) {
    const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    let len = 8;
    let res = "";
    if (params.length === 1 && params[0] !== "") {
      len = parseInt(params[0]);
    } else if (params.length === 2) {
      let start = parseInt(params[0]);
      let end = parseInt(params[1]);
      len = Math.round(Math.random() * (end - start)) + start;
    }
    for (let i = 0; i < len; i++) {
      let n = Math.round(Math.random() * letters.length);
      res += letters[n];
    }
    return res;
  },
  /**
   *
   * @param {String} str 可以使用的字符
   * @param {Array} params 如果不给参数则默认生成长度为8,给定1个参数则是默认长度,给定两个参数则是在[a,b]的随机整数作为长度
   * @returns
   */
  自动生成_自定义字符: function (str, params) {
    const letters = str;
    let len = 8;
    let res = "";
    if (params.length === 1 && params[0] !== "") {
      len = parseInt(params[0]);
    } else if (params.length === 2) {
      let start = parseInt(params[0]);
      let end = parseInt(params[1]);
      len = Math.floor(Math.random() * (end - start)) + start;
    }
    for (let i = 0; i < len; i++) {
      let n = Math.floor(Math.random() * letters.length);
      res += letters[n];
    }
    return res;
  },
  /**
   *
   * @param {String} str
   * @param {Array} params
   * @returns
   */
  自动生成_名字: function (str, params) {
    const familyNames = new Array(
      "赵",
      "钱",
      "孙",
      "李",
      "周",
      "吴",
      "郑",
      "王",
      "冯",
      "陈",
      "褚",
      "卫",
      "蒋",
      "沈",
      "韩",
      "杨",
      "朱",
      "秦",
      "尤",
      "许",
      "何",
      "吕",
      "施",
      "张",
      "孔",
      "曹",
      "严",
      "华",
      "金",
      "魏",
      "陶",
      "姜",
      "戚",
      "谢",
      "邹",
      "喻",
      "柏",
      "水",
      "窦",
      "章",
      "云",
      "苏",
      "潘",
      "葛",
      "奚",
      "范",
      "彭",
      "郎",
      "鲁",
      "韦",
      "昌",
      "马",
      "苗",
      "凤",
      "花",
      "方",
      "俞",
      "任",
      "袁",
      "柳",
      "酆",
      "鲍",
      "史",
      "唐",
      "费",
      "廉",
      "岑",
      "薛",
      "雷",
      "贺",
      "倪",
      "汤",
      "滕",
      "殷",
      "罗",
      "毕",
      "郝",
      "邬",
      "安",
      "常",
      "乐",
      "于",
      "时",
      "傅",
      "皮",
      "卞",
      "齐",
      "康",
      "伍",
      "余",
      "元",
      "卜",
      "顾",
      "孟",
      "平",
      "黄",
      "和",
      "穆",
      "萧",
      "尹"
    );
    const givenNames = new Array(
      "子璇",
      "淼",
      "国栋",
      "夫子",
      "瑞堂",
      "甜",
      "敏",
      "尚",
      "国贤",
      "贺祥",
      "晨涛",
      "昊轩",
      "易轩",
      "益辰",
      "益帆",
      "益冉",
      "瑾春",
      "瑾昆",
      "春齐",
      "杨",
      "文昊",
      "东东",
      "雄霖",
      "浩晨",
      "熙涵",
      "溶溶",
      "冰枫",
      "欣欣",
      "宜豪",
      "欣慧",
      "建政",
      "美欣",
      "淑慧",
      "文轩",
      "文杰",
      "欣源",
      "忠林",
      "榕润",
      "欣汝",
      "慧嘉",
      "新建",
      "建林",
      "亦菲",
      "林",
      "冰洁",
      "佳欣",
      "涵涵",
      "禹辰",
      "淳美",
      "泽惠",
      "伟洋",
      "涵越",
      "润丽",
      "翔",
      "淑华",
      "晶莹",
      "凌晶",
      "苒溪",
      "雨涵",
      "嘉怡",
      "佳毅",
      "子辰",
      "佳琪",
      "紫轩",
      "瑞辰",
      "昕蕊",
      "萌",
      "明远",
      "欣宜",
      "泽远",
      "欣怡",
      "佳怡",
      "佳惠",
      "晨茜",
      "晨璐",
      "运昊",
      "汝鑫",
      "淑君",
      "晶滢",
      "润莎",
      "榕汕",
      "佳钰",
      "佳玉",
      "晓庆",
      "一鸣",
      "语晨",
      "添池",
      "添昊",
      "雨泽",
      "雅晗",
      "雅涵",
      "清妍",
      "诗悦",
      "嘉乐",
      "晨涵",
      "天赫",
      "玥傲",
      "佳昊",
      "天昊",
      "萌萌",
      "若萌"
    );
    const i = parseInt(Math.random() * familyNames.length);
    const familyName = familyNames[i];
    const j = parseInt(Math.random() * givenNames.length);
    const givenName = givenNames[j];
    const name = familyName + givenName;
    return name;
  },
  "3.加密解密": function (str, params) {
    return "";
  },
  /**
   * 测试
   * @param {String} str
   * @returns
   */
  这是一个空操作: function (str, params) {
    return "";
  },
};

/**
 * 获取所有方法名称的集合
 * @returns
 */
function getMethodsName() {
  return Object.keys(functions).join(",");
}

/**
 * 方法调用
 * @param {String} funcName 获取方法名
 * @param {String} strText 处理的方法
 * @returns
 */
function handler(funcName, strText, params) {
  return functions[funcName](strText, params.split("____"));
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值