(function () { const $ = jQuery; //JQ /** * 警告文字块 * ed.selection.setContent("文字"); * ed.selection.select(ed.getBody(), true); * */ tinymce.create('tinymce.plugins.local', { init: function (ed, url) { /** * 替换所有 * @param old * @param search * @param re */ function replaceAll(old, search, re) { while (old.indexOf(search) > -1) { old = old.replace(search, re); } return old; } /** * 替换编辑器内容 * */ function replaceC(content) { ed.setContent(content); } /** * 字符转义 * */ function html2Escape(sHtml) { return sHtml.replace(/[<>&"]/g, function (c) { return {'<': '<', '>': '>', '&': '&', '"': '"'}[c]; }); } /** * 新增插件 * */ ed.addButton('local', { title: '外部图片替换', image: url + '/icon/local.svg', onclick: function () { const confirm = layer.confirm("是否要检索文章内所有外部图片?", function () { //关闭弹出层 layer.close(confirm); /** * 弹出检测窗口 * */ let domain = location.host; let replace = []; //替换列表 let link = []; /** * 获取所有图片 * */ let count = 1; //计数 /** * 遍历所有本地图片 * */ $(ed.getBody()).find("img").each(function (index) { let that = $(this).attr("src"); /** * 如果没有图片 * */ if (!that) { return } /** * 如果没有http * */ if (that.indexOf('http') < 0) { return } /** * 如果图片不包含本地域名 * 如果没有重复的包含 * */ if (that.indexOf(domain) < 0 && link.indexOf(that) < 0) { link.push(that); //记录链接 replace.push(`
${count}. ${that}
`); count++; //加1 } }); /** * 判断是否有外部图片 * */ if (replace.length == 0) { layer.msg("没有找到外部图片"); return; } let content = ed.getContent(); //获取编辑器内容 /** * 弹出 * */ let index = layer.open({ title: "共检测到外部图片" + (count - 1) + "张", content: `
${replace.join('')}
`, area: ['30vw', '50vh'], maxmin: true, closeBtn: 1, btn: ['开始替换'], yes: async function () { let number = 1; let index = null; let flag = true; /** * 终止抓取 * */ function terminate(text = false) { /** * 替换编辑器的内容 * */ replaceC(content); try { flag = false; layer.close(index); if (!text) { layer.msg("成功替换" + (number - 1) + "张外部图片"); } else { layer.msg(text); } $(document).off('keydown'); } catch (e) { console.log(e); } } /** * 监听关闭事件 * */ $(document).bind('keydown', 'esc', terminate); let task = []; //promise let ok = 0; //处理过的数量 /** * 开始循环处理 * */ for (let i of link) { /** * 如果被终止 * */ if (!flag) { break; } index = layer.msg(`正在替换第${number}张,按Esc可停止替换...`, { icon: 16 , shade: 0.1, time: 0 }); task.push(new Promise((resolve) => { /** * 请求服务器接口 * */ $.post('/?nicen_make_replace=1', { private: POST_KEY, img: i }, function (res) { if (res.code === -1) { layer.msg(res.result); resolve(0); } else if (res.code === 1) { /** * 替换变量里的内容 * */ content = replaceAll(content, html2Escape(i), res.result); } else { number--; //未成功 layer.msg(res.result); } resolve(1); //退出本次任务 }, 'json').error(async e => { layer.msg("图片下载异常!"); let timer = setTimeout(() => { clearTimeout(timer); resolve(0); }, 1500); }) })); ok++; //计数 /* 并发数 */ if (task.length === SYNC_NUMBER || ok === link.length) { let code = await Promise.all(task).catch(e => { console.log(e) return false; }); task = []; //空数组 /* 计算成功数 */ for (let k of code) { if (!k) { number--; } } } number++; //数量增加 } terminate("成功替换" + (number - 1) + "张外部图片,记得保存哈,可在插件设置页面查看日志!"); } }); }) } }); }, createControl: function (n, cm) { return null; }, }); tinymce.PluginManager.add('local', tinymce.plugins.local); })();