From f022ec8c49839ba698917fcfac0487bb8a7321d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A7=8B=E4=BA=8E=E5=88=9D=E8=A7=81?= <752204717@qq.com> Date: Fri, 7 Mar 2025 16:19:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/img/repeat.png | Bin 0 -> 2574 bytes src/common/js/commonJS.js | 177 +- src/components/page/GenerateCharts.vue | 207 +- src/components/page/ReferenceEditor.vue | 11 +- src/components/page/comArtHtmlCreatNew.vue | 1 + .../page/components/Tinymce/index.vue | 3 + .../page/components/table/word copy.vue | 2000 +++++++++++++++++ src/components/page/components/table/word.vue | 669 ++++-- src/components/page/editPublicRefRdit.vue | 1 + 9 files changed, 2805 insertions(+), 264 deletions(-) create mode 100644 src/assets/img/repeat.png create mode 100644 src/components/page/components/table/word copy.vue diff --git a/src/assets/img/repeat.png b/src/assets/img/repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..709024b0a8b7d6ca00f0985b06fb3b0c1fc31304 GIT binary patch literal 2574 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 literal 0 HcmV?d00001 diff --git a/src/common/js/commonJS.js b/src/common/js/commonJS.js index 6ff51a2..3d6c7f9 100644 --- a/src/common/js/commonJS.js +++ b/src/common/js/commonJS.js @@ -22,7 +22,7 @@ export default { var txt = document.createElement('textarea'); txt.innerHTML = html; return txt.value; - }, + }, //去掉最外层自定义的span标签 extractContentWithoutOuterSpan(cell) { var str = '' @@ -52,12 +52,12 @@ export default { const regex = /\[(\d+(?:–\d+)?(?:, ?\d+(?:–\d+)?)*)\]/g; str = str.replace(//g, '').replace(/<\/blue>/g, ''); // 先去掉所有的 标签 - + if (regex.test(str)) { - str = str.replace(regex, function(match) { + str = str.replace(regex, function (match) { // 提取出方括号中的内容,并进行匹配 const content = match.slice(1, match.length - 1); // 去掉方括号 - + // 判断是否符合条件,纯数字、逗号后有空格、连字符 if (/^\d+$/.test(content) || /, ?/.test(content) || /–/.test(content)) { return `${match}`; // 如果符合条件则加上蓝色标签 @@ -65,8 +65,8 @@ export default { return match; // 如果不符合条件,则保持原样 }); } - - + + // 如果没有 标签,直接返回原始 HTML 内容 @@ -295,18 +295,18 @@ export default { formattedText = capitalizeFirstLetter(formattedText); // 添加蓝色标签 - - + + const regex = /\[(\d+(?:–\d+)?(?:, ?\d+(?:–\d+)?)*)\]/g; formattedText = formattedText.replace(//g, '').replace(/<\/blue>/g, ''); // 先去掉所有的 标签 - + if (regex.test(formattedText)) { - formattedText = formattedText.replace(regex, function(match) { + formattedText = formattedText.replace(regex, function (match) { // 提取出方括号中的内容,并进行匹配 const content = match.slice(1, match.length - 1); // 去掉方括号 - + // 判断是否符合条件,纯数字、逗号后有空格、连字符 if (/^\d+$/.test(content) || /, ?/.test(content) || /–/.test(content)) { return `${match}`; // 如果符合条件则加上蓝色标签 @@ -315,10 +315,10 @@ export default { }); } console.log("After replacement:", formattedText); // 调试:查看替换后的文本 - - - + + + paragraphText += formattedText; } @@ -366,7 +366,7 @@ export default { } }, transformHtmlString(inputHtml) { - + inputHtml = inputHtml.replace(/(<[^>]+) style="[^"]*"/g, '$1'); // 移除style属性 inputHtml = inputHtml.replace(/(<[^>]+) class="[^"]*"/g, '$1'); // 移除class属性 @@ -386,6 +386,41 @@ export default { }, + cleanAndParseWordContent(content) { + // 1️⃣ 解析成

