var i18nDetailData = { 'zh': { 'uploadText': '有正在上传的内容!', 'uploadImg': '有正在上传的图片!', 'download': '下载', 'preview': '预览', 'fullscreen': '全屏', 'exitFullscreen': '退出全屏', 'saveToCloud': '保存到云盘', 'Share': '转发', 'bultEdit': '批量编辑', 'more': '更多', 'copy': '复制', 'copySuccess': '复制成功', 'copyFailed': '复制失败', }, 'en': { 'uploadText': 'Content is being uploaded!', 'uploadImg': 'Image is being uploaded!', 'download': 'Download', 'preview': 'Preview', 'fullscreen': 'Full Screen', 'exitFullscreen': 'Exit Full Screen', 'saveToCloud': 'Save to Cloud disk', 'Share': 'Share', 'bultEdit': 'Bulk Edit', 'more': 'More', 'copy': 'Copy', 'copySuccess': 'Copy successfully', 'copyFailed': 'Failed to copy', }, 'zh_tw': { 'uploadText': '有正在上傳的內容!', 'uploadImg': '有正在上傳的圖片!', 'download': '下載', 'preview': '預覽', 'fullscreen': '全屏', 'exitFullscreen': '退出全屏', 'saveToCloud': '保存到雲盤', 'Share': '轉發', 'bultEdit': '批量編輯', 'more': '更多', 'copy': '複製', 'copySuccess': '複製成功', 'copyFailed': '複製失敗', } } if (typeof RichTextUitl.noteDomain == 'undefined') { RichTextUitl.noteDomain = window.location.protocol + '//noteyd.chaoxing.com' } RichTextUitl.uploadUrl = 'https://pan-yz.chaoxing.com/upload'; RichTextUitl.language = window.cookieLanguage = typeof (window.cookieLanguage) != "undefined" ? window.cookieLanguage : RichTextUitl.getCookie('browserLocale') var language = (window.cookieLanguage || navigator.language || 'zh').toLowerCase() /** * 获取国际化内容 * @param content * @returns {string|*} */ RichTextUitl.getI18nContent = function (content) { if (!content) { return ''; } // 获取设置的语言 var language = (window.language || navigator.language || 'zh').toLocaleLowerCase() // 这是获取浏览器的语言 if (language.indexOf('en') > -1) { language = 'en' } else if (language.indexOf('zh_tw') > -1 || language.indexOf('zh-tw') > -1) { language = 'zh_tw' } else { language = 'zh' } content = i18nDetailData[language][content] return content; } var ua = navigator.userAgent.toLowerCase(); RichTextUitl.isIOS = /(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent); //ios终端 RichTextUitl.isAndroid = /(Android)/i.test(navigator.userAgent); //android终端 RichTextUitl.isHarmony = navigator.userAgent.indexOf('harmony') > -1 && navigator.userAgent.indexOf('phone') > -1; //鸿蒙终端 // 是否在手机学习通里面 RichTextUitl.isXXT = ua && ua.indexOf("chaoxingstudy") != -1 && ua.indexOf('_pc_') == -1; // 是否是微信端 RichTextUitl.isWeiXin = ua.match(/MicroMessenger/i) == 'micromessenger'; var isIosQQ = (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent) && /\sQQ/i.test(navigator.userAgent)); var isAndroidQQ = (/(Android)/i.test(navigator.userAgent) && /MQQBrowser/i.test(navigator.userAgent) && /\sQQ/i.test((navigator.userAgent).split('MQQBrowser'))); var isHarmonyQQ = navigator.userAgent.indexOf('harmony') > -1 && /\sQQ/i.test(navigator.userAgent) //鸿蒙终端 RichTextUitl.isQQ = isIosQQ || isAndroidQQ || isHarmonyQQ; /** * 参数:显示错误提示的方法, function(msg){} * * 返回json串 * content : 普通文本内容 * content_imgs : 图片 * attachment : 附件 * rtf_content : 富文本内容 * istestContent:是否是检测数据 */ RichTextUitl.getRichText = function (showTipsFunction, editorId, istestContent) { var return_data = {}; if (editorId) { ue = UE.getEditor(editorId); } var iframe = ue.iframe; var doc = iframe.contentDocument || iframe.document; var attachments; var $noteImgs; var isVideoUploadFail = false; if (doc) { attachments = doc.getElementsByTagName('iframe'); $noteImgs = doc.getElementsByTagName("img"); if (!istestContent && (doc.getElementsByClassName("imgprogress").length > 0 || doc.getElementsByClassName("attachprogress").length > 0 || doc.getElementsByClassName("video_fail").length > 0)) { // 有未上传完的图片 if (typeof showTipsFunction == 'function') { showTipsFunction(RichTextUitl.getI18nContent('uploadText'), 0); return; } return_data.isuploading = true; // 判断是否存在上传失败视频 $.each(doc.querySelectorAll('.video_fail'), function (_, elm) { if ($(elm).css('display') !== 'none') { isVideoUploadFail = true; } }) if (doc.querySelector(".imgprogress.failed") || doc.querySelector('.attachprogress.fail') || isVideoUploadFail) { return_data.hasUploadFailed = true; } } // 卡片附件改为文本链接附件后,可以修改链接内容,保存时需要获取链接内容然后修改对应的附件里面的数据 var aTags = doc.getElementsByTagName("a"); $.each(aTags, function (idx, val) { var name = val.getAttribute('name'); var module = val.getAttribute('module'); if (name && module) { var hasChange = false; var attachmentContent = RichTextUitl.b64DecodeUnicode(name); if (attachmentContent) { if (module == 'insertCloud' && attachmentContent.att_clouddisk && attachmentContent.att_clouddisk.name != val.text) { // 云盘附件 attachmentContent.att_clouddisk.name = val.text; attachmentContent.att_clouddisk.infoJsonStr.name = val.text; hasChange = true; } else if (module == 'insertWeb' && attachmentContent.att_web && attachmentContent.att_web.title != val.text) { // 网页附件 attachmentContent.att_web.title = val.text; hasChange = true; } } if (hasChange) { attachmentContent = RichTextUitl.b64EncodeUnicode(JSON.stringify(attachmentContent)); val.setAttribute('name', attachmentContent); } } }) } // 获取带格式的文本内容(去掉了文本标签,转义了换行和空格)、图片标签、iframe标签 var content = '', rtf_content = '', full_content = ''; try { content = ue.getPlainTxt(); } catch (e) { content = doc.body.innerText; } full_content = content; try { // 获取html内容,包含所有标签 rtf_content = ue.getContent(); } catch (e) { rtf_content = doc.body.innerHTML; } var content_imgs = ''; // 需要移除的图片 var needRemoveImgs = []; // 处理图片 if ($noteImgs.length > 0) { for (var i = 0; i < $noteImgs.length; i++) { var imgSrc = $.trim($noteImgs[i].getAttribute("src")); if (imgSrc.indexOf('/images/spacer.gif') > 0) { if ($noteImgs[i].getAttribute('class') == 'loadingclass') { // 包含编辑器里面在复制图片时用的占位图,需要去掉 // 有未上传完的图片 if (typeof showTipsFunction == 'function') { showTipsFunction(RichTextUitl.getI18nContent('uploadImg'), 0); return; } return_data.isuploading = true; } else { needRemoveImgs.push($noteImgs[i].parentNode); } } else if (!imgSrc && $noteImgs[i].getAttribute("_src")) { //未替换完成图片 return_data.hasUnReplaceImg = true; } } // 匹配 img 标签的正则表达 var imgReg = /|\/>)/gi; // 匹配 img 标签 src 属性的正则表达 var srcReg = / src=[\'\"]?([^\'\"]*)[\'\"]?/i; // 匹配 img 标签 objectid 属性的正则表达 var objectidReg = /objectid=[\'\"]?([^\'\"]*)[\'\"]?/i; // 包含所有img标签的数组 var imgArr = content.match(imgReg); // app下面写总结用到了编辑器,获取的content要和笔记的一样 var isNoteDomain = window.location.host.indexOf('noteyd') > -1 || window.location.host.indexOf('note.yd') > -1 || window.location.host.indexOf('appswh') > -1; // 如果是镜像模式,isNoteDomain 也为true if (window.obj && window.obj.mirrorDomain && window.obj.mirrorDomain.hasOwnProperty('isMirrorDeploy')) { if (window.obj.mirrorDomain.isMirrorDeploy == true) { if (window.location.href.indexOf('noteyd') != -1) { isNoteDomain = true; } } } if (isNoteDomain) { // 笔记服务特殊处理 content_imgs = {}; for (var i = 0; i < imgArr.length; i++) { //获取图片地址 var imgSrc = imgArr[i].match(srcReg); // 获取objectid var objectId = imgArr[i].match(objectidReg); if (imgSrc && imgSrc[1] && imgSrc[1].indexOf('http') == 0 && imgSrc[1].indexOf('/images/spacer.gif') == -1) { // 默认用uuid,避免有的图片标签上没有objectid时 var placeholder = RichTextUitl.randomUUID(); if (objectId && objectId[1]) { placeholder = objectId[1]; } content_imgs[placeholder] = imgSrc[1]; content = content.replace(imgArr[i], "(№♂◎┟ξψ┽" + placeholder + ")"); full_content = full_content.replace(imgArr[i], imgSrc[1]) } else { content = content.replace(imgArr[i], ""); full_content = full_content.replace(imgArr[i], "") } } } else { content_imgs = ""; for (var i = 0; i < imgArr.length; i++) { //获取图片地址 var imgSrc = imgArr[i].match(srcReg); if (imgSrc && imgSrc[1] && imgSrc[1].indexOf('http') == 0 && imgSrc[1].indexOf('/images/spacer.gif') == -1) { content_imgs += imgSrc[1] + ";"; } content = content.replace(imgArr[i], ""); if (imgSrc && imgSrc[1]) { full_content = full_content.replace(imgArr[i], imgSrc[1]) } } } } if (needRemoveImgs.length > 0) { for (var i = 0; i < needRemoveImgs.length; i++) { if (needRemoveImgs[i].getAttribute('class') == 'editor-image') { needRemoveImgs[i].remove(); } else { // 火狐浏览器复制QQ聊天框里面的内容是,图片和文字在同一个div里面,且div上没有editor-image,只删除图片,不删除整个div needRemoveImgs[i].getElementsByTagName('img')[0].remove(); } } // 包含有问题的图片,重新获取富文本内容 rtf_content = ue.getContent(); } // 处理附件 var attachmentStr = ""; if (attachments.length > 0) { var attachmentArray = new Array(); for (i = 0; i < attachments.length; i++) { // 获取附件内容 var att = attachments[i].getAttribute('name'); var att_json = RichTextUitl.b64DecodeUnicode(att); try { if (att_json) { if (att_json.attachmentType == 18) { // 云盘内容在iframe上存储时需要将 infoJsonStr 和 parentPath 转成json(客户端目前这样做的),在最终保存附件时需要把 infoJsonStr 和 parentPath 转回成string(客户端要求) att_json.att_clouddisk.infoJsonStr = JSON.stringify(att_json.att_clouddisk.infoJsonStr); att_json.att_clouddisk.parentPath = JSON.stringify(att_json.att_clouddisk.parentPath); } attachmentArray.push(JSON.stringify(att_json)); } } catch (e) { console.log(e); } // var att_text = attachments[i].outerHTML; // // 替换掉文本内容里面的附件 // content = content.replace(att_text.replace("",""),""); } if (attachmentArray.length > 0) { attachmentStr = "[" + attachmentArray.join() + "]"; } } // 替换掉文本内容里面的附件 content = content.replace(/<[^>]+>/g, ''); full_content = full_content.replace(/<[^>]+>/g, ''); //PC编辑器之间复制附件会带上当前页面的路径,需要去掉 if (rtf_content && !RichTextUitl.intranetMode) { var iframeReg = /)/gi; //匹配iframe标签 var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; // 匹配iframe中的src var arr = rtf_content.match(iframeReg); //筛选出所有的iframe var srcArr = []; if (arr) { for (var i = 0; i < arr.length; i++) { var src = arr[i].match(srcReg); var module = arr[i].match(/module=[\'\"]?([^\'\"]*)[\'\"]?/i); // 获取iframe src if (src && src[1]) { //srcArr.push(src[1]); iframe_src = src[1]; if (iframe_src.indexOf("insert") > 0) { // 包含insert且不是以insert开头的才需要替换 rtf_content = rtf_content.replace(iframe_src, iframe_src.substring(iframe_src.indexOf("insert"), iframe_src.length)); } if (module && module.length > 1 && module[1] == 'insertCloud') { if (iframe_src.indexOf('//previewyd.chaoxing.com/res/view/view.html') > -1) { // 文件开启原位预览后,保存时地址要改回成insertCloud.html,避免影响手机上查看 rtf_content = rtf_content.replace(iframe_src, 'insertCloud.html'); } } if (iframe_src.indexOf('appswh.chaoxing.com/res/Spreadsheets/wpsPC.html') > -1) { // 在线表格,保存时地址要改成 insertWeb.html,避免影响手机上查看 rtf_content = rtf_content.replace(iframe_src, 'insertWeb.html'); } } } } // 匹配卡片附件转换成的文本附件,为了不影响客户端的附件点击逻辑,保存时需要改回成卡片附件 // 门户那边不需要做这个处理,只处理笔记,话题,通知,课程那边 // 取消将a标签改回卡片附件的逻辑 // var currentHost = location.host; // if (currentHost.indexOf('note') > -1 || currentHost.indexOf('notice') > -1 // || currentHost.indexOf('groupweb') > -1 || currentHost.indexOf('mobilelearn') > -1) { // try { // rtf_content = RichTextUitl.replaceATagWithIframe(rtf_content); // } catch (e) { // console.log(e); // } // } // var divReg = /
/]*?class="editor-textiframe" [^>/]*>(.*?)<\/div>/gi; // var aReg = /]*name=['"]([^"]*)['"][^>]*>(.*?)<\/a>/gi; // //var aReg=/]+[\s]+)name=(\"([^<>"\']*)\"|\'([^<>"\']*)\')[^<>]*>/gi; // var nameReg = /name=[\'\"]?([^\'\"]*)[\'\"]?/i; // 匹配iframe中的src // var moduleReg = /module=[\'\"]?([^\'\"]*)[\'\"]?/i; // 匹配iframe中的src // var divTag = rtf_content.match(divReg); // if (divTag && divTag.length > 0) { // for (var i = 0; i < divTag.length; i++) { // var aTag = divTag[i].match(aReg); // if (aTag && aTag.length > 0) { // for(var j = 0; j < aTag.length; j++) { // var name = aTag[j].match(nameReg); // var module = aTag[j].match(moduleReg); // if (name && name[1] && module && module[1]) { // rtf_content = rtf_content.replace(divTag[i], RichTextUitl.changeAttachmentModel(name[1], module[1], 'iframe')) // } // } // } // } // } } return_data.content = restoresEscapedCharacter(content); return_data.full_content = restoresEscapedCharacter(full_content); if (isNoteDomain) { // 笔记服务的content_imgs 为json 结构 return_data.content_imgs = JSON.stringify(content_imgs); } else { return_data.content_imgs = content_imgs; } return_data.attachment = attachmentStr.replace(/'/g, "'");// 附件中的内容包含单引号时进行了转换,保存时替换回来; return_data.rtf_content = rtf_content.replace(/'/g, "'"); // 附件中的内容包含单引号时进行了转换,保存时替换回来; return return_data; } // 根据html获取图片附件和纯文本 RichTextUitl.getAllContent = function (html) { function _(s) { for (var k in s) { s[k.toUpperCase()] = s[k]; } return s; } var dtd = _({ address: 1, blockquote: 1, center: 1, dir: 1, div: 1, dl: 1, fieldset: 1, form: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1, hr: 1, isindex: 1, menu: 1, noframes: 1, ol: 1, p: 1, pre: 1, table: 1, ul: 1 }); // 获取带格式的文本内容(去掉了文本标签,转义了换行和空格)、图片标签、iframe标签 var div = document.createElement('div'); div.innerHTML = html; $(div).find("ol li").each(function () { $(this).prepend($(this).attr('serialnum') + ". "); }); $(div).find("ul li").each(function () { var level = parseInt($(this).parent().attr('level')) || 1; switch (level % 3) { case 0: $(this).prepend(" ▪ "); break; case 1: $(this).prepend("• "); break; case 2: $(this).prepend(" ◦ "); break; default: break; } }); //避免生成的图片后多一个空行 $(div).find(".drag-image-wrap .editor-image").each(function () { $(this).unwrap(); }); html = $(div).html(); var reg = new RegExp('\u200B', 'g'); html = html.replace(/[\n\r]/g, ''); //ie要先去了\n在处理 html = html.replace(/<(ol|ul|li)[^>]*>/g, '').replace(/<(\/ol|\/ul|\/li)>/g, ''); html = html.replace(/<(p|div)[^>]*>(| )<\/\1>/gi, '\n') .replace(//gi, '\n') .replace(/<[^>/]+>/g, '') .replace(/(\n)?<\/([^>]+)>/g, function (a, b, c) { return dtd[c] ? '\n' : b ? b : ''; }) // .replace(/<[^(img)][^>]+>/g, ''); //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 html = html.replace(reg, '').replace(/\u00a0/g, ' ').replace(/ /g, ' '); var attachments; var $noteImgs; if (doc) { attachments = doc.getElementsByTagName('iframe'); $noteImgs = doc.getElementsByTagName("img"); if (!istestContent && (doc.getElementsByClassName("imgprogress").length > 0 || doc.getElementsByClassName("attachprogress").length > 0 || doc.getElementsByClassName("video_fail").length > 0)) { // 有未上传完的图片 if (typeof showTipsFunction == 'function') { showTipsFunction(RichTextUitl.getI18nContent('uploadText'), 0); } return; } // 卡片附件改为文本链接附件后,可以修改链接内容,保存时需要获取链接内容然后修改对应的附件里面的数据 var aTags = doc.getElementsByTagName("a"); $.each(aTags, function (idx, val) { var name = val.getAttribute('name'); var module = val.getAttribute('module'); if (name && module) { var hasChange = false; var attachmentContent = RichTextUitl.b64DecodeUnicode(name); if (attachmentContent) { if (module == 'insertCloud' && attachmentContent.att_clouddisk && attachmentContent.att_clouddisk.name != val.text) { // 云盘附件 attachmentContent.att_clouddisk.name = val.text; attachmentContent.att_clouddisk.infoJsonStr.name = val.text; hasChange = true; } else if (module == 'insertWeb' && attachmentContent.att_web && attachmentContent.att_web.title != val.text) { // 网页附件 attachmentContent.att_web.title = val.text; hasChange = true; } } if (hasChange) { attachmentContent = RichTextUitl.b64EncodeUnicode(JSON.stringify(attachmentContent)); val.setAttribute('name', attachmentContent); } } }) } // 获取带格式的文本内容(去掉了文本标签,转义了换行和空格)、图片标签、iframe标签 var content = '', full_content = ''; var content_imgs = ''; // 需要移除的图片 var needRemoveImgs = new Array(); // 处理图片 if ($noteImgs.length > 0) { for (var i = 0; i < $noteImgs.length; i++) { var imgSrc = $.trim($noteImgs[i].getAttribute("src")); if (imgSrc.indexOf('/images/spacer.gif') > 0) { needRemoveImgs.push($noteImgs[i].parentNode); } } // 匹配 img 标签的正则表达 var imgReg = /|\/>)/gi; // 匹配 img 标签 src 属性的正则表达 var srcReg = / src=[\'\"]?([^\'\"]*)[\'\"]?/i; // 包含所有img标签的数组 var imgArr = content.match(imgReg); content_imgs = ""; for (var i = 0; i < imgArr.length; i++) { //获取图片地址 var imgSrc = imgArr[i].match(srcReg); if (imgSrc && imgSrc[1] && imgSrc[1].indexOf('http') == 0 && imgSrc[1].indexOf('/images/spacer.gif') == -1) { content_imgs += imgSrc[1] + ";"; } content = content.replace(imgArr[i], ""); full_content = full_content.replace(imgArr[i], imgSrc[1]) } } if (needRemoveImgs.length > 0) { for (var i = 0; i < needRemoveImgs.length; i++) { if (needRemoveImgs[i].getAttribute('class') == 'editor-image') { needRemoveImgs[i].remove(); } else { // 火狐浏览器复制QQ聊天框里面的内容是,图片和文字在同一个div里面,且div上没有editor-image,只删除图片,不删除整个div needRemoveImgs[i].getElementsByTagName('img')[0].remove(); } } // 包含有问题的图片,重新获取富文本内容 rtf_content = ue.getContent(); } // 处理附件 var attachmentStr = ""; if (attachments.length > 0) { var attachmentArray = new Array(); for (i = 0; i < attachments.length; i++) { // 获取附件内容 var att = attachments[i].getAttribute('name'); var att_json = RichTextUitl.b64DecodeUnicode(att); try { if (att_json) { if (att_json.attachmentType == 18) { // 云盘内容在iframe上存储时需要将 infoJsonStr 和 parentPath 转成json(客户端目前这样做的),在最终保存附件时需要把 infoJsonStr 和 parentPath 转回成string(客户端要求) att_json.att_clouddisk.infoJsonStr = JSON.stringify(att_json.att_clouddisk.infoJsonStr); att_json.att_clouddisk.parentPath = JSON.stringify(att_json.att_clouddisk.parentPath); } attachmentArray.push(JSON.stringify(att_json)); } } catch (e) { console.log(e); } } if (attachmentArray.length > 0) { attachmentStr = "[" + attachmentArray.join() + "]"; } } // 替换掉文本内容里面的附件 content = content.replace(/<[^>]+>/g, ''); full_content = full_content.replace(/<[^>]+>/g, ''); //PC编辑器之间复制附件会带上当前页面的路径,需要去掉 var iframeReg = /)/gi; //匹配iframe标签 var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; // 匹配iframe中的src var arr = rtf_content.match(iframeReg); //筛选出所有的iframe var srcArr = []; if (arr) { for (var i = 0; i < arr.length; i++) { var src = arr[i].match(srcReg) // 获取iframe src if (src && src[1]) { //srcArr.push(src[1]); iframe_src = src[1]; if (iframe_src.indexOf("insert") > 0) { // 包含insert且不是以insert开头的才需要替换 rtf_content = rtf_content.replace(iframe_src, iframe_src.substring(iframe_src.indexOf("insert"), iframe_src.length)); } if (iframe_src.indexOf('//previewyd.chaoxing.com/res/view/view.html') > -1) { // 文件开启原位预览后,保存时地址要改回成insertCloud.html,避免影响手机上查看 rtf_content = rtf_content.replace(iframe_src, 'insertCloud.html'); } if (iframe_src.indexOf('appswh.chaoxing.com/res/Spreadsheets/wpsPC.html') > -1) { // 在线表格,保存时地址要改成 insertWeb.html,避免影响手机上查看 rtf_content = rtf_content.replace(iframe_src, 'insertWeb.html'); } } } } return_data.content = restoresEscapedCharacter(content); return_data.full_content = restoresEscapedCharacter(full_content); return_data.content_imgs = content_imgs; return_data.attachment = attachmentStr.replace(/'/g, "'");// 附件中的内容包含单引号时进行了转换,保存时替换回来; return return_data; } /** * 匹配卡片附件转换成的文本附件,为了不影响客户端的附件点击逻辑,保存时需要改回成卡片附件 * @param name * @param module * @param tag */ RichTextUitl.replaceATagWithIframe = function (rtf_content) { if (!rtf_content) { return rtf_content; } //var divReg = /
/]*?class="editor-textiframe" [^>/]*>(.*?)<\/div>/gi; var aReg = /]*name=['"]([^"]*)['"][^>]*>(.*?)<\/a>/gi; // 匹配name属性 var nameReg = /name=[\'\"]?([^\'\"]*)[\'\"]?/i; // 匹配 module 属性 var moduleReg = /module=[\'\"]?([^\'\"]*)[\'\"]?/i; var aTag = rtf_content.match(aReg); if (!aTag || aTag.length == 0) { return rtf_content; } for (var j = 0; j < aTag.length; j++) { var name = aTag[j].match(nameReg); var module = aTag[j].match(moduleReg); if (name && name.length > 1 && name[1] && module && module.length > 1 && module[1]) { rtf_content = rtf_content.replace(aTag[j] , RichTextUitl.changeAttachmentModel(name[1], module[1], 'iframe')); } } // var divTag = rtf_content.match(divReg); // if (!divTag || divTag.length == 0) { // return rtf_content; // } // 遍历div,将文本链接替换成卡片形式 // for (var i = 0; i < divTag.length; i++) { // var aTag = divTag[i].match(aReg); // if (!aTag || aTag.length == 0) { // continue; // } // for(var j = 0; j < aTag.length; j++) { // var name = aTag[j].match(nameReg); // var module = aTag[j].match(moduleReg); // if (name && name.length > 1 && name[1] && module && module.length > 1 && module[1]) { // rtf_content = rtf_content.replace(divTag[i] // , RichTextUitl.changeAttachmentModel(name[1], module[1], 'iframe')); // } // } // } return rtf_content; } /** * 文本链接附件保存时是转成成了卡片附件,显示的时候再调换回来, * 目的是为了客户端上面还是显示成卡片形式,不影响客户端的附件点击效果 * @param name * @param module * @param tag */ RichTextUitl.replaceIframeWithATag = function (rtf_content) { if (!rtf_content) { return rtf_content; } var divReg = /
/]*?class="editor-iframe textlink" [^>/]*>(.*?)<\/div>/gi; var iframeReg = /]*name=['"]([^"]*)['"][^>]*>(.*?)<\/iframe>/gi; // 匹配 name属性 var nameReg = /name=[\'\"]?([^\'\"]*)[\'\"]?/i; // 匹配 module 属性 var moduleReg = /module=[\'\"]?([^\'\"]*)[\'\"]?/i; var divTag = rtf_content.match(divReg); if (!divTag || divTag.length == 0) { return rtf_content; } // 遍历div,将卡片附件(iframe标签)替换成文本链接附件(a标签) for (var i = 0; i < divTag.length; i++) { var iframeTag = divTag[i].match(iframeReg); if (!iframeTag || iframeTag.length == 0) { continue; } for (var j = 0; j < iframeTag.length; j++) { var name = iframeTag[j].match(nameReg); var module = iframeTag[j].match(moduleReg); if (name && name.length > 1 && name[1] && module && module.length > 1 && module[1]) { rtf_content = rtf_content.replace(divTag[i] , RichTextUitl.changeAttachmentModel(name[1], module[1], 'a')); } } } return rtf_content; } /** * 文件设置为预览模式时,保存时地址还是存的insertCloud.html,避免在手机客户端查看有问题,这里显示的时候再替换回来 * @param editorid 编辑器id * @returns {*} */ RichTextUitl.replaceIframeWithPreviewMode = function (editorid) { var editor; if (editorid) { editor = UE.getEditor(editorid); } else if (ue) { editor = ue; } else { return; } var attachments = editor.body.getElementsByTagName('iframe'); if (attachments && attachments.length > 0) { $.each(attachments, function (idx, val) { var allowDownload = true; if ((($(this).attr('allowdownload') == 'false' && $(this).attr('download') == 'false') || ($(this).attr('allowdownload') == 'true' && !RichTextUitl.isLogin)) || ($(this).attr('download') == 'no') || ($(this).attr('download') == 'login' && !RichTextUitl.isLogin)) { // 不允许下载 allowDownload = false; } if ($(this).attr('preview') == 'true' && $(this).attr('module') == 'insertCloud') { // 开启了原位预览 var att_clouddisk = RichTextUitl.getCloudFileData($(this).attr('name')); var iframeSrc = window.location.protocol + '//previewyd.chaoxing.com/res/view/view.html?objectid=' + att_clouddisk.fileId + '&fileName=' + encodeURIComponent(RichTextUitl.getCloudFileName($(this).attr('name'))); if (att_clouddisk.suffix == 'xlsx' || att_clouddisk.suffix == 'xls') { // excel附件,预览模式使用在线表格的页面 iframeSrc = window.location.protocol + '//appswh.chaoxing.com/res/Spreadsheets/wpsPC.html?type=attachment&cid=' + $(this).attr('cid') + '&resid=' + (att_clouddisk.residstr || att_clouddisk.resid) + '&title=' + encodeURIComponent(att_clouddisk.name) + '&editorid=' + editorid; } //设置了高级预览的显示时加上高级预览的参数 if (att_clouddisk.suffix == 'pdf' && $(this).attr('advancedpreview')) { iframeSrc += '&mode=advancedpreview'; if ($(this).attr('advancedpreview') != 'true') { iframeSrc += '&page=' + $(this).attr('advancedpreview'); } } else if (RichTextUitl.useWpsPreview) { iframeSrc += '&type=wps'; } if (!allowDownload) { iframeSrc += '&download=false'; } if (!RichTextUitl.isGetVideoDataFromCenter) { resid = att_clouddisk.resid iframeSrc += '&resid=' + resid; } $(this).attr('src', iframeSrc); } else if ($(this).attr('excel') == 'true' && $(this).attr('module') == 'insertWeb') { // 在线表格 var onlineExcelUrl = window.location.protocol + '//appswh.chaoxing.com/res/Spreadsheets/wpsPC.html?isEditorStatus=1&cid=' + $(this).attr('cid') + '&editorid=' + editorid; if (typeof WinInitConfig != 'undefined' && WinInitConfig.noteCid) { onlineExcelUrl += '¬eCid=' + WinInitConfig.noteCid; } if (!allowDownload) { onlineExcelUrl += '&download=0'; } $(this).attr('src', onlineExcelUrl); } }) } } /** * msg 显示的内容 * type 0、失败提示,1、成功提示 */ RichTextUitl.showTips = function (msg, type) { if (!msg) { return; } var iconPrefix = window.location.protocol + window.obj.mirrorDomain.NoteDomainHttps.replace("https:", '').replace('http:', '') if ($('.toolTipBox').length == 0) { $(document.body).append('') } else { $('.toolTipBox .popicon').removeClass('loading') $('.toolTipBox .tipstext').text(msg); } if (type == 0) { $('.toolTipBox img').attr('src', iconPrefix + '/res/plugin/ueditor/themes/default/images/wrong.png'); } else { $('.toolTipBox img').attr('src', iconPrefix + '/res/plugin/ueditor/themes/default/images/right.png'); } $('.toolTipBox').show(); setTimeout(function () { $('.toolTipBox').fadeOut(); }, 3000) } RichTextUitl.showPreview = function (attachment, $iframe) { // 镜像不支持预览 // if (window.obj && window.obj.mirrorDomain && window.obj.mirrorDomain.isMirrorDeploy) { // return false; // } if (window.location.host.indexOf('course.ustc.edu.cn') > -1 && !(RichTextUitl.prefix && RichTextUitl.prefix.indexOf('chaoxing.com') > -1)) { return false; } if (window.obj && window.obj.mirrorDomain && window.obj.mirrorDomain.NoteDomain.indexOf('chaoxing.com') == -1 && window.obj.mirrorDomain.previewDomainHttps.indexOf('chaoxing.com') > -1) { //笔记是单位域名,预览是超星域名,不允许预览 if (!(RichTextUitl.cloudUrl && RichTextUitl.cloudUrl.indexOf('pan-yz.chaoxing.com') > -1)) { return false } } if (typeof RichTextUitl.cloudUrl != 'undefined' && RichTextUitl.cloudUrl.indexOf('pan-yz.chaoxing.com') == -1) { //使用非公网云盘的不允许预览 return false; } if (!attachment.att_clouddisk) { return false } //设置了预览设置的,登录后允许预览,允许预览的才可以预览,不允许预览的不能预览 var icon = (attachment.att_clouddisk.suffix || '').toLowerCase(); if ((icon.indexOf('ppt') > -1 || icon.indexOf('doc') > -1 || icon.indexOf('xls') > -1 || icon.indexOf('pdf') > -1) && attachment.att_clouddisk && $iframe.attr('preview') != 'true' && !($iframe.attr('allowpreview') == 'no' || $(this).attr('preview') == 'no' || (($iframe.attr('allowpreview') == 'login' || $(this).attr('preview') == 'login') && !RichTextUitl.isLogin))) { return true; } return false; } // 文件类型:显示复制、下载、保存到云盘、转发、批量编辑, // 其中PPT、Word、Excel、PDF显示复制、预览、下载、保存到云盘、转发、批量编辑;下载是否显示根据文档是否设置了“登录后可下载”。 // 视频:显示复制、下载、保存到云盘、转发 // 录音、音频和笔记、话题等其他附件:显示复制、保存到云盘、转发 RichTextUitl.iframehover = function (selector) { if (RichTextUitl.unAllowOpenAttach) { //不允许打开附件 return; } var isNote = typeof WinInitConfig != 'undefined' && WinInitConfig.note; RichTextUitl.isCreator = isNote && WinInitConfig.user.puid == WinInitConfig.note.createrPuid; var iframe = $(selector).find('iframe.attach-module'); for (var i = 0; i < iframe.length; i++) { if (!iframe.eq(i).parent().hasClass('editor-iframe')) { var div = document.createElement('div'); div.className = 'editor-iframe'; iframe.eq(i).before(div); div.appendChild(iframe.eq(i)[0]) } iframe.parent().css('position', 'relative'); if ((iframe.eq(i).attr('download') && (iframe.eq(i).attr('download') == 'false' || !RichTextUitl.isLogin)) && !(typeof (WinInitConfig) != 'undefined' && WinInitConfig.isCreator == '1')) { //不是自己的笔记,不允许下载或未登录不允许下载 iframe.eq(i).parent().addClass('noSelect'); } else if (((iframe.eq(i).attr('download') == 'no') || (iframe.eq(i).attr('download') == 'login' && !RichTextUitl.isLogin)) && !(typeof (WinInitConfig) != 'undefined' && WinInitConfig.isCreator == '1')) { //协作笔记转化:不是自己的笔记,不允许下载或未登录不允许下载 iframe.eq(i).parent().addClass('noSelect'); } if (iframe.eq(i).attr('allowPreview') == 'no') { //禁止预览改为登录后允许预览 iframe.eq(i).attr('allowPreview', 'login') } //登录后允许预览的,下载改为登录后允许下载 if (iframe.eq(i).attr('allowPreview') == 'login' && ((!iframe.eq(i).attr('allowdownload') && !iframe.eq(i).attr('download')) || (iframe.eq(i).attr('allowdownload') == 'true' && iframe.eq(i).attr('download') == 'false'))) { iframe.eq(i).attr('allowdownload', false); iframe.eq(i).attr('download', true); } } var attachment = ''; // 判断是否登录了 $(selector).find('iframe,.iframehover').unbind(); $(selector).find('iframe,.iframehover').on('mouseover', function () { if ($(this).parent().find('.iframehover').length > 0) { $(this).parent().find('.iframehover').show() return; } var $iframe = $(this).parent().find('iframe'); var iframeDiv = $iframe.parent() attachment = RichTextUitl.b64DecodeUnicode($iframe.attr('name')) if (!attachment) { return; } // $('.iframehover.attachhover').remove(); var partcommenthtml = ''; if (window.location.host.indexOf('note') > -1 && window.location.host.indexOf('chaoxing') > -1) { partcommenthtml = '
'; } var downloadHtml = ''; switch (attachment.attachmentType) { case 18 : // 云盘,云盘附件的所有按钮:复制、预览、下载、保存到云盘、转发、批量编辑 // 判断是否显示下载按钮 // download 控制是否可以登录后下载, allowdownload 控制是否可以下载 downloadHtml = '
' + RichTextUitl.getI18nContent('download') + '
'; if ($iframe.attr('download') == 'true') { if (!RichTextUitl.isLogin) { // 设置了登录后才能下载,未登录时,不能下载 downloadHtml = ''; } } else if ($iframe.attr('allowdownload') == 'false') { // 既没有开启允许下载的选项,也没开启登录后允许下载的选项 downloadHtml = ''; } else if (($iframe.attr('download') == 'no') || ($iframe.attr('download') == 'login' && !RichTextUitl.isLogin)) { downloadHtml = '' } var downloadAttr = true; if (!downloadHtml) { downloadAttr = false; } var iframeFullscreenHtml = ''; if ($iframe.attr('advancedpreview') && $iframe.attr('advancedpreview') == 'true') { iframeFullscreenHtml = '
' + RichTextUitl.getI18nContent('fullscreen') + '
' } // 判断是否支持预览 var previewHtml = ''; if (RichTextUitl.showPreview(attachment, $iframe)) { previewHtml = '
' + RichTextUitl.getI18nContent('preview') + '
' } var html = '
' + iframeFullscreenHtml + '
' + RichTextUitl.getI18nContent('copy') + '
' + previewHtml + downloadHtml; if (RichTextUitl.isLogin) { // 登录了 if (previewHtml && downloadHtml) { // 有预览按钮 html += '
' + RichTextUitl.getI18nContent('more') + '
' + '
' + '
' + RichTextUitl.getI18nContent('saveToCloud') + '
' + '
' + RichTextUitl.getI18nContent('Share') + '
' + '
' + RichTextUitl.getI18nContent('bultEdit') + '
' + '
' } else { html += '
' + RichTextUitl.getI18nContent('saveToCloud') + '
' + '
' + RichTextUitl.getI18nContent('more') + '
' + '
'; if (!(window.obj && window.obj.mirrorDomain && (window.obj.mirrorDomain.isMirrorDeploy || window.obj.mirrorDomain.isMirrorDeploy == false && window.obj.mirrorDomain.NoteDomain.indexOf('chaoxing.com') == -1))) { html += '
' + RichTextUitl.getI18nContent('Share') + '
'; } html += '
' + RichTextUitl.getI18nContent('bultEdit') + '
' } } else { // 未登录,不允许批量编辑,批量编辑需要puid和token,分享页不登录的情况下,取不到puid和token // if (previewHtml && downloadHtml) { // // 有预览按钮和下载按钮 // html += '
' + RichTextUitl.getI18nContent('more') + '
' // + '
' // + '
' + RichTextUitl.getI18nContent('bultEdit') + '
' // + '
' // } else { // html += '
' + RichTextUitl.getI18nContent('bultEdit') + '
' // } } html += '
'; // if ($(this)[0].tagName === "A") { // // 文本链接形式的弹框和附件的不同 // $(this).addClass('textHover'); // var textWidth = Number($(this).css('width').slice(0,-2))+Number($(this).css('padding-left').slice(0,-2))+Number($(this).css('padding-right').slice(0,-2)); // var textHtml = '
更多
'; // $(this).parent().addClass('hover').append(textHtml); // var textMoreHeight = Number($('.textMoreHover').css('height').slice(0,-2)); // $(this).parent().children('.textMoreHover').css('left',textWidth+'px') // $(this).parent().children('.textMoreHover').children('.menuCtrl').css('top',textMoreHeight+'px') // } else { if (window.location.host.indexOf('course.ustc.edu.cn') > -1 && !(RichTextUitl.prefix && RichTextUitl.prefix.indexOf('chaoxing.com') > -1)) { html = '
' + RichTextUitl.getI18nContent('copy') + '
' + previewHtml + '
' } $(this).parent().addClass('hover').append(html); $(this).parent().find('.opmore,.moreList').on('mouseover', function () { $('.moreList').show(); }).on('mouseleave', function () { $('.moreList').hide(); }); $(this).parent().find('.moreList .opitem').on('click', function () { $('.moreList').hide(); }) // } break; case 26 : //音频 // 判断是否显示下载按钮 var downloadHtml = '
' + RichTextUitl.getI18nContent('download') + '
'; if ($iframe.attr('download') == 'true') { if (!RichTextUitl.isLogin) { // 设置了登录后才能下载,未登录时,不能下载 downloadHtml = ''; } } else if ($iframe.attr('allowdownload') == 'false') { // 既没有开启允许下载的选项,也没开启登录后允许下载的选项 downloadHtml = ''; } else if (($iframe.attr('download') == 'no') || ($iframe.attr('download') == 'login' && !RichTextUitl.isLogin)) { downloadHtml = ''; } var html = '
' + RichTextUitl.getI18nContent('copy') + '
' + downloadHtml + '
' + RichTextUitl.getI18nContent('saveToCloud') + '
' + RichTextUitl.getI18nContent('Share') + '
' if (window.location.host.indexOf('course.ustc.edu.cn') > -1 && !(RichTextUitl.prefix && RichTextUitl.prefix.indexOf('chaoxing.com') > -1)) { html = '
' + RichTextUitl.getI18nContent('copy') + '
' } $(this).parent().addClass('hover').append(html); break; case 1 : case 2 : case 8 : //音频,话题,笔记,通知 var html = '
' + RichTextUitl.getI18nContent('copy') + '
' + RichTextUitl.getI18nContent('saveToCloud') + '
' + RichTextUitl.getI18nContent('Share') + '
' if (window.location.host.indexOf('course.ustc.edu.cn') > -1 && !(RichTextUitl.prefix && RichTextUitl.prefix.indexOf('chaoxing.com') > -1)) { html = '
' + RichTextUitl.getI18nContent('copy') + '
' } $(this).parent().addClass('hover').append(html); break; case 29 : // 视频 // 判断是否显示下载按钮 var downloadHtml = '
' + RichTextUitl.getI18nContent('download') + '
'; if ($iframe.attr('download') == 'true') { if (!RichTextUitl.isLogin) { // 设置了登录后才能下载,未登录时,不能下载 downloadHtml = ''; } } else if ($iframe.attr('allowdownload') == 'false') { // 既没有开启允许下载的选项,也没开启登录后允许下载的选项 downloadHtml = ''; } else if (($iframe.attr('download') == 'no') || ($iframe.attr('download') == 'login' && !RichTextUitl.isLogin)) { downloadHtml = ''; } var html = '
' + '
' + RichTextUitl.getI18nContent('copy') + '
' + downloadHtml + '
' + RichTextUitl.getI18nContent('saveToCloud') + '
' + '
' + RichTextUitl.getI18nContent('Share') + '
'; // if (RichTextUitl.isLogin) { // html += '
保存到云盘
' // + '
' // + '
' // + '
转发
' // + '
批量编辑
' // + '
' // } else { // html += '
批量编辑
' // } html += '
' if (!downloadHtml) { // 不允许下载时,不显示所有操作按钮 html = ''; } if (window.location.host.indexOf('course.ustc.edu.cn') > -1 && !(RichTextUitl.prefix && RichTextUitl.prefix.indexOf('chaoxing.com') > -1)) { html = '
' + RichTextUitl.getI18nContent('copy') + '
' + downloadHtml + '
' } $(this).parent().addClass('hover').append(html); $(this).parent().find('.opmore,.moreList').on('mouseover', function () { $('.moreList').show(); }).on('mouseleave', function () { $('.moreList').hide(); }); $(this).parent().find('.moreList .opitem').on('click', function () { $('.moreList').hide(); }) break; case 25 : // 网页附件 var html = '
' + RichTextUitl.getI18nContent('copy') + '
' + RichTextUitl.getI18nContent('Share') + '
'; if ($iframe.attr('excel') == 'true') { // 在线表格 // 判断是否显示转发和下载按钮 var downloadHtml = '
' + RichTextUitl.getI18nContent('Share') + '
' + RichTextUitl.getI18nContent('download') + '
'; if ($iframe.attr('download') == 'true') { if (!RichTextUitl.isLogin) { // 设置了登录后才能下载,未登录时,不能下载 downloadHtml = ''; } } else if ($iframe.attr('allowdownload') == 'false') { // 既没有开启允许下载的选项,也没开启登录后允许下载的选项 downloadHtml = ''; } else if (($iframe.attr('download') == 'no') || ($iframe.attr('download') == 'login' && !RichTextUitl.isLogin)) { downloadHtml = '' } var html = '
' + RichTextUitl.getI18nContent('copy') + '
' + downloadHtml + '
'; } if (window.location.host.indexOf('course.ustc.edu.cn') > -1 && !(RichTextUitl.prefix && RichTextUitl.prefix.indexOf('chaoxing.com') > -1)) { html = '
' + RichTextUitl.getI18nContent('copy') + '
' } $(this).parent().addClass('hover').append(html); break; case 15 : // if (!(attachment.att_chat_course.type && attachment.att_chat_course.type == 4)) { // break; // } case 3 : case 4 : case 6 : case 7 : case 8 : case 10 : case 11 : case 17 : case 20 : case 24 : case 33 : case 38 : case 40 : case 41 : case 44 : case 47 : case 48 : // 云盘文件夹, 笔记文件夹、小组、话题文件夹、课程附件、位置、个人名片 // 收藏文件夹、专题、课程、课程章节、小组资料文件夹、网页附件、速课 var html = '
' + RichTextUitl.getI18nContent('copy') + '
' + RichTextUitl.getI18nContent('Share') + '
'; if (window.location.host.indexOf('course.ustc.edu.cn') > -1 && !(RichTextUitl.prefix && RichTextUitl.prefix.indexOf('chaoxing.com') > -1)) { html = '
' + RichTextUitl.getI18nContent('copy') + '
' } $(this).parent().addClass('hover').append(html); break; default : $(this).parent().addClass('hover').append('
' + RichTextUitl.getI18nContent('copy') + '
'); } /* *@Description: 附件悬浮工具栏 屏蔽除下载外的所有按钮的无障碍焦点 *@Author:LiChangChang *@Date: 2022-10-24 11:55:39 */ $('.iframehover .opitem').attr("tabindex", "-1") $('.iframehover .download').attr("tabindex", "0") $('.iframehover .download').attr("role", "button") //镜像只显示下载和复制 if (RichTextUitl.intranetMode) { $('.attachhover .save,.attachhover .opmore,.attachhover .forwardiframe,.attachhover .batch,.attachhover .preview,.attachhover .spliteline').hide(); } //镜像或cname,笔记域名是单位域名,分享域名是超星域名,不显示转发按钮 if (window.obj && window.obj.mirrorDomain && window.obj.mirrorDomain.shareWhDomainHttps.indexOf('chaoxing.com') > -1 && window.obj.mirrorDomain.NoteDomainHttps.indexOf('chaoxing.com') == -1) { $('.attachhover .forwardiframe,.attachhover .spliteline').hide(); } if (!RichTextUitl.isLogin || typeof ForwardUtils == 'undefined') { // 未登录时,不显示保存到云盘,转发 $('.attachhover .save').hide(); $('.attachhover .forwardiframe,.attachhover .opmore,.attachhover .spliteline').hide(); } else if (window.location.host.indexOf('note') > -1 && window.location.host.indexOf('chaoxing.com') > -1) { //部分评论暂时不上,先注释 // $(this).parent().find('.iframehover').append(partcommenthtml); } //设置了不允许下载附件 if (RichTextUitl.hideIframeTool && RichTextUitl.hideIframeTool.length > 0) { if (RichTextUitl.hideIframeTool.length == 1 && RichTextUitl.hideIframeTool[0] == '*' || attachment.attachmentType == 29 && RichTextUitl.hideIframeTool.indexOf('video') > -1 || attachment.attachmentType == 26 && RichTextUitl.hideIframeTool.indexOf('voice') > -1 || attachment.attachmentType == 18 && RichTextUitl.hideIframeTool.indexOf($iframe.attr('filetype')) > -1) { iframeDiv.find('.iframehover').remove(); } } if (!RichTextUitl.isCreator && attachment.attachmentType == 18 && !downloadHtml) { // 不能下载时 iframeDiv.find('.attachhover .copy,.attachhover .save,.attachhover .forwardiframe,.attachhover .batch,.attachhover .opmore,.attachhover .spliteline').hide(); } if (!iframeDiv.find('.iframehover .opitem').is(':visible')) { // 所有的操作按钮都被隐藏了,隐藏当前弹框 iframeDiv.find('.iframehover').remove(); } }); $(selector).find('.editor-iframe').on('mouseleave', function () { $(this).removeClass('hover').find('.iframehover').hide(); }); $(selector).find('a.iframe').on('click', '.textMoreHover', function (e) { e.stopPropagation(); e.preventDefault(); }) //文本附件点击 RichTextUitl.linkAttachClick(selector); $(selector).find('a.iframe').on('mouseover', function () { if ($(this).parent().find('.textMoreHover').length > 0) { $(this).parent().find('.textMoreHover').show() return; } attachment = RichTextUitl.b64DecodeUnicode($(this).attr('name')) var downloadHtml = '
' + RichTextUitl.getI18nContent('download') + '
'; if ($(this).attr('download') == 'true') { // 设置了登录后才能下载,未登录时,不能下载 if (!RichTextUitl.isLogin) { downloadHtml = ''; } } else if ($(this).attr('allowdownload') == 'false') { // 既没有开启允许下载的选项,也没开启登录后允许下载的选项 downloadHtml = ''; } else if ($(this).attr('download') == 'no' || $(this).attr('download') == 'login' && !RichTextUitl.isLogin) { downloadHtml = '' } var previewHtml = '' if (RichTextUitl.showPreview(attachment, $(this))) { previewHtml = '
' + RichTextUitl.getI18nContent('preview') + '
' } $(this).addClass('textHover'); var textWidth = $(this).outerWidth(); var textHtml = '
' + RichTextUitl.getI18nContent('more') + '
'; $(this).addClass('hover').append(textHtml); if (downloadHtml == '' || (!RichTextUitl.isLogin || typeof ForwardUtils == 'undefined')) { // 未登录时,不显示保存到云盘,转发 $('.textMoreHover .save,.textMoreHover .forwardiframe,.textMoreHover .batch').hide(); } var textMoreHeight = Number($('.textMoreHover').css('height').slice(0, -2)); // 文本附件悬浮框的位置 var rects = this.getClientRects(); var aLeft = rects.length > 1 ? -(rects[0].left - selector.getClientRects()[0].left) + rects[rects.length - 1].width - 4 : textWidth; var aTop = rects.length > 1 ? (rects.length - 1) * ($(this).height() / rects.length) + 4 + 'px' : '-1px'; $(this).children('.textMoreHover').css({'left': aLeft + 'px', 'top': aTop}) $(this).find('.menuCtrl').css('top', textMoreHeight + 'px'); if (!downloadHtml) { // 不能下载时 $('.textMoreHover.operatehover').hide(); } //设置了不允许下载附件 if (RichTextUitl.hideIframeTool && RichTextUitl.hideIframeTool.length > 0) { if (RichTextUitl.hideIframeTool.length == 1 && RichTextUitl.hideIframeTool[0] == '*' || attachment.attachmentType == 29 && RichTextUitl.hideIframeTool.indexOf('video') > -1 || attachment.attachmentType == 26 && RichTextUitl.hideIframeTool.indexOf('voice') > -1 || attachment.attachmentType == 18 && RichTextUitl.hideIframeTool.indexOf($(this).attr('filetype')) > -1) { $(this).parent().find('.textMoreHover').remove(); $(this).attr('download', 'false').attr('allowdownload', 'false') } } if ($(this).parent().find('.textMoreHover .menuCtrl>div:not([style])').length == 0) { // 所有的操作按钮都被隐藏了,隐藏当前弹框 $(this).parent().find('.textMoreHover').remove(); } }); $(selector).find('a.iframe').on('mouseleave', function () { $(this).removeClass('hover').removeClass('textHover').find('.textMoreHover').hide(); }); //全屏 $(selector).find('.editor-iframe') .off("click", ".operatehover .iframefullscreen") .on('click', '.operatehover .iframefullscreen', function () { var iframeSrc = $(this).parents('.editor-iframe').find('iframe').attr('src'); window.open(iframeSrc) }) // 复制 $(selector).find('.editor-iframe,a.iframe') .off("click", ".operatehover .copy") .on('click', '.operatehover .copy', function () { window.dt = new clipboard.DT(); var iframediv; if ($(this).parents('.editor-iframe').length > 0) { iframediv = $(this).parents('.editor-iframe') } else if (this.tagName == 'A') { iframediv = $(this); } if (!iframediv) { return; } iframediv.find('.operatehover').remove(); dt.setData("text/html", iframediv[0].outerHTML); clipboard.write(dt).then(function () { if ($('.toolTipBox').length > 0) { $('.toolTipBox').remove() } $(document.body).append('') $('.toolTipBox .tipstext').text(RichTextUitl.getI18nContent('copySuccess')); $('.toolTipBox').show(); setTimeout(function () { $('.toolTipBox').fadeOut(); }, 1500) }, function (err) { console.log(err); }); }) /* *@Description: 点击下载按钮适配无障碍 *@Author:LiChangChang *@Date: 2022-10-26 13:49:33 */ document.onkeyup = function (event) { var e = event || window.event || arguments.callee.caller.arguments[0]; if (e && e.keyCode == 32) { if ($(':focus').attr('class') == "opitem download") { $(':focus').click() } } }; // 下载 $(selector).find('.editor-iframe,a.iframe') .off("click", ".operatehover .download") .on('click', '.operatehover .download', function () { if ($(this).parents('a.iframe').length > 0) { attachment = RichTextUitl.b64DecodeUnicode($(this).parents('a.iframe').attr('name')) } else { attachment = RichTextUitl.b64DecodeUnicode($(this).parents('.editor-iframe').find('iframe').attr('name')) } if (attachment.attachmentType == 25 && attachment.att_web.excel) { // 在线表格 $('iframe[cid="' + attachment.cid + '"]')[0].contentWindow.postMessage({'msgType': 'download'}, '*') return; } if (RichTextUitl.intranetMode) { //镜像模式,直接下载 var downloadUrl, playUrl, objectId; switch (attachment.attachmentType) { case 18 : // 云盘 downloadUrl = attachment.att_clouddisk.downPath || attachment.att_clouddisk.downloadUrl; playUrl = attachment.att_clouddisk.playUrl; objectId = attachment.att_clouddisk.fileId; break; case 26 : //音频 downloadUrl = attachment.att_voice.downloadUrl; playUrl = attachment.att_voice.playUrl; objectId = attachment.att_voice.objectId; break; case 29 : // 视频 downloadUrl = attachment.att_video.downloadUrl; playUrl = attachment.att_video.playUrl; objectId = attachment.att_video.objectId2; break; } if (downloadUrl) { //如果是云盘地址,接口实时获取下载地址 if (downloadUrl.indexOf('d0.ananas.chaoxing.com') > -1 || downloadUrl.indexOf('d0.cldisk.com') > -1) { YunFileUtil.downloadYunFile(attachment); } else { if (self != top && location.protocol.indexOf('https') != -1) { // 嵌入在iframe里面// https服务下,下载地址换成https的 downloadUrl = downloadUrl.replace("http://", 'https://'); } else { downloadUrl = downloadUrl.replace("http://", 'https://'); } window.location.href = downloadUrl; } } else if (!objectId && playUrl) { //视频没有下载地址的,用播放地址下载 var a = document.createElement('a'); $('body').append(''); var el = document.getElementById('open_attachment'); el.click();//触发打开事件 $(el).remove(); } else { YunFileUtil.downloadYunFile(attachment); } } else { YunFileUtil.downloadYunFile(attachment); } }) // 预览 $(selector).find('.editor-iframe,a.iframe') .off("click", ".operatehover .preview") .on('click', '.operatehover .preview', function () { // window.open("https://pan-yz.chaoxing.com/screen/fileinfo_"+attachment.att_clouddisk.resid) // $(this).parent().siblings('iframe').eq(0).attr("src" // , "https://previewyd.chaoxing.com/res/view/view.html?opentype=full&objectid="+attachment.att_clouddisk.fileId) if ($(this).parents('a.iframe').length > 0) { attachment = RichTextUitl.b64DecodeUnicode($(this).parents('a.iframe').attr('name')) } else { attachment = RichTextUitl.b64DecodeUnicode($(this).parents('.editor-iframe').find('iframe').attr('name')) } var fileName = attachment.att_clouddisk.name; if (fileName.indexOf('.' + attachment.att_clouddisk.suffix) > -1) { fileName = fileName.substring(0, fileName.indexOf('.' + attachment.att_clouddisk.suffix)); } var puid = attachment.att_clouddisk.puid; if (!puid) { puid = attachment.att_clouddisk.infoJsonStr ? (attachment.att_clouddisk.infoJsonStr.puid || '') : ''; } if ($(this).parents('.dynacALink').length == 0 && $(this).parents('.editor-iframe').length > 0) { //获取iframe的域名,作为获取预览地址的域名,解决部分单位编辑页超星域名,详情页单位域名,未配置单位域名,点预览打不开 var iframeSrc = $(this).parents('.operatehover').siblings('iframe').attr('src'); var iframeDomain = ''; if (iframeSrc.indexOf('//') > -1) { iframeSrc = iframeSrc.substring(iframeSrc.indexOf('//') + 2, iframeSrc.length) iframeDomain = iframeSrc.substring(0, iframeSrc.indexOf('/')) } } //实现ppt、word点击掉“调用方”传过来的方法 if (RichTextUitl.openPreview && typeof RichTextUitl.openPreview === "object" && RichTextUitl.openPreview.type.indexOf(attachment.att_clouddisk.suffix) > -1) { if (RichTextUitl.openPreview.name && typeof window[RichTextUitl.openPreview.name] == 'function' && attachment.cid) { window[RichTextUitl.openPreview.name](attachment.cid, attachment.att_clouddisk) return; } } //调接口获取enc RichTextUitl.getPreviewUrl(attachment.att_clouddisk.fileId, encodeURIComponent(fileName), $(this).attr('download'), null, iframeDomain, attachment.att_clouddisk.resid); /*window.open(window.location.protocol + "//previewyd.chaoxing.com/res/view/view.html?opentype=full&objectid=" +attachment.att_clouddisk.fileId + '&fileName='+encodeURIComponent(fileName) + '&download=' + $(this).attr('download');*/ }) // 保存到云盘 $(selector).find('.editor-iframe,a.iframe') .off("click", ".operatehover .save") .on('click', '.operatehover .save', function () { if ($(this).parents('a.iframe').length > 0) { attachment = RichTextUitl.b64DecodeUnicode($(this).parents('a.iframe').attr('name')) } else { attachment = RichTextUitl.b64DecodeUnicode($(this).parents('.editor-iframe').find('iframe').attr('name')) } var obj = '' switch (attachment.attachmentType) { case 18 : // 云盘 obj = { fileId: attachment.att_clouddisk.fileId, name: attachment.att_clouddisk.name } break; case 26 : //音频 obj = { fileId: attachment.att_voice.objectId2, name: attachment.att_voice.fileTitle } break; case 29 : // 视频 obj = { fileId: attachment.att_video.objectId2, name: attachment.att_video.fileTitle } break; case 1 : // 话题 case 2 : // 笔记 case 8 : // 通知 obj = attachment; break; } var array = new Array(); array.push(obj) CLOUD_POP.openCloudPop(array); }) // 批量编辑 $(selector).find('.editor-iframe,a.iframe') .off("click", ".operatehover .batch") .on('click', '.operatehover .batch', function () { CLOUD_POP.openBatchPop(); }) // 转发 $(selector).find('.editor-iframe,a.iframe') .off("click", ".operatehover .forwardiframe") .on('click', '.operatehover .forwardiframe', function () { if ($(this).parents('a.iframe').length > 0) { attachment = RichTextUitl.b64DecodeUnicode($(this).parents('a.iframe').attr('name')) } else { attachment = RichTextUitl.b64DecodeUnicode($(this).parents('.editor-iframe').find('iframe').attr('name')) } ForwardUtils.forward(attachment); }) } // 文本附件的点击事件 RichTextUitl.linkAttachClick = function (selector) { $(selector).find('a.iframe').on('click', function (e) { e.stopPropagation(); e.preventDefault(); attachment = RichTextUitl.b64DecodeUnicode($(this).attr('name')) if ($(this).attr('href')) { $(this).attr('_href', $(this).attr('href')) $(this).attr('href', '') } if (!RichTextUitl.isSupportPreview($(this).attr('name'))) { //不可预览的附件 if ((($(this).attr('download') == 'true' && $(this).attr('allowdownload') == 'false') || ($(this).attr('download') == 'login') && !RichTextUitl.isLogin)) { //登录后下载 RichTextUitl.showTips('作者设置该附件登录后允许下载', 0); } else if (($(this).attr('download') == 'false' && $(this).attr('allowdownload') == 'false') || $(this).attr('download') == 'no') { //禁止下载 RichTextUitl.showTips('作者设置该附件禁止下载', 0); return; } else { //允许下载 if (RichTextUitl.intranetMode) { window.open($(this).attr('_href')); } else { var url = RichTextUitl.noteDomain + '/res/plugin/mnote/attachInterface.html?fileId=' + attachment.att_clouddisk.fileId + '&fileName=' + encodeURIComponent(attachment.att_clouddisk.name) + '&allowDownload=false&fileSize=' + attachment.att_clouddisk.fileSize + '&originUrl=' + encodeURIComponent(window.location.href); if (RichTextUitl.isXXT && window.self == window.top) { //学习通里调用协议 if (window.location.host.indexOf('mobilelearn') > -1 || window.location.host.indexOf('sharewh') > -1 || attachment.attachmentType != 29) { try { jsBridge.postNotification('CLIENT_OPEN_ATTACHMENT', attachment); } catch (e) { } } } else if (RichTextUitl.isXXT && window.self != window.top) { //客户端里打开,给 if (window.location.host.indexOf('mobilelearn') > -1 || window.location.host.indexOf('sharewh') > -1 || attachment.attachmentType != 29) { try { if (top.jsBridge) { top.jsBridge.postNotification('CLIENT_OPEN_ATTACHMENT', attachment); } else { window.top.location.href = url } } catch (e) { window.top.location.href = url } } } else if (RichTextUitl.isWeiXin || RichTextUitl.isQQ) { //微信或QQ,打开中间页 window.location.href = url } else { YunFileUtil.downloadYunFile(attachment); } } } } else if ($(this).attr('download') == 'false' && $(this).attr('allowdownload') == 'false' || $(this).attr('download') == 'no' || !RichTextUitl.isLogin && (($(this).attr('download') == 'true' && $(this).attr('allowdownload') == 'false') || $(this).attr('download') == 'login')) { //上传的文档,设置成文本模式时,如果该附件设置了不允许下载,点击的时候进预览页 if (($(this).attr('download') == 'true' && $(this).attr('allowdownload') == 'false') || $(this).attr('download') == 'login') { //登录后下载 if (!RichTextUitl.isLogin && ($(this).attr('allowpreview') == 'login' || $(this).attr('preview') == 'login')) { //登录后下载登录后预览 RichTextUitl.showTips('作者设置该附件登录后允许预览、下载', 0); return; } else if ($(this).attr('allowpreview') == 'no' || $(this).attr('preview') == 'no') { //登录后下载,禁止预览 RichTextUitl.showTips('作者设置该附件登录后允许下载', 0); return; } } else if (!RichTextUitl.isLogin && ($(this).attr('allowpreview') == 'login' || $(this).attr('preview') == 'login')) { //禁止下载,登录后预览 RichTextUitl.showTips('作者设置该附件登录后允许预览', 0); return; } else if ($(this).attr('allowpreview') == 'no' || $(this).attr('preview') == 'no') { //禁止下载禁止预览 RichTextUitl.showTips('作者设置该附件禁止下载、预览', 0); return; } var attachment = RichTextUitl.b64DecodeUnicode($(this).attr('name')) if (RichTextUitl.intranetMode && attachment.att_clouddisk && attachment.att_clouddisk.previewUrl) { e.stopPropagation(); e.preventDefault(); $(this).attr('_href', attachment.att_clouddisk.previewUrl); window.open($(this).attr('_href')) } else { var iframeSrc = window.location.protocol + '//previewyd.chaoxing.com/res/view/view.html?objectid=' + attachment.att_clouddisk.fileId + '&fileName=' + encodeURIComponent(attachment.att_clouddisk.name.split('.')[0]); if (window.obj && window.obj.mirrorDomain && window.obj.mirrorDomain.previewDomainHttps) { iframeSrc = window.obj.mirrorDomain.previewDomainHttps + '/res/view/view.html?objectid=' + attachment.att_clouddisk.fileId + '&fileName=' + encodeURIComponent(attachment.att_clouddisk.name.split('.')[0]); } if (!RichTextUitl.isGetVideoDataFromCenter) { resid = attachment.att_clouddisk.resid iframeSrc += '&resid=' + resid; } if (RichTextUitl.useWpsPreview) { iframeSrc += '&type=wps'; } window.open(iframeSrc) } } else { //能预览,能下载 if (RichTextUitl.intranetMode) { window.open($(this).attr('_href')); } else if (RichTextUitl.isXXT && window.self == window.top) { //学习通里调用协议 if (window.location.host.indexOf('mobilelearn') > -1 || window.location.host.indexOf('sharewh') > -1 || attachment.attachmentType != 29) { try { jsBridge.postNotification('CLIENT_OPEN_ATTACHMENT', attachment); } catch (e) { } } } else if (RichTextUitl.isWeiXin || RichTextUitl.isQQ) { //微信或QQ,打开中间页 url = RichTextUitl.noteDomain + '/res/plugin/mnote/attachInterface.html?fileId=' + attachment.att_clouddisk.fileId + '&fileName=' + encodeURIComponent(attachment.att_clouddisk.name) + '&allowPreview=true&allowDownload=true&fileSize=' + attachment.att_clouddisk.fileSize + '&originUrl=' + encodeURIComponent(window.location.href); window.location.href = RichTextUitl.convertUrl(url) } else { YunFileUtil.downloadYunFile(attachment); } return; } }) } //鼠标移上图片时,图片上方显示复制、下载的菜单 RichTextUitl.imgHover = function (selector) { var img = $(selector).find('img'); $('body').on('contextmenu', '.richtext img,.viewer-canvas img', function () { //判断如果不允许下载 if ($(this).hasClass('noSelect') || RichTextUitl.disableImageContextMenu) { //不是自己的笔记,不允许下载或未登录不允许下载 return false; } }); img.unbind(); img.parent().unbind(); $(selector).find('.imghover').unbind(); img.parent().css('position', 'relative'); var saveHtml = ''; if (RichTextUitl.isLogin) { saveHtml = '
' + RichTextUitl.getI18nContent('saveToCloud') + '
'; } $('body').click(function (e) { if (e.target.nodeName != 'IMG' && !$(e.target).hasClass('viewer-canvas') && !$(e.target).hasClass('viewBtnWrap') && $(e.target).parents('.viewBtnWrap').length == 0) { $('.editor-image').removeClass('active').removeClass('hover') $('.imghover.attachhover').remove(); } }); img.on('mouseover', function () { $(this).parent().addClass('hover'); }) //PC端才会执行 img.on('click', function (e) { if ($(this).attr('data-link')) { //如果图片上有链接,直接打开 e.stopPropagation(); e.preventDefault(); var link = $(this).attr('data-link'); var openType = $(this).attr('opentype'); //有openType属性的是在当前窗口打开链接 if (link.indexOf('http') == -1 && link.indexOf('ftp') == -1) { link = 'https://' + link; } if (openType) { window.location.href = link; } else { window.open(link); } return; } if (this.id && this.id == "signImg") { return; } if (typeof isShare != "undefined" && isShare) {//分享页不出现图片工具栏 return; } if (window.location.host.indexOf('note') > -1 && $('.partCommentWrap').length > 0) { //笔记部分评论,点击图片滚动到评论位置 if ($('.partCommentWrap').length == 0) return; $('.partCommentItem').removeClass('active'); partCommentPlugin.hideInputComment(); $('.selectedComment').removeClass('selectedComment'); if ($(this).hasClass('hasPartComment')) { $(this).parent().addClass('selectedComment'); } var objectId = $(this).attr('objectId'); var elementId = $(this).parent().attr('element-id'); var partCm; if (elementId) { partCm = $('.partCommentItem[objectId=' + objectId + '][elementId=' + elementId + ']'); } else { partCm = $('.partCommentItem[objectId=' + objectId + ']'); } if (partCm.length > 0) { //显示右侧评论列表弹窗 $('.partCommentWrap .partCommentDiv').css('left', '0'); $('.partCommentWrap .navDiv').fadeOut(); //滚动到当前位置 var targetToTop = $(this).offset().top - document.scrollingElement.scrollTop - 100; //图片距离页面顶部的距离 targetToTop = targetToTop > 0 ? targetToTop : 0; $('.partCommentMain')[0].scrollTo({ top: partCm[0].offsetTop - targetToTop, behavior: "smooth" }); partCm.eq(0).addClass('active'); } } if (!$(this).parent().hasClass('active')) { if ($(this).parents('a').length == 0) { //秀米a链接里是图片时点击事件冒泡到上层,话题要获取a链接的点击事件,这里阻止冒泡后,就不会触发上层的点击事件 e.stopPropagation(); } $(this).parent().attr('focus', 'true'); } else { $(this).parent().removeAttr('focus'); return; } $('.editor-image').removeClass('active').removeClass('hover') $('.imghover.attachhover').remove(); // var linkhtml = ''; // if($(this).attr('data-link')){ // linkhtml = ''; // } //图片全屏--笔记项目 var fullimghtml = "", partcommenthtml = ''; if (window.location.host.indexOf('note') > -1) { if ($(this).parent().hasClass('full')) { fullimghtml = '
' + RichTextUitl.getI18nContent('exitFullscreen') + '
'; } else { fullimghtml = '
' + RichTextUitl.getI18nContent('fullscreen') + '
'; } //部分评论 partcommenthtml = '
'; } //20210928 设置是否允许下载,不允许下载的不允许显示复制、下载和保存到云盘,禁用右键,禁用ctrl+c var downloadhtml = ''; if (($(this).attr('download') && ($(this).attr('download') == 'false' || !RichTextUitl.isLogin)) && !(typeof (WinInitConfig) != 'undefined' && WinInitConfig.isCreator == '1')) { //不是自己的笔记,不允许下载或未登录不允许下载 } else { //允许下载 downloadhtml = '
' + RichTextUitl.getI18nContent('copy') + '
' + '
' + RichTextUitl.getI18nContent('download') + '
' + saveHtml + partcommenthtml; } $(this).parent().addClass('hover').addClass('active').append('
' + fullimghtml + downloadhtml + '
'); //镜像只显示下载和复制 if (RichTextUitl.intranetMode) { $('.attachhover .save,.attachhover .opmore,.attachhover .batch,.attachhover .fullimg,.attachhover .spliteline').hide(); $('.imghover').hide(); } //20210318 if ($(this).parents('.editor-image').css('float') === 'left' || $(this).parents('.editor-image').css('text-align') === 'left') {//居左 $('.imghover').css('right', $(this).parents('.editor-image').width() - $(this).width()) } else if ($(this).parents('.editor-image').css('float') === 'right' || $(this).parents('.editor-image').css('text-align') === 'right') {//居右 $('.imghover').css('right', 0) } else {//居中 if ($(this).width() > $('.imghover').width()) { $('.imghover').css('right', ($(this).parents('.editor-image').width() - $(this).width()) / 2 - 2) } else {//图片宽度小于工具栏宽度 $('.imghover').css({ 'top': '-40px', 'right': 'unset', 'left': $(this).parents('.editor-image').width() / 2 - $('.imghover').width() / 2 }); } } if ($(this).parents('.editor-image').length > 0) { var offsetleft = $(this).parents('.editor-image').offset().left - $('.richtext').offset().left; if (offsetleft + $(this).parents('.editor-image').width() < $('.imghover').width()) { $('.imghover').css({'right': 'unset', 'left': '0'}) } else if (offsetleft + $('.imghover').width() > $('.richtext').width()) { $('.imghover').css({'left': 'unset', 'right': '0'}) } } }); // img.on('mouseover',function(){ // let html = '
' + // '
复制
' + // '
下载
' + // '
保存到云盘
' + // '
批量编辑
' + // '
'; // $(this).parent().addClass('hover').append(html); // // $(this).parent().find('.opmore,.moreList').on('mouseover',function(){ // $('.moreList').show(); // }).on('mouseleave',function(){ // $('.moreList').hide(); // }); // $(this).parent().find('.moreList .opitem').on('click',function(){ // $('.moreList').hide(); // }) // }); img.parent().on('mouseleave', function () { if (!$(this).hasClass('active')) { $(this).removeClass('hover'); } }); //图片全屏 img.parent().on('click', '.imghover .fullimg', function () { if ($(this).parents('.editor-image').eq(0).hasClass('full')) { //退出全屏 $(this).parents('.editor-image').eq(0).removeClass('full').css('left', '0'); } else if ($(this).parents('.editor-image').css('float') === 'right' || $(this).parents('.editor-image').css('text-align') === 'right') { $(this).parents('.editor-image').eq(0).addClass('full').css('left', '0px'); } else { // var left = $(this).parents('.editor-image').eq(0).offset().left - $('.richtext').offset().left; $(this).parents('.editor-image').eq(0).addClass('full').css('left', '0px'); } $(this).parents('.editor-image').eq(0).removeClass('hover').removeClass('active'); }) // 打开链接 img.parent().on('click', '.imghover .imglink', function () { var link = $(this).parent().siblings('img').attr('data-link'); var openType = $(this).parent().siblings('img').attr('opentype'); //有openType属性的是在当前窗口打开链接 if (link.indexOf('http') == -1 && link.indexOf('ftp') == -1) { link = 'https://' + link; } if (openType) { window.location.href = link; } else { window.open(link); } }); // 批量编辑 img.parent().on('click', '.imghover .batch', function () { CLOUD_POP.openBatchPop(); }) img.parent().on('click', '.imghover .copy', function () { window.dt = new clipboard.DT(); var img = $(this).parent().siblings('img')[0].cloneNode(); var div = document.createElement('div'); div.className = 'editor-image'; div.contentEditable = false; div.appendChild(img); dt.setData("text/html", div.outerHTML); clipboard.write(dt).then(function () { RichTextUitl.showTips(RichTextUitl.getI18nContent('copySuccess')); }, function (err) { console.log(err); }); }); // 图片点击下载 $(selector).on('click', '.imghover .download', function () { var imgSrc = $(this).parent().prev().attr('src'); if (RichTextUitl.intranetMode) { //镜像模式,直接下载 if (self != top && location.protocol.indexOf('https') != -1) { // 嵌入在iframe里面// https服务下,下载地址换成https的 imgSrc = imgSrc.replace("http://", 'https://'); } else { imgSrc = imgSrc.replace("http://", 'https://'); } window.location.href = imgSrc; } else { // 客户端生成的图片标签上的objectid有问题,不要直接用图片标签上的,根据图片地址截取 var objectid = RichTextUitl.getObjectIdByImgSrc(imgSrc); if (objectid) { //需要加图片水印的 if (RichTextUitl.watermarkOptions && RichTextUitl.watermarkOptions.watermarkImageUrl) { objectid = RichTextUitl.generateWatermark(objectid, RichTextUitl.watermarkOptions) || objectid; } YunFileUtil.downloadYunFile('', objectid); } } }); // 图片保存到云盘 $(selector).on('click', '.imghover .save', function () { var obj = {}; var imgSrc = $(this).parent().prev().attr('src'); var objectid = RichTextUitl.getObjectIdByImgSrc(imgSrc); if (!objectid) { return; } var src = $(this).parents('.editor-image').find('img').attr('src'); var name = ''; if (src.indexOf('?')) { name = src.substring(src.lastIndexOf('/') + 1, src.indexOf('?')) } else { name = src.substring(src.lastIndexOf('/') + 1); } obj = { fileId: objectid, name: name } var array = new Array(); array.push(obj) CLOUD_POP.openCloudPop(array); }) } //调用接口生成带水印图片 RichTextUitl.generateWatermark = function (objectid, watermarkOptions) { var newObjectId = ''; var data = { objectid: objectid, imageWatermarkConfig: watermarkOptions } $.ajax({ url: window.obj.mirrorDomain.NoteDomainHttps + '/pc/resource/imageWatermark', type: 'post', async: false, contentType: 'application/json', data: JSON.stringify(data), success: function (data) { if (data.result == 1) { newObjectId = data.data } } }) return newObjectId } /** * base64编码和btoa编码 * @param str * @returns {string} */ RichTextUitl.b64EncodeUnicode = function (str) { str = str.replace(RichTextUitl.xssReg, function () { return arguments[0] + ' '; }) return btoa(encodeURIComponent(str)) } /** * base64解码码和atob * @param str * @returns {string} */ RichTextUitl.b64DecodeUnicode = function (str) { if (!str) { return str; } try { str = decodeURIComponent(atob(str)); str = str.replace(RichTextUitl.xssReg, function () { return arguments[0] + ' '; }) } catch (e) { } try { return JSON.parse(str); } catch (e) { } return ''; } /* * @param selector:包含图片标签的dom节点 * */ RichTextUitl.detailPageEvent = function (selector) { // 记录是否登录了 RichTextUitl.isLogin = RichTextUitl.getCookie('UID') != ''; //点击录音打点时通知对应的音频iframe跳转到对应的时间点 $(".record-list-time").unbind("click"); $('body').on('click', '.record-list-time', function () { var time = $(this).text(); if (!time) { return; } var timeArray = time.split(':'); var seconds = 0; if (timeArray.length > 2) { // 时:分:秒 seconds = parseInt(timeArray[0]) * 3600 + parseInt(timeArray[1]) * 60 + parseInt(timeArray[2]); } else { // 分:秒 seconds = parseInt(timeArray[0]) * 60 + parseInt(timeArray[1]); } var $recordbox = $(this).parents('.record-box')[0] if ($recordbox) { var iframe = $recordbox.getElementsByTagName('iframe')[0]; if (iframe) { var attachment; try { attachment = RichTextUitl.b64DecodeUnicode(iframe.getAttribute('name')); } catch (e) { console.log(e) } if (attachment.attachmentType == 54) { var openUrl = attachment.att_course_video.transferLink + '&host=' + window.location.hostname + '&mid=' + attachment.att_course_video.mid + '&time=' + seconds + '&toflag=1'; if (typeof WinInitConfig != 'undefined' && WinInitConfig.note && WinInitConfig.note.cid) { openUrl += '&cid=' + WinInitConfig.note.cid; } window.open(openUrl); } else { iframe.contentWindow.postMessage({ 'cid': iframe.getAttribute('cid'), 'type': 'play_time_jump', 'seconds': seconds }, '*'); } } } /*var mark_id = $(this).parents('.record-box').attr('id') || ""; var iframe = $('body')[0].getElementsByTagName('iframe')[0]; var array = mark_id.split('_'); if(iframe && array && array.length == 2) { iframe.contentWindow.postMessage({'cid': array[1], 'type':'play_time_jump', 'seconds': seconds}, 'https://noteyd.chaoxing.com'); }*/ }); if (RichTextUitl.setIframeHover) { // 设置鼠标悬浮在图片和附件上的事件 RichTextUitl.iframehover(selector); RichTextUitl.imgHover(selector); } else { //文本链接的点击事件 RichTextUitl.linkAttachClick(selector); $('body').on('contextmenu', '.richtext img,.viewer-canvas img', function () { //判断如果不允许下载 if ($(this).hasClass('noSelect') || RichTextUitl.disableImageContextMenu) { //不是自己的笔记,不允许下载或未登录不允许下载 return false; } }); } //代码工具栏 RichTextUitl.codeHover(selector); /** * 获取云盘token */ // if (!(typeof isShare != "undefined" && isShare)) { // RichTextUitl.getUploadConfig(true) // } // 云盘下载地址现在要动态获取,对于加的文本链接附件,点击时调接口取地址然后下载 $(selector).find('a:not(.iframe):not([type="anchor"]).dynacALink,a:not(.dynacALink):not([type="anchor"])').unbind("click").click(function (e) { if (($(this).attr('download') == 'true' && !RichTextUitl.isLogin) || ($(this).attr('allowdownload') == 'false' && $(this).attr('download') == 'false')) { // 设置了登录后才能下载,未登录时,不能下载,或者未开启下载,也不能下载 return false; } var href = $(this).attr('href') || $(this).attr('_href'); if (!href || href.indexOf('javascript') > -1) { return false; } e.preventDefault(); // e.stopPropagation(); if ($(this).hasClass('iframe') && $(this).attr('href')) { $(this).attr('_href', $(this).attr('href')) $(this).attr('href', '') } if (href.indexOf('d0.ananas.chaoxing.com/download') > -1 || href.indexOf('cs.ananas.chaoxing.com/download') > -1 || href.indexOf('d0.cldisk.com/download') > -1 || href.indexOf('cs.cldisk.com/download') > -1) { var attachment = RichTextUitl.b64DecodeUnicode($(this).attr('name')); if (typeof YunFileUtil == 'undefined') { window.open(href); return false; } if (attachment && attachment.att_clouddisk && attachment.att_clouddisk.fileId) { // 云盘附件转成的a标签 YunFileUtil.downloadYunFile(attachment); } else { // 直接输入的下载地址 var objectId = href.substring(href.lastIndexOf('/') + 1); if (objectId.indexOf('?') > -1) { objectId = objectId.substring(0, objectId.indexOf('?')) } YunFileUtil.downloadYunFile('', objectId); } } else { //打开微信小程序,秀米中配置的链接是https://wxminiUrl_/hotBook/pages/xxx if (ua.match(/MicroMessenger/i) == "micromessenger" && href.replace(/https:\/\//g, '').indexOf('wxminiUrl') > -1) { var wxminiurl = href.split('_')[1]; RichTextUitl.openWxminiUrl(wxminiurl); return false; } window.open(href); } // return false; }); //2022-7-26 监听复制操作: 富文本粘贴到非富文本框,去除多余空行,复制时去除display:none的元素 var richtextList = document.getElementsByClassName('richtext') for (var i = 0; i < richtextList.length; i++) { richtextList[i].addEventListener('copy', function (e) { var clipboardData = (e.clipboardData || window.clipboardData); if (!clipboardData) return; var range = window.getSelection().getRangeAt(0); //获取选中的非富文本内容 var selectedText = window.getSelection().toString(); // if (selectedText.trim() == "" || selectedText.indexOf('\n') == -1) return; //部分空格复制到办公同事的软件里时,会变成问号或方框,制表符会变成|,要替换一下 if (selectedText.indexOf('\t\n') == 0) { selectedText = selectedText.replace('\t\n', ''); } var copyText = selectedText.replace(/\r/g, '').replace(/\t/g, '').replace(/\n\n/g, '\n').replace(/\u200B/gi, '').replace(/ /g, ' ').replace(/ /g, ' ').replace(/ /g, ''); //获取选中的富文本内容 var tempDiv = document.createElement('div'); tempDiv.appendChild(range.cloneContents()); //标题折叠的隐藏元素显示 var node = tempDiv.firstChild; while (node && node.nodeType == 1) { if (node.style.display == 'none') { node.style.display = '' } node = node.nextElementSibling; } //复制时过滤掉折叠标题的辅助元素三角 $(tempDiv).find('.foldtitle-tri-wrap').remove(); //复制去除代码工具栏和格式化代码 $(tempDiv).find('.code-tool-wrap').remove(); $(tempDiv).find('code').each(function (index, item) { $(item).html($(item).text().replace(/\n/g, '
')) }) //课程活动不允许粘贴 $(tempDiv).find('iframe').each(function (index, item) { var iframename = RichTextUitl.b64DecodeUnicode(item.getAttribute('name')); if (iframename.attachmentType == 15 && !(iframename.att_chat_course.type && iframename.att_chat_course.type == 4)) { $(item).parent().remove() } }) //去掉公式中的内容 $(tempDiv).find('span[data-latexstr]').each(function (index, item) { item.innerHTML = ''; }) //详情页禁止下载的附件不允许复制 if (!RichTextUitl.isCreator) { tempDiv = removeForbidDownloadAttach(tempDiv); } var selectHtml = tempDiv.innerHTML; clipboardData.setData('text/plain', copyText); clipboardData.setData('text/html', selectHtml); e.preventDefault(); }); } } /** * 根据图片地址获取 objectId * @param imgSrc * @returns {string|*} */ RichTextUitl.getObjectIdByImgSrc = function (imgSrc) { if (!imgSrc) { return ''; } var objectId = ''; if (imgSrc.indexOf(".") > -1) { objectId = imgSrc.substring(imgSrc.lastIndexOf("/") + 1, imgSrc.lastIndexOf(".")); if (imgSrc.indexOf('star4') > -1) { objectId = imgSrc.substring(imgSrc.indexOf("star4") + 6, imgSrc.lastIndexOf("/")) } } else { // 部分图片可能没有后缀 objectId = imgSrc.substring(imgSrc.lastIndexOf("/") + 1); } return objectId; } /** * 笔记之前 http 域名是 http://note.yd.chaoxing.com,https 域名是 https://noteyd.chaoxing.com * 之前 https 域名不支持 http 的,要根据协议换不同的域名, * 单位做映射的时候也是 http 的映射到 http://note.yd.chaoxing.com,https的映射到 https://noteyd.chaoxing.com * 例如: * http://note.yd.test.com 映射到 http://note.yd.chaoxing.com * https://noteyd.test.com 映射到 http://noteyd.test.com * 但是现在(2021-12-06) https的域名支持了http,http://noteyd.chaoxing.com * 现在有单位是 http 的域名,然后映射到的是 noteyd.chaoxing.com 上 * http://noteyd.gdhkmooc.com 映射到 http://noteyd.chaoxing.com * 按照之前的替换逻辑,http域名是会使用 http://note.yd.chaoxing.com,将 chaoxing.com 替换成地址栏里面的域名, * 就会导致这个单位下,替换后的笔记地址是 http://note.yd.gdhkmooc.com,然后出现访问不了的情况 * 现在会导致一个问题,有的单位 http 用的是 http://note.yd.chaoxing.com,有的单位 http 用的是 http://noteyd.chaoxing.com * 当其他项目引用了笔记js时,涉及到接口请求时,在外层页面是 http 的情况下, * 无法知道是在 http://note.yd.chaoxing.com 基础上替换 chaoxing.com,还是在 http://noteyd.chaoxing.com 的基础上替换 * 为了保证原来已经映射了的单位能正常使用,只能将映射到 http://noteyd.chaoxing.com 上的单位在下面的配置里面记录一下, * 记录单位定制的一级域名对应的笔记域名 * @type {{}} */ RichTextUitl.customDomain = { '.gdhkmooc.com': 'http://noteyd', '.lsu.edu.cn': 'http://noteyd', '.hbqyg.cn': 'http://noteyd', //湖北群艺馆 '.zhjx.hfut.edu.cn': 'http://noteyd', //合肥工业大学 '.istudy.szpt.edu.cn': 'http://noteyd', //深职院1 '.hejtxy.edu.cn': 'http://noteyd.jxjy' } RichTextUitl.mirrorDomainList = { 'jxjy.hejtxy.edu.cn': 'noteyd.hejtxy.edu.cn' } /** * 转换请求地址,部分单位定制了域名,相应的接口地址也要换成定制的域名下的 * @param url * @returns {*} */ RichTextUitl.convertUrl = function (url, domain) { try { // 武大CNAME特殊处理,通知没有支持镜像,所以只能在js先处理支持了 if (window.location.host == 'www.mooc.whu.edu.cn') { if (url.startsWith('https')) { return url.replace('https://noteyd.chaoxing.com', 'http://www.mooc.whu.edu.cn/noteyd'); } else if (url.startsWith('http')) { return url.replace('http://noteyd.chaoxing.com', 'http://www.mooc.whu.edu.cn/noteyd'); } } // 不是超星域名,有配置走配置 if (window.location.host.indexOf('chaoxing.com' == -1)) { if (Object.keys(RichTextUitl.mirrorDomainList).indexOf(window.location.host) != -1) { url = url.replace('http:', ''); url = url.replace('https:', ''); url = url.replace('noteyd.chaoxing.com', RichTextUitl.mirrorDomainList[window.location.host]); url = url.replace('note.yd.chaoxing.com', RichTextUitl.mirrorDomainList[window.location.host]); return url; } } if (RichTextUitl.prefix && !RichTextUitl.intranetMode) { RichTextUitl.currentDomain = RichTextUitl.prefix + '/' } else if (typeof RichTextUitl.currentDomain == 'undefined') { RichTextUitl.currentDomain = window.location.host; } if (window.location.origin.indexOf('file:') > -1 || window.location.origin.indexOf('//localhost') > -1) { return url; } if (window.obj && window.obj.mirrorDomain) { var urlDomain = url.replace('http:', '').replace('https:', '').replace('//', ''); if (urlDomain.indexOf('/') > -1) { urlDomain = urlDomain.substring(0, urlDomain.indexOf('/')) } url = window.location.protocol + url.replace('http:', '').replace('https:', '') switch (urlDomain) { case 'noteyd.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.NoteDomainHttps.replace('https://', '').replace('http://', '')); break; case 'groupyd.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.GroupDomainHttps.replace('https://', '').replace('http://', '')); break; case 'groupweb.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.GroupWebDomainHttps.replace('https://', '').replace('http://', '')); break; case 'notice.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.NoticeDomainHttps.replace('https://', '').replace('http://', '')); break; case 'mobilelearn.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.mobilelearnDomainHttps.replace('https://', '').replace('http://', '')); break; case 'cooperateyd.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.cooperateDomainHttps.replace('https://', '').replace('http://', '')); break; case 'exportyd.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.exportDomainHttps.replace('https://', '').replace('http://', '')); break; case 'mooc.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.moocDomainHttps.replace('https://', '').replace('http://', '')); break; case 'passport2.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.passport2DomainHttps.replace('https://', '').replace('http://', '')); break; case 'previewyd.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.previewDomainHttps.replace('https://', '').replace('http://', '')); break; case 'sharewh.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.shareWhDomainHttps.replace('https://', '').replace('http://', '')); break; case 'appswh.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.appsWhDomainHttps.replace('https://', '').replace('http://', '')); break; case 'pan-yz.chaoxing.com': case 'pan-yz.cldisk.com': url = url.replace(urlDomain, window.obj.mirrorDomain.panDomainHttps.replace('https://', '').replace('http://', '')); break; case 'd0.ananas.chaoxing.com': case 'd0.cldisk.com': url = url.replace(urlDomain, window.obj.mirrorDomain.d0DomainHttps.replace('https://', '').replace('http://', '')); break; case 'p.ananas.chaoxing.com': case 'p.cldisk.com': url = url.replace(urlDomain, window.obj.mirrorDomain.photoDomainHttps.replace('https://', '').replace('http://', '')); break; case 'special.chaoxing.com': url = url.replace(urlDomain, window.obj.mirrorDomain.specialDomainHttps.replace('https://', '').replace('http://', '')); break; } return url; } var protocol = window.location.protocol; // 获取当前域名,有一些单位定制了域名,需求请求对应的定制笔记域名 // 例如: http://groupyd2.ecourse.ucas.ac.cn/pc/activity/activityList var domain; if (!domain) { domain = window.location.host; } //处理统一域名+路径访问模式,域名转换为xxxx.com/noteyd/xxx if (RichTextUitl.currentDomain && RichTextUitl.currentDomain.indexOf('/noteyd/') > -1 && url.indexOf('yd.') > -1) { url = url.substring(url.indexOf('//') + 2, url.length); urlDomain = url.substring(0, url.indexOf('/')); var service = ''; if (urlDomain.substring(0, urlDomain.indexOf('.')).indexOf('yd') > -1) { service = '/' + urlDomain.substring(0, urlDomain.indexOf('.')); } url = url.replace(urlDomain, domain + service); return window.location.protocol + '//' + url; } else if (RichTextUitl.currentDomain && RichTextUitl.currentDomain.indexOf('bistatic-') > -1 && url.indexOf('chaoxing.com') > -1) { //超星域名换成ipv6域名bistatic-xx.chaoxing.com,例noteyd.chaoxing.com换成bistatic-noteyd.chaoxing.com url = url.substring(url.indexOf('//') + 2, url.length); return window.location.protocol + '//bistatic-' + url; } if (domain.indexOf('chaoxing.com') > -1 || domain == 'sharewh.mti100.com' || isShare) { // 超星域名,分享服务换了非超星域名的 if (protocol == 'http:') { // 当前协议是http的,之前http页面可以调用https的接口,现在新版的chrome浏览器上面不行了,这里做下域名适配 url = url.replace('https://', 'http://'); } else if (protocol == 'https:') { // 当前协议是http的,之前http页面可以调用https的接口,现在新版的chrome浏览器上面不行了,这里做下域名适配 if (url.indexOf('http://note.yd.chaoxing.com') > -1) { // 如果请求的笔记地址,替换成笔记的http域名,笔记http和https的域名不同 url = url.replace('http://note.yd.chaoxing.com', 'https://noteyd.chaoxing.com'); } else { // 其他服务,直接替换协议 url = url.replace('http://', 'https://'); } } return url; } // 截取域名 domain = domain.substring(domain.indexOf('.')) // 笔记服务和小组,有http页面是两级的,note.yd.chaoxing.com , group.yd.chaoxing.com,去掉yd domain = domain.replace('.yd.', '.'); if (protocol == 'http:' && url.indexOf('https://noteyd.chaoxing.com') > -1) { // 当前页面是http协议的,使用的接口地址是笔记的https域名,需要改成笔记http域名,大多定制单位都是配置http的定制域名,没有配https的 // 部分单位定制的http域名对应的是 http://noteyd //当前js地址是非超星域名,noteyd,替换为noteyd,否则还是note.yd if (RichTextUitl.currentDomain.indexOf('noteyd') > -1 && RichTextUitl.currentDomain.indexOf('chaoxing.com') == -1) { url = url.replace('https://noteyd.chaoxing.com', (RichTextUitl.customDomain[domain] || 'http://noteyd') + domain); } else { url = url.replace('https://noteyd.chaoxing.com', (RichTextUitl.customDomain[domain] || 'http://note.yd') + domain); } } else { if (url.indexOf('mooc1-2.chaoxing.com') > -1) { // 目前看一个定制域名的单位(国科大),慕课域名是用的mooc1,mooc1.ecourse.ucas.ac.cn url = url.replace('mooc1-2.chaoxing.com', 'mooc1.chaoxing.com') } url = url.replace('.chaoxing.com', domain); } if (protocol == 'http:' && url.indexOf('https://') > -1) { // 当前页面是http的,请求的地址是https的换,换成http url = url.replace('https://', 'http://') } } catch (e) { } return url; } /** * 笔记详情页和其他第三方引用了笔记富文本插件的页面共用的页面渲染后的js处理逻辑 * @param selector:包含图片标签的dom节点,为了防止多编辑器处理多次、绑定多次事件 */ RichTextUitl.commonEventAfterPageRendered = function (selector) { if (RichTextUitl.isIOS) { //解决IOS上滚动后touch事件不触发的问题 document.addEventListener('touchstart', function () { }); } // 去除不是表格的元素上包裹的div class="table" RichTextUitl.removetablewrap(selector); //mac系统标题字号用500 if (RichTextUitl.OSnow() == 'mac') { $('body').addClass('mac'); } $(selector).find('p,div,h1,h2,h3,h4,h5,h6').each(function (index, item) { if ($(item).css('font-size') == '14px' && ($(item).parents('.richtext li').length == 0 || ($(item).parents('.richtext li').length > 0 && $(item).parents('.richtext li').css('font-size') != ''))) { $(item).css('font-size', ''); } if ($(item).css('position') === 'fixed') { $(item).css({'position': '', 'background-color': '', 'background': ''}); } }); //解决xss问题,防止产生引导性界面 $(selector).find('section,iframe,li').each(function (index, item) { if ($(item).css('position') === 'fixed') { $(item).css({'position': '', 'background-color': '', 'background': ''}); } }); // RichTextUitl.blockEleHover(selector); //标题折叠 RichTextUitl.hTitleHover(selector); //代码块颜色高亮 if ($(selector).find('code').length > 0) { var prefix = window.location.protocol + "//noteyd.chaoxing.com/res/plugin/ueditor/"; if (RichTextUitl.intranetMode) { prefix = RichTextUitl.prefix; } if (typeof (hljs) == 'undefined') { RichTextUitl.loadCssFile(prefix + 'third-party/highlight/highlight.css?_t=' + RichTextUitl.t); RichTextUitl.loadJSFile2(prefix + 'third-party/highlight/highlight.min.js?_t=' + RichTextUitl.t, function () { // 转义 HTML 并保留换行 $(selector).find('code').each(function () { var codeElement = this; // 将
标签替换为换行符,然后获取文本 var html = codeElement.innerHTML; if (html && html.match(/<[^>]+>/) && !html.match(/</)) { // 先将
转换为换行符 var textWithNewlines = html.replace(//gi, '\n'); // 创建临时元素获取纯文本(保留换行) var temp = document.createElement('div'); temp.innerHTML = textWithNewlines; var textContent = temp.textContent || temp.innerText; // 转义 HTML 标签 var escaped = textContent.replace(/&/g, '&').replace(//g, '>'); // 设置回去 codeElement.textContent = escaped; } // 处理 plain 语言标识 var $code = $(codeElement); if ($code.attr('lang') === 'plain') { $code.attr('lang', 'plaintext'); } if (codeElement.className.indexOf('language-plain') > -1) { codeElement.className = codeElement.className.replace(/language-plain\b/g, 'language-plaintext'); } }); try { hljs.highlightAll(); } catch (e) { console.warn('highlight.js error:', e); } }) } } // 给表格加滚动条 if (typeof NiceScroll != 'undefined' && $(selector).find(".table").length > 0 && typeof $(selector).find(".table").niceScroll != 'undefined' && !RichTextUitl.isPhone()) { $(selector).find(".table").niceScroll({ cursorborder: "", cursorwidth: 8, cursorcolor: "#DADFE5", boxzoom: false, autohidemode: true }); } //附件预览使用大窗口 if (RichTextUitl.largePreview) { $(selector).addClass('largePreview'); } //去除列表li下元素的行距 $(selector).find('li').children().each(function (index, item) { if (item.nodeType == 1 && item.style.lineHeight) { item.style.lineHeight = ''; } }) $(selector).find('iframe').each(function (index, iframe) { var jsonOld = RichTextUitl.b64DecodeUnicode(iframe.getAttribute('name') || ''); if (!jsonOld || jsonOld.attachmentType != 18) return; var fileSuffix = jsonOld.att_clouddisk.suffix; if (fileSuffix == 'xls' || fileSuffix == 'xlsx') { iframe.setAttribute('fileType', 'excel'); } else if (fileSuffix == 'pdf') { iframe.setAttribute('fileType', 'pdf'); } else if (fileSuffix == 'doc' || fileSuffix == 'docx') { iframe.setAttribute('fileType', 'word'); } else if (fileSuffix == 'ppt' || fileSuffix == 'pptx') { iframe.setAttribute('fileType', 'ppt'); } }) var appDomain = window.location.protocol + '//appswh.chaoxing.com' if (window.obj && window.obj.mirrorDomain && window.obj.mirrorDomain.appsWhDomainHttps) { appDomain = window.location.protocol + window.obj.mirrorDomain.appsWhDomainHttps.replace('https:', '').replace('http:', ''); } // 开启了原位预览的云盘文件地址改成对应预览地址,只改PC端,手机端不改还是采用附件模式 $(selector).find('.editor-iframe iframe[preview=true]').each(function () { var att_clouddisk = RichTextUitl.getCloudFileData($(this).attr('name')); var iframeSrc = window.location.protocol + '//previewyd.chaoxing.com/res/view/view.html?objectid=' + att_clouddisk.fileId + '&fileName=' + encodeURIComponent(RichTextUitl.getCloudFileName($(this).attr('name'))) // cname和镜像的要改成定制域名 if (window.obj && window.obj.mirrorDomain && window.obj.mirrorDomain.previewDomainHttps) { iframeSrc = window.obj.mirrorDomain.previewDomainHttps + '/res/view/view.html?objectid=' + att_clouddisk.fileId + '&fileName=' + encodeURIComponent(RichTextUitl.getCloudFileName($(this).attr('name'))); } if (att_clouddisk.suffix == 'xlsx' || att_clouddisk.suffix == 'xls') { // excel附件,预览模式使用在线表格的页面 iframeSrc = appDomain + '/res/Spreadsheets/wpsPC.html?type=attachment&cid=' + $(this).attr('cid') + '&resid=' + (att_clouddisk.residstr || att_clouddisk.resid) + '&title=' + encodeURIComponent(att_clouddisk.name); } //设置了高级预览的显示时加上高级预览的参数 if (att_clouddisk.suffix == 'pdf' && $(this).attr('advancedpreview')) { iframeSrc += '&mode=advancedpreview'; if ($(this).attr('advancedpreview') != 'true') { iframeSrc += '&page=' + $(this).attr('advancedpreview'); } } else if (RichTextUitl.useWpsPreview) { iframeSrc += '&type=wps'; } var downloadConfig = '' if (($(this).attr('allowdownload') == 'false' && $(this).attr('download') == 'false') || ($(this).attr('allowdownload') == 'true' && !RichTextUitl.isLogin)) { // 不允许下载 downloadConfig = '&download=false'; } iframeSrc += downloadConfig; if (!RichTextUitl.isGetVideoDataFromCenter) { resid = att_clouddisk.resid iframeSrc += '&resid=' + resid; } $(this).attr('src', iframeSrc); }) $(selector).find('.editor-iframe iframe[excel=true]').each(function () { var downloadConfig = '' if (($(this).attr('allowdownload') == 'false' && $(this).attr('download') == 'false') || ($(this).attr('allowdownload') == 'true' && !RichTextUitl.isLogin)) { // 不允许下载 downloadConfig = '&download=0'; } $(this).attr('src', appDomain + '/res/Spreadsheets/wpsPC.html?cid=' + $(this).attr('cid') + downloadConfig) }) // } /** * 编辑页已经给链接加上a标签的情况下,详情页的addLink方法会在链接外面包一个a标签,导致编辑页加的a标签不显示 * 在将卡片附件转成文本链接附件时,数据放在a标签上,操作方法也是绑定在了a标签的特定样式样式 * 遍历卡片附件转成的a标签,如果他的后面也是一个a */ $(selector).find('.dynacALink.iframe').each(function () { var $next = $(this).next(); if ($next.hasClass('dynacALink') && $next.attr('href') == $(this).attr('href')) { $(this).text($next.text()); $next.remove(); } }) // 设置详情页事件 RichTextUitl.detailPageEvent(selector); } // 格式化markdown数据 function escapeBrackets(text) { var pattern = /\\\[([\s\S]*?)\\]|\\\(([\s\S]*?)\\\)/g; var result = text.replace(pattern, function (match, squareBracket, roundBracket, offset, origin) { const prefix = origin.slice(offset - 1, offset) const isNewLine = prefix === "\n" if (squareBracket) { if (isNewLine) { return "$$" + squareBracket.trim() + "$$"; } return "$" + squareBracket.trim() + "$"; } else if (roundBracket) { return "$" + roundBracket.trim() + "$"; } return match }) return result } // markdown转html RichTextUitl.markDownToHtml = function (markdownText) { markdownText = escapeBrackets(markdownText); marked.setOptions({ renderer: new marked.Renderer(), gfm: true, tables: true, breaks: false, pedantic: false, sanitize: false, smartLists: true, smartypants: false }); var html = marked.parse(markdownText); //把转换后的html中的>和<替换为>和< html = html.replace(/>/g, '>').replace(/</g, '<').replace(/&/g, '&') // 处理公式,将公式转换为span标签 html = html.replace(/\$(.*?)\$/g, function (match, p1) { return '' + p1 + ''; }); // 匹配块级公式 $$...$$ html = html.replace(/\$\$(.*?)\$\$/g, function (match, p1) { return '' + p1 + ''; }); return html; } //去除不是表格的元素上包裹的div class="table" RichTextUitl.removetablewrap = function (selector) { $(selector).find('.table').each(function (index, item) { if (item.nodeName == 'TABLE') { return } var hastable = false; while (item.firstChild) { var dom = item.firstChild; if (dom.nodeType == 3 || (dom.nodeType == 1 && dom.tagName == 'BR') || $(dom).css('display') == 'inline' || $(dom).css('display') == 'inline-table') { $(dom).wrap('

'); dom = dom.parentNode; } else if (dom.nodeType == 1 && dom.tagName == 'TABLE') { hastable = true; } // if (hastable == false) { $(item).before($(dom)) // } else { // $(item).after($(dom)) // } if (!item.firstChild) { item.remove(); break; } } }) $(selector).find('table').wrap('
') } /** * 获取上传相关配置 * @param sync 是否同步调用, true 同步,false 异步 */ RichTextUitl.getUploadConfig = function (sync) { if (RichTextUitl.intranetMode) { return; } if (RichTextUitl.puid && RichTextUitl.yunToken) { return; } if (typeof jQuery != 'undefined') { // 之前http页面可以调用https的接口,现在新版的chrome浏览器上面不行了,这里做下域名适配 // 如果是同步,直接加载,不延迟 if (sync) { try { if (window.obj && window.obj.mirrorDomain && typeof window.obj.mirrorDomain.NoteDomainHttps != 'undefined') { // 如果镜像域名有了,就赋值在加载 if (window.location.protocol == 'http:') { RichTextUitl.noteDomain = window.obj.mirrorDomain.NoteDomainHttps.replace(/https/g, 'http'); } else { RichTextUitl.noteDomain = window.obj.mirrorDomain.NoteDomainHttps; } } } catch (e) { } var json = { url: RichTextUitl.convertUrl(RichTextUitl.noteDomain + "/pc/files/getUploadConfig"), type: "get", xhrFields: { withCredentials: true }, headers: {"Content-Type": "application/x-www-form-urlencoded"}, data: {}, dataType: "json", success: function (resultData) { if (resultData && resultData.result == 1) { RichTextUitl.puid = resultData.msg.puid; RichTextUitl.yunToken = resultData.msg.token || RichTextUitl.yunToken || ''; } }, error: function () { } } if (sync) { // 同步调用 json.async = false; } try { $.ajax(json); } catch (e) { console.error(e) } return; } // 如果是异步,延迟一下在加载,防止有些服务的RichTextUitl.noteDomain还没加载完,这里就执行了,导致获取不到cname域名而无法获取云盘token setTimeout(function () { try { if (window.obj && window.obj.mirrorDomain && typeof window.obj.mirrorDomain.NoteDomainHttps != 'undefined') { // 如果镜像域名有了,就赋值在加载 if (window.location.protocol == 'http:') { RichTextUitl.noteDomain = window.obj.mirrorDomain.NoteDomainHttps.replace(/https/g, 'http'); } else { RichTextUitl.noteDomain = window.obj.mirrorDomain.NoteDomainHttps; } } } catch (e) { console.error(e) } var json = { url: RichTextUitl.convertUrl(RichTextUitl.noteDomain + "/pc/files/getUploadConfig"), type: "get", xhrFields: { withCredentials: true }, headers: {"Content-Type": "application/x-www-form-urlencoded"}, data: {}, dataType: "json", success: function (resultData) { if (resultData && resultData.result == 1) { RichTextUitl.puid = resultData.msg.puid; RichTextUitl.yunToken = resultData.msg.token || RichTextUitl.yunToken || ''; } }, error: function () { } } if (sync) { // 同步调用 json.async = false; } try { $.ajax(json); } catch (e) { console.error(e) } }, 200) } } //获取v2上传地址 RichTextUitl.getV2UploadUrl = function () { var from = RichTextUitl.from || 'old_note_editor'; var url = window.location.protocol + window.obj.mirrorDomain.NoteDomainHttps.replace("https:", '').replace('http:', '') + '/pc/files/getYunPanUploadUrl?from=' + from; var uploadUrl = ''; $.ajax({ url: url, type: 'get', async: false, xhrFields: { withCredentials: true }, success: function (res) { if (res.result) { uploadUrl = res.data } } }) return uploadUrl; } /** * 字符转义 * @param content * @returns {string|*} */ RichTextUitl.escapedCharacter = function (content) { if (content) { return content.replace(//g, ">") .replace(/"/g, '"').replace(/'/g, "'"); } return ""; } RichTextUitl.loadScript = function (src, cb) { var head = document.head || document.getElementsByTagName('head')[0] var script = document.createElement('script') cb = cb || function () { } script.type = 'text/javascript' script.src = src if (!('onload' in script)) { script.onreadystatechange = function () { if (this.readyState !== 'complete' && this.readyState !== 'loaded') return this.onreadystatechange = null cb(script) } } script.onload = function () { this.onload = null cb(script) } head.appendChild(script) } //有序列表转编号 //旧格式的列表改为新格式的列表 function normaloldlist() { $('.richtext ol:not([level]),.richtext ul:not([level])').each(function (index, list) { if (!list.firstChild) { list.remove(); return } $(this).removeAttr('class').removeAttr('style'); if ($(list).parents('ol,ul').length > 0 && $(list).parents('ol,ul').eq(0).parents('.richtext').length > 0) { var listnext = list.nextSibling; $(list).attr('level', 1 + parseInt($(list).parents('ol,ul').eq(0).attr('level'))); RichTextUitl.breakParent(list, $(list).parents('ol,ul')[0]); if (listnext) { list.nextSibling.remove(); } if (list.nextSibling && list.nextSibling.firstChild && !list.nextSibling.firstChild.firstChild) { list.nextSibling.firstChild.remove(); } if (list.nextSibling && !list.nextSibling.firstChild) { list.nextSibling.remove(); } if (list.previousSibling && list.previousSibling.firstChild && !list.previousSibling.firstChild.firstChild) { list.previousSibling.firstChild.remove(); } if (list.previousSibling && !list.previousSibling.firstChild) { list.previousSibling.remove(); } } if (!$(this).attr('level')) { $(list).attr('level', '1'); if (list.tagName == 'OL') { $(list).attr('serialnum', '1').attr('data-origin-start', '1'); } } if ($(this).parents('ol,ul').length > 0 && $(list).parents('ol,ul').eq(0).parents('.richtext').length > 0) { $(list).attr('level', 1 + parseInt($(list).parents('ol,ul').eq(0).attr('level'))); } var level = $(list).attr('level'); var listnext = list.nextSibling; var oldlist = list; var i = 0; $(list).children('li').each(function (index, li) { if (!(li.children.length == 1 && (li.firstChild.nodeName == 'OL' || li.firstChild.nodeName == 'UL'))) { i++; } var serialnum = serialnumToString(i, level); $(li).parent().attr('level', level); if (list.tagName == 'OL') { $(li).attr('serialnum', serialnum); } if (index > 0) { var newlist = document.createElement(oldlist.tagName); if (oldlist.tagName == 'OL') { $(newlist).attr('serialnum', li.getAttribute('serialnum')); } $(newlist).attr('level', level); if (listnext) { oldlist.parentNode.insertBefore(newlist, listnext); } else { oldlist.parentNode.appendChild(newlist); } newlist.appendChild(li); list = newlist; } else { if (list.tagName == 'OL') { $(list).attr('serialnum', li.getAttribute('serialnum')); } $(list).attr('level', level); } //序号颜色大小根据文字大小改变 var firsttag = list.firstChild.firstChild; if (list.firstChild.nodeType === 1) { list.firstChild.style.cssText = ''; } while (firsttag) { if (firsttag.nodeType == 1 && firsttag.nodeName == "SPAN" && firsttag.id.indexOf('bookmark') > -1) { firsttag = firsttag.nextSibling; } else if (firsttag.nodeType == 1 && firsttag.nodeName == "SPAN" && firsttag.style.cssText != "") { firsttag.style.fontFamily != "" ? list.firstChild.style.fontFamily = firsttag.style.fontFamily : ''; firsttag.style.fontSize != "" ? list.firstChild.style.fontSize = firsttag.style.fontSize : ''; firsttag.style.color != "" ? list.firstChild.style.color = firsttag.style.color : ''; firsttag = firsttag.firstChild; } else if (firsttag.nodeType == 1 && firsttag.nodeName == 'H1') { list.firstChild.style.cssText += 'font-size:24px;font-weight:' + fontweight; firsttag = firsttag.firstChild; } else if (firsttag.nodeType == 1 && firsttag.nodeName == 'H2') { list.firstChild.style.cssText += 'font-size:20px;font-weight:' + fontweight; firsttag = firsttag.firstChild; } else if (firsttag.nodeType == 1 && firsttag.nodeName == 'H3') { list.firstChild.style.cssText += 'font-size:18px;font-weight:' + fontweight; firsttag = firsttag.firstChild; } else if (firsttag.nodeType == 1 && firsttag.nodeName == 'H4') { list.firstChild.style.cssText += 'font-size:16px;font-weight:' + fontweight; firsttag = firsttag.firstChild; } else if (firsttag.nodeType == 1 && $(firsttag).css('display') == 'block') { list.firstChild.style.fontFamily = ''; list.firstChild.style.fontSize = ''; list.firstChild.style.color = ''; $(list.firstChild).children().css({'font-size': '', 'color': '', 'font-family': ''}); firsttag = firsttag.firstChild; } else if (firsttag.nodeType == 3 && firsttag.innerText == "​") { firsttag = firsttag.nextSibling; } else if (firsttag.nodeType == 3 || firsttag.nodeName == 'BR') { break; } else { firsttag = firsttag.firstChild; } } }) }); //给有大小颜色的li下的块状子元素添加原始样式,保证后面没有大小颜色的文字样式不被改变 $('.richtext li').children().each(function (index, node) { if (node.parentNode.style.cssText != '' && $(node).css('display') == 'block' && $(node).text().trim() != '' && node.firstChild) { if (node.tagName.indexOf('H') == -1) { //不是标题 if ($(node).parents('table').length == -1) { $(node).css({'font-size': $(me.body).css('font-size')}); } else { $(node).css({'font-size': $(node).parents('table').css('font-size')}); } } if (node.parentNode.style.cssText.indexOf('color') > -1) { $(node).css({'color': '#333333'}); } } }) // $('.richtext li').each(function(index,li){ // var lifirst = li.firstChild; // if(lifirst.nodeType == 1 && !lifirst.firstChild && lifirst.firstChild.nextSibling){ // lifirst.remove(); // lifirst = li.firstChild; // } // if(li.children.length>1){ // var listnext = li.parentNode.nextSibling; // while(lifirst.nextSibling){ // if(lifirst.nextSibling.nodeType == 1 && !lifirst.nextSibling.firstChild){ // lifirst.nextSibling.remove(); // }else if(lifirst.nextSibling.nodeType == 1 && window.getComputedStyle(lifirst.nextSibling).display == 'block'){ // if(listnext){ // li.parentNode.parentNode.insertBefore(lifirst.nextSibling,listnext); // }else{ // li.parentNode.parentNode.appendChild(lifirst.nextSibling); // } // } // } // } // }) } /** * 判断云盘附件是否支持预览 * @param name * @returns {boolean} */ RichTextUitl.isSupportPreview = function (name) { var attachmentData = RichTextUitl.b64DecodeUnicode(name); if (!attachmentData || !attachmentData.att_clouddisk) { return false; } if (RichTextUitl.intranetMode && !RichTextUitl.supportPreview) { return false; } var icon = (attachmentData.att_clouddisk.suffix || '').toLowerCase(); if (icon.indexOf('ppt') > -1 || icon.indexOf('doc') > -1 || icon.indexOf('xls') > -1 || icon.indexOf('pdf') > -1 && attachmentData.att_clouddisk.fileId) { return true; } return false; } /** * 获取云盘附件数据 * @param name * @returns {string|*} */ RichTextUitl.getCloudFileData = function (name) { var attachmentData; try { attachmentData = JSON.parse(decodeURIComponent(atob(name))); } catch (e) { } if (!attachmentData || !attachmentData.att_clouddisk) { return ''; } return attachmentData.att_clouddisk } /** * 获取云盘文件objectId * @param name * @returns {string} */ RichTextUitl.getCloudFileObjectId = function (name) { return RichTextUitl.getCloudFileData(name).fileId || ''; } /** * 获取云盘文件resid * @param name * @returns {string} */ RichTextUitl.getCloudFileResId = function (name) { return RichTextUitl.getCloudFileData(name).resid || ''; } /** * 获取文件名 * @param name * @returns {string|*|string} */ RichTextUitl.getCloudFileName = function (name) { var att_clouddisk = RichTextUitl.getCloudFileData(name); var fileName = att_clouddisk.name; if (fileName.indexOf('.' + att_clouddisk.suffix) > -1) { fileName = fileName.substring(0, fileName.indexOf('.' + att_clouddisk.suffix)); } return fileName || ''; } /** * 获取后缀 * @param name * @returns {string|*|string} */ RichTextUitl.getCloudFileSuffix = function (name) { return RichTextUitl.getCloudFileData(name).suffix || ''; } /** * 获取url参数 * @param name * @returns {string|*} */ RichTextUitl.getUrlParam = function (name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象 var r = window.location.search.substr(1).match(reg); //匹配目标参数 if (r != null) return r[2]; return ''; //返回参数值 } function intToRoman(num) { var result = ""; if (num >= 1000) { result = repeatC('m', Math.floor(num / 1000)); num %= 1000; } if (num >= 100) { result += generBase(Math.floor(num / 100), ['c', 'd', 'm']); num %= 100; } if (num >= 10) { result += generBase(Math.floor(num / 10), ['x', 'l', 'c']); num %= 10; } if (num >= 1) { result += generBase(Math.floor(num), ['i', 'v', 'x']); } return result; } function generBase(num, arr) { var result = ""; if (num >= 1 && num <= 3) { result = repeatC(arr[0], num); } if (num === 4) { result = arr[0] + '' + arr[1]; } if (num >= 5 && num <= 8) { result = arr[1] + '' + repeatC(arr[0], num - 5); } if (num === 9) { result = arr[0] + "" + arr[2]; } return result; } function repeatC(char, count) { var result = ""; for (var i = 0; i < count; i++) { result += char; } return result; } //小写罗马数字转数字 function romanToInt(s) { //定义一个对象来存放数据 var map = {'i': 1, 'v': 5, 'x': 10, 'l': 50, 'c': 100, 'd': 500, 'm': 1000}; //罗马数分割成数组 var sArr = s.split(''); //总数 var sum = 0; for (var i = 0; i < sArr.length; i++) { //sArr[i]拿到的是key,只要比较前一个比后一个小就行,大的话相减,并且这个时候,i+1已经不用计算了,我们可以把i+1,跳过下一个数字的比对操作 var value = map[sArr[i]] if (value < map[sArr[i + 1]]) { value = map[sArr[i + 1]] - value; i++; } sum += value; } return sum; } //整数转字母 function intToAlpha(num) { var str = ""; while (num > 0) { var m = num % 26; if (m == 0) { m = 26; } str = String.fromCharCode(m + 96) + str; num = (num - m) / 26; } return str; } function alphaToInt(str) { var n = 0; var s = str.match(/./g);//求出字符数组 var j = 0; for (var i = str.length - 1, j = 1; i >= 0; i--, j *= 26) { var c = s[i].toLowerCase(); if (c < 'a' || c > 'z') { return 0; } n += (c.charCodeAt(0) - 96) * j; } return n; } //列表序号转整数 function serialnumToInt(serialstr, level) { var serialnum; level = parseInt(level); if (level % 3 == 0) { serialnum = romanToInt(serialstr); } else if (level % 3 == 1) { serialnum = parseInt(serialstr); } else { serialnum = alphaToInt(serialstr); } return serialnum; } //列表序号转字符串 function serialnumToString(serialnum, level) { var serialstr; level = parseInt(level); if (level % 3 == 0) { serialstr = intToRoman(serialnum); } else if (level % 3 == 1) { serialstr = serialnum.toString(); } else { serialstr = intToAlpha(serialnum); } return serialstr; } //列表序号加1 function addSerialNum(serialstr, level) { var serialnum; serialnum = serialnumToInt(serialstr, level); serialnum++; serialstr = serialnumToString(serialnum, level); return serialstr; } //列表序号减1 function minusSerialNum(serialstr, level) { var serialnum; serialnum = serialnumToInt(serialstr, level); if (serialnum > 1) { serialnum--; } serialstr = serialnumToString(serialnum, level); return serialstr; } /** * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, * 拆分形成的两个节点之间是node节点 * @method breakParent * @param { Node } node 作为分界的节点对象 * @param { Node } parent 该节点必须是node节点的祖先节点, 且是block节点。 * @return { Node } 给定的node分界节点 * */ RichTextUitl.breakParent = function (node, parent) { var tmpNode, parentClone = node, clone = node, leftNodes, rightNodes; do { parentClone = parentClone.parentNode; if (leftNodes) { tmpNode = parentClone.cloneNode(false); tmpNode.appendChild(leftNodes); leftNodes = tmpNode; tmpNode = parentClone.cloneNode(false); tmpNode.appendChild(rightNodes); rightNodes = tmpNode; } else { leftNodes = parentClone.cloneNode(false); rightNodes = leftNodes.cloneNode(false); } while (tmpNode = clone.previousSibling) { leftNodes.insertBefore(tmpNode, leftNodes.firstChild); } while (tmpNode = clone.nextSibling) { rightNodes.appendChild(tmpNode); } clone = parentClone; } while (parent !== parentClone); tmpNode = parent.parentNode; tmpNode.insertBefore(leftNodes, parent); tmpNode.insertBefore(rightNodes, parent); tmpNode.insertBefore(node, rightNodes); parent.parentNode.removeChild(parent); return node; } //判断系统 RichTextUitl.OSnow = function () { var isMac = /macintosh|mac os x/i.test(navigator.userAgent); var isWindows = /windows|win32/i.test(navigator.userAgent); if (isWindows) { return 'windows'; } if (isMac) { return 'mac'; } } /** * 获取预览页地址 * @param cid:附件cid */ RichTextUitl.executePreview = function (data) { var targetIframe = $('body').find('iframe[cid=' + data.cid + ']') if (targetIframe && targetIframe.length > 0 && targetIframe[0].name) { var attachment = RichTextUitl.b64DecodeUnicode(targetIframe[0].name) var fileName = attachment.att_clouddisk.name; if (fileName.indexOf('.' + attachment.att_clouddisk.suffix) > -1) { fileName = fileName.substring(0, fileName.indexOf('.' + attachment.att_clouddisk.suffix)); } var puid = attachment.att_clouddisk.puid; if (!puid) { puid = attachment.att_clouddisk.infoJsonStr ? (attachment.att_clouddisk.infoJsonStr.puid || '') : ''; } if ($(this).parents('.dynacALink').length == 0 && $(this).parents('.editor-iframe').length > 0) { //获取iframe的域名,作为获取预览地址的域名,解决部分单位编辑页超星域名,详情页单位域名,未配置单位域名,点预览打不开 var iframeSrc = $(this).parents('.operatehover').siblings('iframe').attr('src'); var iframeDomain = ''; if (iframeSrc.indexOf('//') > -1) { iframeSrc = iframeSrc.substring(iframeSrc.indexOf('//') + 2, iframeSrc.length) iframeDomain = iframeSrc.substring(0, iframeSrc.indexOf('/')) } } //调接口获取enc RichTextUitl.getPreviewUrl(attachment.att_clouddisk.fileId, encodeURIComponent(fileName), $(this).attr('download'), null, iframeDomain, attachment.att_clouddisk.resid); } } /** * 获取预览页地址 * @param objectId * @param fileName * @param download * @param callback */ RichTextUitl.getPreviewUrl = function (objectId, fileName, download, callback, domain, resid) { var url = window.location.protocol + '//previewyd.chaoxing.com/res/view/view.html?objectid=' + objectId + '&fileName=' + encodeURIComponent(fileName) var posturl = 'https://noteyd.chaoxing.com/screen/note_note/getPreviewUrl'; //nticct.cahe.edu.cn 没有映射笔记域名,编辑页用的chaoxing域名,不走域名转换 if (window.location.host.indexOf('nticct.cahe.edu.cn') == -1) { posturl = RichTextUitl.convertUrl(posturl, domain) } //镜像附件地址 if (RichTextUitl.annexMirrorPrefix) { YunFileUtil.url = RichTextUitl.annexMirrorPrefix + '/screen/note_note/getPreviewUrl'; } if (RichTextUitl.isGetVideoDataFromCenter) { resid = '' } var json = { 'objectId': objectId, 'fileName': fileName, 'download': download, 'resid': resid } if (RichTextUitl.useWpsPreview) { json.type = 'wps' } //有的单位做了镜像云盘但课程那边的附件是上传到公网的,需要获取公网的预览地址 if (RichTextUitl.cloudUrl) { json.cloudUrl = RichTextUitl.cloudUrl; } $.ajax({ type: 'POST', headers: {"Content-Type": "application/x-www-form-urlencoded"}, url: posturl, data: json, success: function (data) { if (data && data.result && data.msg) { url = data.msg; if (resid) { url += '&resid=' + resid } if (typeof callback == "function") { callback(url); return; } window.open(url); return; } else if (data.result == 0 && data.msg) { //如果云盘文件被删除,取不到下载地址,给错误提示 RichTextUitl.showTips(data.msg, 0) } } }); } //块状元素悬浮事件 // RichTextUitl.blockEleHover = function(selector){ // $(selector).find('p,div,h1,h2,h3,h4,h5,h6,pre,blockquote,section,table').each(function (index, node) { // //鼠标移上段落显示评论框 // $(node).on('mouseover',function (e) { // if($(this).find('img,iframe,hr,p,div,h1,h2,h3,h4,h5,h6,pre,code,blockquote,section,li').length == 0 && $(this).parents('table,code,.signDiv').length == 0 || $(this).is('table')){ // var totop = $(this).offset().top - $(selector).offset().top + parseInt($(this).css('line-height').replace('px','')/2) - 10; // var toleft = $(selector).offset().left + $(this).offset().left; // $(this).append('
') // } // }); // $(node).on('mouseleave',function () { // $(this).find('.pCommentBtn').remove(); // }) // }) // } //标题折叠 RichTextUitl.hTitleHover = function (selector) { //标题折叠:如果h在div里,移出,表格、录音打点、课程报告、勾选框里的不移出 $(selector).find('h1,h2,h3,h4,h5,h6').each(function (index, node) { node.classList.remove('hover'); node.classList.remove('fold'); if (node.parentNode != selector && node.parentNode.nodeName != 'LI' && $(node).parents('.richtext .record-box').length == 0 && $(node).parents('.richtext table').length == 0 && $(node).parents('.richtext .notice_main').length == 0 && !$(node).hasClass('top-cover-title') && $(node).parents('.richtext .todo-view').length == 0 && $(node).parents('.richtext .signDiv').length == 0 && $(node).parents('.richtext .callout-block').length == 0 && $(node).parents('.report_main').length == 0) { var parent = node.parentNode; while (!$(parent.parentNode).hasClass('richtext')) { parent = parent.parentNode; } RichTextUitl.breakParent(node, parent); //20200323 清除上一个li里的最后一个空标签 var pre = node.previousSibling; if (pre && pre.nodeType == 1 && pre.innerText == '' && $(pre).find('hr,br,img,iframe,canvas').length == 0) { $(pre).remove() } var next = node.previousSibling; if (next && next.nodeType == 1 && next.innerText == '' && $(next).find('hr,br,img,iframe,canvas').length == 0) { $(next).remove(); } } if ($(node).parents('li,ul,ol').length > 0) { return } if ($(node).find('.foldtitle-tri-wrap').length == 0) { $(node).find('.foldtitle-tri-wrap').remove(); } //给标题加折叠三角 $(node).prepend('
' + '' + '
收起
' + '
'); if (typeof isShare != 'undefined' && isShare && RichTextUitl.isPhone()) { $(selector).find('h1,h2,h3,h4,h5,h6').removeClass('hover') $(node).addClass('hover'); var totop = parseInt($(node).css('line-height').replace('px', '') / 2) - 16 var toleft = $(selector).offset().left - $(node).offset().left - 30 - parseInt($(node).css('border-left-width').replace('px', '')); $(node).find('.foldtitle-tri-wrap').css({'top': totop + 'px', 'left': toleft + 'px'}); } }); //鼠标移上显示折叠 $(selector).on('mouseover', function (e) { var hTitle; if (/h\d/i.test(e.target.nodeName)) { hTitle = e.target; } else if ($(e.target).parents('h1,h2,h3,h4,h5,h6').length > 0) { hTitle = $(e.target).parents('h1,h2,h3,h4,h5,h6')[0]; } else if ((e.target.nodeName == 'OL' || e.target.nodeName == 'UL') && e.target.firstChild && e.target.firstChild.firstChild && /h\d/i.test(e.target.firstChild.firstChild.nodeName)) { hTitle = e.target.firstChild.firstChild; } if (hTitle) { //表格、课程报告、勾选框、录音打点 不显示折叠三角 if ($(hTitle).parents('.richtext table').length > 0 || $(hTitle).parents('.richtext .top-cover-bot').length > 0 || $(hTitle).parents('.richtext .callout-block').length > 0 || $(hTitle).parents('.richtext .todo-view').length > 0 || $(hTitle).parents('.richtext .record-box').length > 0 || $(hTitle).parents('.richtext #signDiv').length > 0) { return } if (hTitle.innerText.trim() == '') { return } $(selector).find('h1,h2,h3,h4,h5,h6').removeClass('hover') $(hTitle).addClass('hover'); var totop = parseInt($(hTitle).css('line-height').replace('px', '') / 2) - 16 var toleft = $(selector).offset().left - $(hTitle).offset().left - 30 - parseInt($(hTitle).css('border-left-width').replace('px', '')); $(hTitle).find('.foldtitle-tri-wrap').css({'top': totop + 'px', 'left': toleft + 'px'}); } else { $(selector).find('h1.hover,h2.hover,h3.hover,h4.hover,h5.hover,h6.hover').removeClass('hover') } }); $(selector).on('mouseleave', function (e) { $('.foldtitle-tri-wrap').parent().removeClass('hover'); }); //点击展开收起 $(selector).on('click', '.foldtitle-tri-wrap', function (e) { var target = e.currentTarget.parentNode; var nowHeadLevel = parseInt(target.tagName.replace(/h/i, '')); var next = target.nextElementSibling; if ($(target).parents('.richtext ol,.richtext ul').length > 0) { next = $(target).parents('.richtext ol,.richtext ul')[0].nextElementSibling; } $(target).find('.tri')[0].style.transition = 'all 0.3s'; setTimeout(function () { $(target).find('.tri')[0].style.transition = ''; }, 400) if ($(target).hasClass('fold')) { //展开 $(target).removeClass('fold'); target.classList.remove('fold'); $(this).find('.hoverTips span').text('收起'); if (!next) return; while (next) { var tagName = next.nodeName; var headLevel; if (/h\d/i.test(tagName)) { headLevel = parseInt(tagName.replace(/h/i, '')); next.classList.remove('fold'); if (headLevel <= nowHeadLevel) { //标题等级等于或者大于当前标题,结束循环 break; } } else if (tagName == 'UL' || tagName == 'OL') { if (next.firstChild && next.firstChild.firstChild && next.firstChild.firstChild.nodeType == 1 && /h\d/i.test(next.firstChild.firstChild.nodeName)) { headLevel = parseInt(next.firstChild.firstChild.nodeName.replace(/h/i, '')); $(next.firstChild.firstChild).removeClass('fold'); if (headLevel <= nowHeadLevel) { //标题等级等于或者大于当前标题,结束循环 break; } } } next.style.display = ''; next.classList.remove('fold'); next = next.nextElementSibling; } } else { //收起 $(target).addClass('fold'); target.classList.add('fold'); $(this).find('.hoverTips span').text('展开'); if (!next) return; while (next) { var tagName = next.nodeName; var headLevel; if (/h\d/i.test(tagName)) { headLevel = parseInt(tagName.replace(/h/i, '')); next.classList.remove('fold'); if (headLevel <= nowHeadLevel) { //标题等级等于或者大于当前标题,结束循环 break; } } else if (tagName == 'UL' || tagName == 'OL') { if (next.firstChild && next.firstChild.firstChild && next.firstChild.firstChild.nodeType == 1 && /h\d/i.test(next.firstChild.firstChild.nodeName)) { headLevel = parseInt(next.firstChild.firstChild.nodeName.replace(/h/i, '')); $(next.firstChild.firstChild).removeClass('fold'); if (headLevel <= nowHeadLevel) { //标题等级等于或者大于当前标题,结束循环 break; } } } next.style.display = 'none'; next = next.nextElementSibling; } } }) } /*代码块工具栏*/ RichTextUitl.codeHover = function (selector) { $(selector).find('pre').each(function (index, node) { var lang = $(node).find('code').attr('lang') || 'PlainText'; $(node).prepend('
' + lang + '
' + RichTextUitl.getI18nContent('copy') + '
'); }) $(selector).on('click', '.copy', function () { window.dt = new clipboard.DT(); var code = $(this).parents('.richtext pre').find('code')[0]; if (!code) return var lang = $(code).attr('lang') || 'PlainText'; var html = '
' + code.innerText.replace(/\n/g, '
') + '
'; dt.setData("text/html", html); dt.setData("text/plain", code.innerText); clipboard.write(dt).then(function () { if ($('.toolTipBox').length > 0) { $('.toolTipBox').remove() } $(document.body).append('
' + RichTextUitl.getI18nContent('copySuccess') + '
') $('.toolTipBox').show(); setTimeout(function () { $('.toolTipBox').fadeOut(); }, 1500) }, function (err) { console.log(err); }); }) } //禁止下载的附件不允许复制 function removeForbidDownloadAttach(tempDiv) { $(tempDiv).find('iframe').each(function (index, item) { var iframename = RichTextUitl.b64DecodeUnicode(item.getAttribute('name')); if (item.getAttribute('module') == 'insertCloud' && iframename.att_clouddisk.forbidDownload && iframename.att_clouddisk.forbidDownload == 1) { $(item).parent().remove() } else if (item.getAttribute('module') == 'insertVideo' && iframename.att_video.forbidDownload && iframename.att_video.forbidDownload == 1) { $(item).parent().remove() } else if (item.getAttribute('module') == 'insertVoice' && iframename.att_voice.forbidDownload && iframename.att_voice.forbidDownload == 1) { $(item).parent().remove() } else if (item.getAttribute('download') == 'false' && item.attr('allowdownload') == 'false') { $(item).parent().remove() } }) return tempDiv; } // 打开微信小程序 RichTextUitl.openWxminiUrl = function (miniUrl, url) { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "micromessenger") { //ios的ua中无miniProgram,但都有MicroMessenger(表示是微信浏览器) wx.miniProgram.getEnv(function (res) { if (res.miniprogram) { //小程序打开 redirectTo navigateTo,url对应具体页面的地址和参数 wx.miniProgram.navigateTo({url: miniUrl}); } else if (url) { //微信内置浏览器打开 window.location.href = url; } }) } else if (url) { //非微信打开 window.location.href = url; } } //编辑页根据cid修改附件信息 - 分组任务使用wps编辑后替换附件使用 RichTextUitl.updateAttachmentByCid = function (editorid, cid, html) { var editor; if (editorid) { editor = UE.getEditor(editorid); } else if (ue) { editor = ue; } else { return; } var iframe = editor.body.querySelector('iframe[cid="' + cid + '"]'); if (iframe) { var parentNode = iframe.parentNode iframe.outerHTML = html parentNode.querySelector('iframe').onload = function () { iframeOnload(this) }; } }