// ==UserScript== // @name 驼峰翻译助手 - 自动翻译为变量的大驼峰、小驼峰、短横线等命名格式(支持搜狗翻译、有道翻译、百度翻译) // @namespace http://tampermonkey.net/ // @version 0.1 // @description 平常开发取变量名的时候,经常要到翻译网站翻译,翻译结果又要手动转大驼峰、小驼峰、短横线,于是自己开发了一套油猴脚本,直接自动翻译成程序员常用的命名格式。 // @author Kai // @match https://www.tampermonkey.net/index.php?ext=dhdg // @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net // @grant none // @match *://fanyi.sogou.com/text* // @match *://fanyi.youdao.com/* // @match *://fanyi.baidu.com/* // @require http://cdn.bootcss.com/jquery/2.2.4/jquery.min.js // @require https://unpkg.com/pxmu@1.1.0/dist/web/pxmu.min.js // ==/UserScript== (function () { 'use strict'; //===========================声明各种格式的策略对象========================================= //toCamelCase(‘it is word’) => ‘itIsWord’ function toLowerCamelCase(str) { if (!str) { return ''; } try { const s = str .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map((x) => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase()) .join('') return s.slice(0, 1).toLowerCase() + s.slice(1) } catch (e) { return '解析异常' } } //console.log(camelize("Concurrent hash maps")) =》ConcurrentHashMaps function toPascalCase(str) { if (!str) { return ''; } try { //过滤字符串 return str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) //将每个单词的第一个字符转换为大写 .map(a => a[0].toUpperCase() + a.substring(1)) //将所有字符串重新连接在一起 .join("") } catch (e) { return '解析异常' } } //console.log(camelize("Concurrent hash maps")) =》concurrent-hash-maps function toKebabCase(str) { if (!str) { return ''; } try { let strList = str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) return strList.reduce((result, a, index) => { //将每个单词转换为小写 let suffix = index === strList.length - 1 ? '' : "-" result += a.toLowerCase() + suffix return result }, '') } catch (e) { return '解析异常' } } //console.log(camelize("Concurrent hash maps")) =》concurrent_hash_maps function toSnakeCase(str) { if (!str) { return ''; } try { let strList = str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) return strList.reduce((result, a, index) => { //将每个单词转换为小写 let suffix = index === strList.length - 1 ? '' : "_" result += a.toLowerCase() + suffix return result }, '') } catch (e) { return '解析异常' } } //console.log(camelize("Concurrent hash maps")) =》CONCURRENT_HASH_MAPS function toScreamingSnakeCase(str) { if (!str) { return ''; } try { let strList = str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) return strList.reduce((result, a, index) => { //将每个单词转换为大写 let suffix = index === strList.length - 1 ? '' : "_" result += a.toUpperCase() + suffix return result }, '') } catch (e) { return '解析异常' } } var whichNameType = { toLowerCamelCase: toLowerCamelCase, toPascalCase: toPascalCase, toKebabCase: toKebabCase, toSnakeCase: toSnakeCase, toScreamingSnakeCase: toScreamingSnakeCase } var currentWhichNameType = 'toLowerCamelCase' var whichNameHtml = `
驼峰翻译助手
格式:
结果:
一键复制

` //添加操作区域 $("body").append(whichNameHtml) //首先判断是搜狗翻译、有道云翻译还是百度翻译 //根据网站获取结果不同的inputDom //=================================匹配url======================================== let opt = { 'sougou': { urlExp: 'https://fanyi.sogou.com/text', //结果变化的输入框dom input: '#trans-result', name: '搜狗' }, 'youdao': { urlExp: 'https://fanyi.youdao.com/', input: '#transTarget', name: '有道' }, 'baidu': { urlExp: 'https://fanyi.baidu.com/', input: '.output-wrap', name: '百度' }, } var inputDom = null for (let key of Object.keys(opt)) { let item = opt[key] if (location.href.match(item.urlExp)) { inputDom = $(item.input) console.log('dom', item.input) break } } if (!inputDom) { console.warn('驼峰翻译助手:识别输入框dom失败') return } function updateValue() { console.log('翻译事件监听...') let result = whichNameType[currentWhichNameType](inputDom.text()) console.log('翻译结果:', result) $("#which-name-result").text(result) } //第一次进来需要加载一次数据 updateValue() //绑定事件:DOMNodeInserted、DOMSubtreeModified inputDom.bind("DOMSubtreeModified", function (e) { updateValue() }) //绑定单选框切换事件 $("input[type=radio][name=whichNameType]").change(function () { console.log('监听单选框', this.value) currentWhichNameType = this.value updateValue() }) //复制事件 $("#which-name-copy").click(function () { const input = document.createElement('textarea') input.value = whichNameType[currentWhichNameType](inputDom.text()) document.body.appendChild(input) input.select() document.execCommand('Copy') document.body.removeChild(input) pxmu.toast({msg: '复制成功!', location: 'top'}) }) })();