Greasy Fork

Greasy Fork is available in English.

Coder Utils

【使用前先看介绍/有问题可反馈】【欢迎一键三连(好评+打赏+收藏),你的支持是作者维护下去的最大动力!】Coder Utils(程序员专属工具)为程序员专门准备的常用 JavaScript 函数;目前已有:发送请求、下载Blob、下载文件、下载图片、文本复制、文本解码、参数转换;脚本定义的所有函数被定义于 window.utils 中,具体函数使用说明请参照脚本代码详情页。

目前为 2020-12-17 提交的版本。查看 最新版本

// ==UserScript==
// @name         Coder Utils
// @name:en      Coder Utils
// @namespace    http://tampermonkey.net/
// @version      0.2.0
// @description  【使用前先看介绍/有问题可反馈】【欢迎一键三连(好评+打赏+收藏),你的支持是作者维护下去的最大动力!】Coder Utils(程序员专属工具)为程序员专门准备的常用 JavaScript 函数;目前已有:发送请求、下载Blob、下载文件、下载图片、文本复制、文本解码、参数转换;脚本定义的所有函数被定义于 window.utils 中,具体函数使用说明请参照脚本代码详情页。
// @description:en  【使用前先看介绍/有问题可反馈】【欢迎一键三连(好评+打赏+收藏),你的支持是作者维护下去的最大动力!】Coder Utils(程序员专属工具)为程序员专门准备的常用 JavaScript 函数;目前已有:发送请求、下载Blob、下载文件、下载图片、文本复制、文本解码、参数转换;脚本定义的所有函数被定义于 window.utils 中,具体函数使用说明请参照脚本代码详情页。
// @author       cc
// @include      *
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    /**
     * @brief 发送请求,若请求成功,请求结果将存储于 utils.response,请求 URL 将存储于 utils.url
     * @param {string} url 请求 URL, GET 请求的参数既可以置于 url 也可以置于 params
     * @param {string} params 请求参数,形式为 'k1=v1(&k2=v2&...)',默认为无参数
     * @param {string} mode 请求类型,默认为 GET 请求
     * @return {void}
     */
    function sendRequest(url, params='', mode='GET') {
        let request = new XMLHttpRequest();
        if (params.length > 0)
            url = `${url}?${encodeURIComponent(params)}`;
        request.open(mode, url, true);
        request.setRequestHeader('Content-Type', 'application/json');
        request.send();
        request.onreadystatechange = function () {
            if (request.readyState == 4 && request.status == 200) {
                utils.url = url;
                utils.response = request.responseText;
            };
        };
    };
    /**
     * @brief 下载 Blob 对象
     * @param {Blob} blob Blob 对象
     * @param {string} fileName 下载的文件名,默认为 data.csv
     */
    function downloadBlob(blob, fileName) {
        let a = document.createElement('a');
        a.download = fileName;
        a.target = '_blank';
        a.href = URL.createObjectURL(blob);
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    };
    /**
     * @brief 下载 CSV 文件
     * @param {string} csvContent CSV 数据,请使用 ',' 分隔数据值,使用 '\n' 分隔数据行,默认为空字符串
     * @param {string} fileName 下载的 CSV 文件名,默认为 data.csv
     * @return {void}
     */
    function downloadCsv(csvContent='', fileName='data.csv') {
        let a = document.createElement('a');
        let blob = new Blob(['\ufeff' + csvContent], {type: 'text/csv;charset=utf-8;'});
        utils.downloadBlob(blob, fileName);
    };
    /**
     * @brief 下载 base64 编码的图片
     * @param {string} base64Img base64 编码的图片
     * @param {string} fileName 下载的图片文件名,默认为 default.jpg
     */
    function downloadBase64Img(base64Img, fileName='default.jpg') {
        let img = atob(base64Img);
        let arr = new Uint8Array(img.length);
        for (let i = 0; i < img.length; ++i)
            arr[i] = img.charCodeAt(i);
        let blob = new Blob([arr], {type: 'image/png'});
        utils.downloadBlob(blob, fileName);
    };
    /**
     * @brief 将字符串复制至剪切板
     * @param {string} content 需要复制到剪切板的内容,默认为空字符串
     * @return {void}
     */
    function copyToClipboard(content='') {
        let textarea = document.createElement('textarea');
        textarea.value = content;
        document.body.appendChild(textarea);
        textarea.select();
        document.execCommand('copy');
        document.body.removeChild(textarea);
    };
    /**
     * @brief 解码字符串中的 \u 字符为 unicode 字符
     * @param {string} content 需要解码的含有 \u 开头字符的字符串
     * @return {string} 解码后的字符串
     */
    function decode(content='') {
        return unescape(content.replaceAll(/\\u/g, '%u'));
    };
    /**
     * @brief 将参数字符串与参数对象互相转换
     * @param {string, object} params 参数字符串或参数对象,若传入 URL 将自动取其参数字符串作为参数
     * @return {string, object} 转换后的参数对象或参数字符串,若转换失败返回 null
     */
    function parseQuery(params) {
        if (typeof params === 'object') {
            let str = '';
            for (let k in params)
                str += `${k}=${encodeURIComponent(params[k])}`;
            return str;
        } else if (typeof params === 'string') {
            let index = params.indexOf('?');
            let url = index >= 0 ? params.substring(index + 1) : params;
            let obj = {};
            let kvs = url.split('&');
            for (let kv of kvs) {
                let [k, v] = kv.split('=');
                obj[k] = decodeURIComponent(v);
            };
            return obj;
        } else {
            return null;
        };
    };

    // 以上所有函数被定义于 window.utils 中
    window.utils = {
        sendRequest: sendRequest,
        downloadBlob: downloadBlob,
        downloadCsv: downloadCsv,
        downloadBase64Img: downloadBase64Img,
        copyToClipboard: copyToClipboard,
        decode: decode,
        parseQuery: parseQuery,
    };
})();