├── .gitignore ├── language ├── zh.js ├── en.js └── index.js ├── package.json ├── README.md └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_* 2 | -------------------------------------------------------------------------------- /language/zh.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | title: "乱码恢复", 3 | success: "操作成功", 4 | error: "操作失败", 5 | cell: { 6 | cella: '输入', 7 | cellb: '转换结果', 8 | }, 9 | form: { 10 | inputtext: '乱码文本', 11 | }, 12 | grid: { 13 | encoding: '字符编码', 14 | result: '结果', 15 | }, 16 | toolbar: { 17 | start: "自动恢复", 18 | reset: "重置", 19 | online: "在线工具", 20 | }, 21 | } 22 | -------------------------------------------------------------------------------- /language/en.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | title: "MessyCodeRecover", 3 | success: "success", 4 | error: "fail", 5 | cell: { 6 | cella: 'Input', 7 | cellb: 'Recover Result', 8 | }, 9 | form: { 10 | inputtext: 'Messy Text', 11 | }, 12 | grid: { 13 | encoding: 'Encoding', 14 | result: 'Result', 15 | }, 16 | toolbar: { 17 | start: "Recover", 18 | reset: "Reset", 19 | online: "Online Tools", 20 | }, 21 | } 22 | -------------------------------------------------------------------------------- /language/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const languages = { 4 | 'en': 'English', 5 | 'zh': '简体中文' 6 | } 7 | 8 | // 获取本地设置语言(如若没有,则获取浏览器语言 9 | let lang = antSword['storage']('language', 10 | false, 11 | navigator.language.substr(0,2) 12 | ); 13 | 14 | // 判断本地设置语言是否符合语言模板 15 | lang = languages[lang] ? lang : 'en'; 16 | 17 | // 返回语言模板 18 | let langModule = require(`./${lang}`); 19 | langModule.__languages__ = languages; 20 | 21 | module.exports = langModule; 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "乱码恢复", 3 | "name_en": "MessyCodeRecover", 4 | "main": "index.js", 5 | "icon": "text-width", 6 | "version": "0.2", 7 | "description": "尝试恢复乱码", 8 | "description_en": "Trying to recover the garbled text", 9 | "author": { 10 | "name": "Medicean", 11 | "email": "Medici.Yan@gmail.com" 12 | }, 13 | "category": "辅助工具", 14 | "category_en": "Support", 15 | "multiple": false, 16 | "scripts": [ 17 | "*", 18 | "php", 19 | "php4", 20 | "asp", 21 | "aspx", 22 | "jsp", 23 | "custom" 24 | ] 25 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AntSword Messy Code Recover 2 | 3 | 尝试恢复乱码, 并非所有乱码都可以被完美恢复,乱码中的问号说明该字符已经丢失,是无法恢复的 4 | 5 | 如果本工具使用效果不理想, 可以尝试使用「[在线工具](http://www.mytju.com/classCode/tools/messyCodeRecover.asp)」 6 | 7 | ## 安装 8 | 9 | ### 商店安装 10 | 11 | 进入 AntSword 插件中心,选择「乱码恢复」,点击安装 12 | 13 | ### 手动安装 14 | 15 | 1.获取源代码 16 | 17 | ```bash 18 | $ git clone https://github.com/Medicean/as_messycoderecover.git 19 | ``` 20 | 21 | 或者 22 | 23 | 点击 [这里](https://github.com/Medicean/as_messycoderecover/archive/master.zip) 下载源代码,并解压。 24 | 25 | 2.拷贝源代码至插件目录 26 | 27 | 将插件目录拷贝至 `antSword/antData/plugins/` 目录下即安装成功 28 | 29 | ## 演示图 30 | 31 | ![messycoderecover.png](https://i.loli.net/2019/05/16/5cdd0319bd0d599741.png) 32 | 33 | ## 相关链接 34 | 35 | * [AntSword 文档](http://doc.u0u.us) 36 | * [dhtmlx 文档](http://docs.dhtmlx.com/) 37 | * [messyCodeRecover](http://www.mytju.com/classCode/tools/messyCodeRecover.asp) -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 2 | 'use strict'; 3 | 4 | const LANG_T = antSword['language']['toastr']; // 通用通知提示 5 | const LANG = require('./language/'); // 插件语言库 6 | 7 | const iconv = require('iconv-lite') 8 | /** 9 | * 插件类 10 | */ 11 | class Plugin { 12 | constructor(opt) { 13 | let self = this; 14 | let hash = String(Math.random()).substr(2, 10); 15 | antSword.tabbar.addTab( 16 | `tab_messycoderecover_${hash}`, 17 | ` ${LANG['title']}`, 18 | null, null, true, true 19 | ); 20 | let cell = antSword.tabbar.cells(`tab_messycoderecover_${hash}`); 21 | self.cell = cell; 22 | self.support_encoding = [ 23 | 'GBK', 24 | 'GB2312', 25 | 'UTF8', 26 | 'BIG5', 27 | 'Euc-KR', 28 | 'Euc-JP', 29 | 'Shift_JIS', 30 | 'ISO-8859-1', 31 | 'Windows-874', 32 | 'Windows-1251' 33 | ]; 34 | self.createMainLayout(); 35 | self.bindToolbarClickHandler(); 36 | } 37 | 38 | createMainLayout() { 39 | let self = this; 40 | let layout = self.cell.attachLayout('2E'); 41 | layout.cells('a').hideHeader(); 42 | layout.cells('a').setText(` ${LANG['cell']['cella']}`); 43 | layout.cells('b').setText(` ${LANG['cell']['cellb']}`); 44 | layout.cells('b').collapse(); 45 | // 创建toolbar 46 | this.createToolbar(layout.cells('a')); 47 | // 创建form 48 | this.createForm(layout.cells('a')); 49 | // 创建grid 50 | this.createGrid(layout.cells('b')); 51 | 52 | this.layout = layout; 53 | } 54 | 55 | createToolbar(cell) { 56 | let toolbar = cell.attachToolbar(); 57 | toolbar.loadStruct([ 58 | { id: 'start', type: 'button', text: LANG['toolbar']['start'], icon: 'play' }, 59 | { id: 'reset', type: 'button', text: LANG['toolbar']['reset'], icon: 'undo' }, 60 | { id: 'online', type: 'button', text: LANG['toolbar']['online'], icon: 'chrome' }, 61 | ]); 62 | this.toolbar = toolbar; 63 | } 64 | 65 | createForm(cell) { 66 | let formdata = [{ 67 | type: 'settings', position: 'label-left', 68 | labelWidth: 150, inputWidth: 500 69 | }, { 70 | type: 'block', inputWidth: 'auto', 71 | offsetTop: 12, 72 | list: [{ 73 | type: 'input', label: LANG['form']['inputtext'], name: 'inputtext', rows: "20", 74 | required: true, validate:"NotEmpty", value: "锘挎槬鐪犱笉瑙夋檽锛屽澶勯椈鍟奸笩", 75 | }], 76 | }]; 77 | let form = cell.attachForm(formdata, true); 78 | form.enableLiveValidation(true); 79 | this.form = form; 80 | } 81 | 82 | createGrid(cell) { 83 | let grid = cell.attachGrid(); 84 | grid.setHeader(` 85 | ${LANG['grid']['encoding']}, 86 | ${LANG['grid']['result']} 87 | `); 88 | grid.setColTypes("ro,edtxt"); 89 | grid.setColSorting('str,str'); 90 | grid.setInitWidths("200,*"); 91 | grid.setColAlign("center,left"); 92 | grid.init(); 93 | 94 | this.grid = grid; 95 | } 96 | bindToolbarClickHandler() { 97 | let self = this; 98 | let form = self.form; 99 | self.toolbar.attachEvent('onClick', (id)=>{ 100 | switch (id) { 101 | case 'start': 102 | if(form.validate()) { 103 | var _formvals = form.getValues(); 104 | let inputtext = _formvals['inputtext']; 105 | let griddata = []; 106 | self.support_encoding.map((encoding, i) => { 107 | let text = ''; 108 | try { 109 | text = iconv.encode(Buffer.from(inputtext), encoding).toString(); 110 | }catch (err) { 111 | text = '??????'; 112 | } 113 | griddata.push({ 114 | id: i + 1, 115 | data: [encoding, antSword.noxss(text)], 116 | }); 117 | }); 118 | self.grid.clearAll(); 119 | self.grid.parse({ 120 | rows: griddata, 121 | }, 'json'); 122 | self.layout.cells('b').expand(); 123 | toastr.success(LANG['success'], LANG_T['success']); 124 | } 125 | break; 126 | case 'reset': 127 | self.grid.clearAll(); 128 | self.layout.cells('b').collapse(); 129 | form.setItemValue('inputtext', '锘挎槬鐪犱笉瑙夋檽锛屽澶勯椈鍟奸笩'); 130 | break; 131 | case 'online': 132 | antSword.shell.openExternal("http://www.mytju.com/classCode/tools/messyCodeRecover.asp"); 133 | break; 134 | } 135 | }); 136 | } 137 | } 138 | 139 | module.exports = Plugin; --------------------------------------------------------------------------------