段落数组 + let tempDiv = document.createElement('div'); + tempDiv.innerHTML = content; // 解析 HTML 内容 + let paragraphs = tempDiv.querySelectorAll("p"); // 选取所有

作为数据项 + + // 2️⃣ 将

内容转换为数组,处理空标签对 + let parsedData = Array.from(paragraphs).map(p => { + let text = p.innerHTML.trim(); // 获取内容,去除两端空格 + + // 3️⃣ 移除 (Word 复制的无效标签) + text = text.replace(/<\/?o:p>/g, ""); + + // 4️⃣ 移除 style="..."(防止 Word 带入无用样式) + text = text.replace(/\s*style="[^"]*"/g, ""); + + // 5️⃣ 替换 + text = text.replace(//g, "").replace(/<\/strong>/g, ""); + + // 6️⃣ 替换 + text = text.replace(//g, "").replace(/<\/em>/g, ""); + + // 7️⃣ 处理空标签对: 等 + text = text.replace(/<[^>]+>\s*<\/[^>]+>/g, ""); + + // 8️⃣ 如果最终内容为空,则替换为 `""` + return text.trim() === "" ? "" : text; + }); + + console.log(parsedData); // 输出数组,方便调试 + return parsedData; + } + + + , parseTableToArray(tableString, callback) { @@ -1240,7 +1275,7 @@ export default { } }); ed.ui.registry.addButton('addRow', { - icon:'duplicate-row', + icon: 'duplicate-row', text: 'Add Row', // 下拉框标题 onAction: function () { var edSelection = ed.selection; @@ -1257,7 +1292,7 @@ export default { vueInstance.$emit('onAddRow', dataId); } } - + }); // 添加自定义菜单项 ed.ui.registry.addButton('Save', { @@ -1300,7 +1335,7 @@ export default { emTags[i].parentNode.replaceChild(iTag, emTags[i]); } content = div.innerHTML; - + vueInstance.$emit('saveContent', content, dataId); } } @@ -1390,8 +1425,8 @@ export default { } } }); - - + + ed.ui.registry.addButton('commentAdd', { icon: 'comment-add', text: 'Comment Add', @@ -1519,7 +1554,7 @@ export default { ed.setContent(''); } }); - + ed.ui.registry.addButton('customBlue', { text: 'Blue', // 按钮文本 @@ -1537,80 +1572,80 @@ export default { } } }); - + ed.ui.registry.addButton('myuppercase', { text: 'A', // 按钮文本 - + onAction: function () { // 在选中的文本周围包裹 标签 var selectedText = ed.selection.getContent({ format: 'html' }); // 确保选中的文本是单个单词,包括空格 if (selectedText.trim() && /^[\s\w]+$/.test(selectedText)) { - // 使用正则将选中的文本中的第一个字母大写 - var capitalizedText = selectedText.replace(/(^|\s)([a-zA-Z])/g, function(match, p1, p2) { - return p1 + p2.toUpperCase(); - }); - - // 替换选中的文本,保持空格和其他内容 - ed.selection.setContent(capitalizedText); - } else { - vueInstance.$message.error(vueInstance.$t('commonTable.selectWord')); - - } + // 使用正则将选中的文本中的第一个字母大写 + var capitalizedText = selectedText.replace(/(^|\s)([a-zA-Z])/g, function (match, p1, p2) { + return p1 + p2.toUpperCase(); + }); + + // 替换选中的文本,保持空格和其他内容 + ed.selection.setContent(capitalizedText); + } else { + vueInstance.$message.error(vueInstance.$t('commonTable.selectWord')); + + } } }); ed.ui.registry.addButton('myuppercase', { text: 'A', // 按钮文本 - + onAction: function () { // 在选中的文本周围包裹 标签 var selectedText = ed.selection.getContent({ format: 'html' }); // 确保选中的文本是单个单词,包括空格 if (selectedText.trim() && /^[\s\w]+$/.test(selectedText)) { - // 使用正则将选中的文本中的第一个字母大写 - var capitalizedText = selectedText.replace(/(^|\s)([a-zA-Z])/g, function(match, p1, p2) { - return p1 + p2.toUpperCase(); - }); - - // 替换选中的文本,保持空格和其他内容 - ed.selection.setContent(capitalizedText); - } else { - vueInstance.$message.error(vueInstance.$t('commonTable.selectWord')); - - } + // 使用正则将选中的文本中的第一个字母大写 + var capitalizedText = selectedText.replace(/(^|\s)([a-zA-Z])/g, function (match, p1, p2) { + return p1 + p2.toUpperCase(); + }); + + // 替换选中的文本,保持空格和其他内容 + ed.selection.setContent(capitalizedText); + } else { + vueInstance.$message.error(vueInstance.$t('commonTable.selectWord')); + + } } }); ed.ui.registry.addButton('myuppercasea', { text: 'a', // 按钮文本(小写字母) onAction: function () { - // 获取选中的文本,保留 HTML 格式 - var selectedText = ed.selection.getContent({ format: 'html' }); + // 获取选中的文本,保留 HTML 格式 + var selectedText = ed.selection.getContent({ format: 'html' }); - // 确保选中的文本是单个有效的单词,包括空格 - if (selectedText.trim() && /^[\s\w]+$/.test(selectedText)) { - // 使用正则将选中的文本中的第一个字母转换为小写 - var lowercasedText = selectedText.replace(/(^|\s)([a-zA-Z])/g, function(match, p1, p2) { - return p1 + p2.toLowerCase(); - }); - - // 替换选中的文本,保持空格和其他内容 - ed.selection.setContent(lowercasedText); - } else { - vueInstance.$message.error(vueInstance.$t('commonTable.selectWord')); - } + // 确保选中的文本是单个有效的单词,包括空格 + if (selectedText.trim() && /^[\s\w]+$/.test(selectedText)) { + // 使用正则将选中的文本中的第一个字母转换为小写 + var lowercasedText = selectedText.replace(/(^|\s)([a-zA-Z])/g, function (match, p1, p2) { + return p1 + p2.toLowerCase(); + }); + + // 替换选中的文本,保持空格和其他内容 + ed.selection.setContent(lowercasedText); + } else { + vueInstance.$message.error(vueInstance.$t('commonTable.selectWord')); + } } - }); - ed.ui.registry.addButton('Line', { - text: '−', // 按钮文本 - onAction: function () { - // 插入 `−` 符号到当前光标位置 - ed.insertContent('−'); - } -}); + }); + ed.ui.registry.addButton('Line', { + text: '−', // 按钮文本 + onAction: function () { + // 插入 `−` 符号到当前光标位置 + ed.insertContent('−'); + } + }); + - ed.ui.registry.addButton('removeBlue', { text: 'Blue', // 按钮文本 onAction: function () { @@ -1660,7 +1695,7 @@ export default { { selector: '.tox-tbtn[data-mce-name="customblue"]', className: 'tinymce-custom-button-blue' }, { selector: '.tox-tbtn[data-mce-name="removeblue"]', className: 'tinymce-custom-button-removeblue' } ]; - + // 遍历每个按钮并为每个按钮添加类 buttons.forEach(item => { const buttonElements = document.querySelectorAll(item.selector); @@ -1672,7 +1707,7 @@ export default { }); }, 100); // 延迟执行,确保按钮渲染完成 } - + // 通用递归方法 diff --git a/src/components/page/GenerateCharts.vue b/src/components/page/GenerateCharts.vue index 789a97e..7cf1cfe 100644 --- a/src/components/page/GenerateCharts.vue +++ b/src/components/page/GenerateCharts.vue @@ -73,7 +73,7 @@ -

+
+ Save + + +
@@ -400,6 +438,8 @@ export default { ChGtpTxt: '' }, txtVisible: false, + addContentVisible: false, + addContent: {}, lineStyle: {}, contentStyle: {}, lineTable: [], @@ -494,11 +534,13 @@ export default { handleSaveContent() { this.$refs.commonContent.getTinymceContent('content'); }, + handleSaveAddContent() { + this.$refs.addContent.getTinymceContent('addcontent'); + }, async getContent(type, content) { - + console.log('content at line 539:', content); if (type == 'content') { - content = content.replace(/<(?!\/?(img|b|i|sub|sup|span|strong|em |blue)\b)[^>]+>/g, ''); content = content.replace(/\s*style="[^"]*"/g, ''); @@ -522,27 +564,41 @@ export default { // 获取最终修改后的 HTML content = div.innerHTML; - - this.saveContent(content, this.currentContent.am_id); + } else if (type == 'addcontent') { + var hasTable = /[\s\S]*?<\/table>/i.test(content); + + if (hasTable) { + this.$message({ + type: 'warning', + message: 'Table content is not supported!' + }); + return false + } + var list = this.$commonJS.cleanAndParseWordContent(content); + console.log('list at line 569:', list); + + this.saveContentList(list, this.currentId); } else if (type == 'table') { this.saveTable(content); } else if (type == 'comment') { this.addComment(content); } - }, - async saveContent(content, am_id) { - + }, + async saveContent(content, am_id) { var that = this; - var str = content.replace(/^

(.*?)<\/p>$/, '$1') ? content.replace(/^

(.*?)<\/p>$/, '$1') : ''; - if (str == '') { - this.$message({ - type: 'warning', - message: 'Please enter the content!' - }); - } - str= await that.$commonJS.decodeHtml(str) + var str = content.replace(/^

\s*(.*?)\s*<\/p>$/, '$1').trim(); + // var str = content.replace(/^

(.*?)<\/p>$/, '$1') ? content.replace(/^

(.*?)<\/p>$/, '$1') : ''; + console.log('str at line 580:', JSON.stringify(str)); + + // if (str == '') { + // this.$message({ + // type: 'warning', + // message: 'Please enter the content!' + // }); + // } + str = await that.$commonJS.decodeHtml(str); await that.$api .post(that.urlList.editContent, { am_id: am_id, @@ -556,6 +612,28 @@ export default { } }); }, + async saveContentList(content, am_id) { + if (content.length == 0) { + this.$message({ + type: 'warning', + message: 'Please enter the content!' + }); + } + + await this.$api + .post('api/Preaccept/addMoreRow', { + article_id: this.articleId, + am_id: am_id, + rows: content + }) + .then(async (res) => { + if (res.code == 0) { + this.addContentVisible = false; + this.getDate(); + this.getCommentList(); + } + }); + }, deleteComment(comment, index) { console.log('comment at line 480:', comment); if (this.isEditComment) { @@ -582,7 +660,7 @@ export default { .catch(() => {}); } }, - + async huifu(id) { var that = this; await this.$confirm(this.$t('commonTable.reContent'), 'Prompt', { @@ -712,6 +790,56 @@ export default { console.log('err at line 466:', err); }); }, + async onDeletes(dataId) { + await this.$confirm(this.$t('commonTable.removeContent'), 'Prompt', { + confirmButtonText: 'Submit', + cancelButtonText: 'Cancel', + type: 'warning' + }) + .then(async () => { + var that = this; + + await that.$api + .post('/api/Preaccept/delMoreArticleMains', { + ids: dataId + }) + .then(async (res) => { + if (res.code == 0) { + setTimeout(() => { + that.getDate(); + that.getCommentList(); + that.$refs.commonWordHtmlTypeSetting.refresh('img'); + that.$refs.commonWordHtmlTypeSetting.refresh('table'); + that.$forceUpdate(); + }); + } + }); + // this.Main_List.splice( + // this.Main_List.findIndex((item) => item.p_main_id == dataId), + // 1 + // ); + }) + .catch((err) => { + console.log('err at line 466:', err); + }); + }, + async changeSort(type,id) { + var that=this + await that.$api + .post(type=='up'?'/api/Preaccept/upArticleMain':'/api/Preaccept/downArticleMain', { + am_id: id + }) + .then(async (res) => { + if (res.code == 0) { + setTimeout(() => { + that.getDate(); + that.getCommentList(); + + that.$forceUpdate(); + }); + } + }); + }, async addCommentSetting(content) { console.log('content at line 602:', content); await this.$api @@ -850,6 +978,9 @@ export default { async onEditTitle(data) { var url; switch (data.value) { + case 0: + url = 'api/Preaccept/changeNormal'; + break; case 1: url = 'api/Preaccept/changeH1'; break; @@ -962,7 +1093,7 @@ export default { } }, updateChange(content, type) { - console.log('content at line 976:', content) + console.log('content at line 976:', content); var str = this.$commonJS.transformHtmlString(content); if (type == 'imgNote') { this.picStyle.note = str; @@ -1005,13 +1136,19 @@ export default { this.lineStyle.visiTitle = 'Edit Table'; this.threeVisible = true; } else { - data.content = data.content.replace(/]*>/g, '').replace(/<\/span>/g, ''); // 去除span标签 + data.content = data.content.replace(/]*>/g, '').replace(/<\/span>/g, ''); // 去除span标签 this.currentContent = data; - + this.editVisible = true; this.currentId = dataId; } }, + onAddContent(dataId) { + this.addContentVisible = true; + this.addContent = {}; + + this.currentId = dataId; + }, async onDrop(event, dataId) { if (event.dataTransfer.getData('image')) { const draggedImage = JSON.parse(event.dataTransfer.getData('image')); @@ -1330,16 +1467,16 @@ export default { }, // 确定保存图片 - async savePic() { + async savePic() { this.picStyle.picUrl; - var str=this.picStyle.note - str= await this.$commonJS.decodeHtml(str) + var str = this.picStyle.note; + str = await this.$commonJS.decodeHtml(str); if (this.picStyle.visiTitle == 'Edit Figure') { this.$api .post(this.urlList.editImage, { ami_id: this.picStyle.ami_id, url: this.picStyle.picUrl, - note:str + note: str }) .then((res) => { if (res.code == 0) { @@ -1391,16 +1528,16 @@ export default { this.$refs.tinymceChildComment.getContent('comment'); }); }, - async saveTable(content) { + async saveTable(content) { console.log('content at line 998:', content); - var strTitle=this.lineStyle.title - strTitle= await this.$commonJS.decodeHtml(strTitle) - - var strNote=this.lineStyle.note - if(strNote!=''){ - strNote= await this.$commonJS.decodeHtml(strNote) + var strTitle = this.lineStyle.title; + strTitle = await this.$commonJS.decodeHtml(strTitle); + + var strNote = this.lineStyle.note; + if (strNote != '') { + strNote = await this.$commonJS.decodeHtml(strNote); } - + if (content && content.table && content.table.length > 0) { if (this.lineStyle.visiTitle == 'Edit Table') { this.$api diff --git a/src/components/page/ReferenceEditor.vue b/src/components/page/ReferenceEditor.vue index dbd18a7..e5e1056 100644 --- a/src/components/page/ReferenceEditor.vue +++ b/src/components/page/ReferenceEditor.vue @@ -92,6 +92,10 @@

  • - If you want to discard all references and import a new batch of reference information, please click Delete and re-import.

  • +
  • +

    - Please note that if this status exists, + it indicates that the current reference is duplicated .

    +
  • - Please do not forget to recheck all references in the status,especially abbreviated journal title.

  • @@ -100,7 +104,12 @@
    - + + +