tijiao
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import Vue from 'vue';
|
||||
import katex from 'katex';
|
||||
import JSZip from 'jszip';
|
||||
import Common from '@/components/common/common'
|
||||
import Tiff from 'tiff.js';
|
||||
@@ -18,6 +19,90 @@ const capitalizeFirstLetter = function (text) {
|
||||
});
|
||||
};
|
||||
export default {
|
||||
extractLatexFromMathJax() {
|
||||
// 获取所有 MathJax 渲染的公式容器
|
||||
const mathContainers = document.querySelectorAll('mjx-container');
|
||||
|
||||
mathContainers.forEach(container => {
|
||||
// 查找每个渲染公式对应的 MathML 部分
|
||||
const mathElement = container.querySelector('mjx-math');
|
||||
console.log('mathElement at line 28:', mathElement)
|
||||
|
||||
if (mathElement) {
|
||||
// 获取 MathJax 渲染的公式对象
|
||||
const jax = window.MathJax.getJaxFor(mathElement);
|
||||
console.log('jax at line 32:', jax)
|
||||
|
||||
if (jax) {
|
||||
// 使用 MathJax API 获取公式的 LaTeX 代码
|
||||
const latex = jax.getLiteral(); // 获取 LaTeX 表达式
|
||||
console.log('提取到的 LaTeX 公式:', latex); // 输出 LaTeX 代码
|
||||
} else {
|
||||
console.warn('MathJax 对象未找到');
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
replaceWMathContent(inputHtml, callback) {
|
||||
// 使用正则表达式查找所有 <wmath> 标签,并提取 data-latex 的内容
|
||||
var str = inputHtml.replace(/<wmath data-latex="([^"]+)">[^<]*<\/wmath>/g, function(match, latexContent) {
|
||||
// 返回 <wmath> 标签,内容替换为 data-latex 的值
|
||||
return `<wmath data-latex="${latexContent}">${latexContent}</wmath>`;
|
||||
});
|
||||
|
||||
// 调用回调函数并传递处理后的结果
|
||||
callback(str);
|
||||
|
||||
// 输出结果到控制台
|
||||
console.log('Processed HTML:', str);
|
||||
}
|
||||
|
||||
|
||||
,
|
||||
// **解析 MathJax 公式,获取 LaTeX**
|
||||
async extractMathJaxLatex(cell, callback) {
|
||||
console.log('cell at line 67:', cell)
|
||||
return new Promise((resolve, reject) => {
|
||||
// Step 1: First, process the math content and extract LaTeX from <wmath> tags
|
||||
let updatedContent = cell.innerHTML; // Start with the cell's inner HTML
|
||||
console.log('cell content at the start:', updatedContent);
|
||||
|
||||
// Find all <wmath> elements
|
||||
const wmathElements = cell.querySelectorAll('wmath');
|
||||
wmathElements.forEach((element) => {
|
||||
// Get the LaTeX content from the data-latex attribute
|
||||
const latexContent = element.getAttribute('data-latex');
|
||||
console.log('LaTeX content from data-latex:', latexContent);
|
||||
|
||||
// Replace the <wmath> tag with its LaTeX content wrapped in $$...$$
|
||||
updatedContent = updatedContent.replace(element.outerHTML, `<wmath data-latex="${latexContent}">${latexContent}</wmath>`);
|
||||
});
|
||||
|
||||
console.log('updatedContent after processing wmath tags:', updatedContent);
|
||||
|
||||
// Step 2: Now extract content without the outer <span> tags
|
||||
updatedContent = this.extractContentWithoutOuterSpan(updatedContent);
|
||||
console.log('updatedContent after extractContentWithoutOuterSpan:', updatedContent);
|
||||
|
||||
// Step 3: Call the callback function with the final updated content
|
||||
// callback(updatedContent);
|
||||
|
||||
// Resolve the promise with the final content
|
||||
resolve(updatedContent);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
,
|
||||
renderLatex(latexString) {
|
||||
return katex.renderToString(latexString, {
|
||||
throwOnError: false
|
||||
});
|
||||
},
|
||||
decodeHtml(html) {
|
||||
var txt = document.createElement('textarea');
|
||||
txt.innerHTML = html;
|
||||
@@ -25,9 +110,15 @@ export default {
|
||||
},
|
||||
//去掉最外层自定义的span标签
|
||||
extractContentWithoutOuterSpan(cell) {
|
||||
console.log('cell at line 90:', cell)
|
||||
var str = ''
|
||||
if(!cell){
|
||||
return ''
|
||||
}
|
||||
// 获取单元格的 HTML 内容
|
||||
let htmlContent = cell.innerHTML.trim();
|
||||
let htmlContent = cell.trim();
|
||||
|
||||
console.log('htmlContent at line 94:', htmlContent)
|
||||
|
||||
str = this.transformHtmlString(htmlContent)
|
||||
|
||||
@@ -68,9 +159,10 @@ export default {
|
||||
|
||||
|
||||
|
||||
|
||||
console.log('str at line 141:', str)
|
||||
// 如果没有 <span> 标签,直接返回原始 HTML 内容
|
||||
return str;
|
||||
|
||||
},
|
||||
async extractPastedWordTablesToArrays(pastedHtml, callback) {
|
||||
try {
|
||||
@@ -236,31 +328,31 @@ export default {
|
||||
rowspan = 1; // 初始化 rowspan
|
||||
let nextRowIdx = rowIndex + 1;
|
||||
let maxRowspan = rows.length - rowIndex; // 确保 rowspan 不会超过剩余行数
|
||||
|
||||
|
||||
while (nextRowIdx < rows.length) {
|
||||
const nextRowCells = rows[nextRowIdx].getElementsByTagNameNS(namespace, "tc");
|
||||
// console.log(`🔍 检查下一行单元格 at row ${nextRowIdx}, col ${cellIndex}:`, nextRowCells);
|
||||
|
||||
|
||||
if (nextRowCells.length > cellIndex) {
|
||||
const nextCell = nextRowCells[cellIndex];
|
||||
|
||||
|
||||
if (!nextCell) {
|
||||
// console.warn(`⚠️ nextCell 未定义 at row ${nextRowIdx}, col ${cellIndex}`);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
const nextVMerge = nextCell.getElementsByTagNameNS(namespace, "vMerge")[0];
|
||||
// console.log(`🔍 检查 nextVMerge at row ${nextRowIdx}, col ${cellIndex}:`, nextVMerge);
|
||||
|
||||
|
||||
// **如果 nextVMerge 为空,则不应继续增长 rowspan**
|
||||
if (!nextVMerge) {
|
||||
// console.log(`⚠️ nextVMerge 为空 at row ${nextRowIdx}, col ${cellIndex} - 停止扩展`);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// **解析 nextVMerge 的值**
|
||||
const vMergeVal = nextVMerge.getAttribute("w:val");
|
||||
|
||||
|
||||
if (!vMergeVal || vMergeVal === "continue") {
|
||||
if (rowspan < maxRowspan) { // 限制 rowspan 最大值
|
||||
rowspan++;
|
||||
@@ -286,7 +378,7 @@ export default {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
console.log('rowspan at line 265:', rowspan)
|
||||
const currentLevelNumbers = {};
|
||||
for (const paragraph of paragraphs) {
|
||||
@@ -621,11 +713,23 @@ export default {
|
||||
|
||||
// inputHtml = inputHtml.replace(/(<[^>]+) style="[^"]*"/g, '$1'); // 移除style属性
|
||||
// inputHtml = inputHtml.replace(/(<[^>]+) class="[^"]*"/g, '$1'); // 移除class属性
|
||||
inputHtml = inputHtml.replace(/<([a-zA-Z0-9]+)[^>]*>/g, '<$1>'); // 删除标签上的所有属性
|
||||
// inputHtml = inputHtml.replace(/<([a-zA-Z0-9]+)[^>]*>/g, '<$1>'); // 删除标签上的所有属性
|
||||
|
||||
inputHtml = inputHtml.replace(/<([a-zA-Z0-9]+)([^>]*)>/g, function (match, tag, attributes) {
|
||||
// 使用正则表达式删除属性(保留 data-latex)
|
||||
let updatedAttributes = attributes.replace(/\s([a-zA-Z0-9-]+)(="[^"]*")?/g, function (attrMatch, attrName) {
|
||||
// 只保留 data-latex 属性,其他属性删除
|
||||
if (attrName === "data-latex") {
|
||||
return attrMatch;
|
||||
}
|
||||
return ''; // 删除其他属性
|
||||
});
|
||||
|
||||
// 返回标签,保留 data-latex 属性
|
||||
return `<${tag}${updatedAttributes}>`;
|
||||
});
|
||||
// 2. 删除所有不需要的标签 (除 `strong`, `em`, `sub`, `sup`, `b`, `i` 外的所有标签)
|
||||
inputHtml = inputHtml.replace(/<(?!\/?(strong|em|sub|sup|b|i|blue))[^>]+>/g, ''); // 删除不需要的标签
|
||||
inputHtml = inputHtml.replace(/<(?!\/?(strong|em|sub|sup|b|i|blue|wmath))[^>]+>/g, ''); // 删除不需要的标签
|
||||
|
||||
// 3. 如果有 `<strong>` 和 `<em>` 标签,去掉内部样式并保留内容
|
||||
inputHtml = inputHtml.replace(/<span[^>]*>/g, '').replace(/<\/span>/g, ''); // 去除span标签
|
||||
@@ -645,62 +749,74 @@ export default {
|
||||
let tempDiv = document.createElement('div');
|
||||
tempDiv.innerHTML = content; // 解析 HTML 内容
|
||||
let paragraphs = tempDiv.querySelectorAll("p"); // 选取所有 <p> 作为数据项
|
||||
|
||||
|
||||
// 2️⃣ 将 <p> 内容转换为数组,并处理内容
|
||||
let parsedData = Array.from(paragraphs).map(p => {
|
||||
let text = p.innerHTML.trim(); // 获取内容,去除两端空格
|
||||
|
||||
text= this.transformHtmlString(text)
|
||||
// 3️⃣ **正确移除 <o:p>(Word 复制的无效标签)**
|
||||
text = text.replace(/<\/?o:p[^>]*>/g, "");
|
||||
|
||||
text = text.replace(/<\/?o:p[^>]*>/g, "");
|
||||
|
||||
// 4️⃣ **移除所有 style="..."**
|
||||
text = text.replace(/\s*style="[^"]*"/gi, "");
|
||||
|
||||
|
||||
// 5️⃣ **修正标签替换**
|
||||
text = text.replace(/<strong>/gi, "<b>").replace(/<\/strong>/gi, "</b>");
|
||||
text = text.replace(/<em>/gi, "<i>").replace(/<\/em>/gi, "</i>");
|
||||
|
||||
|
||||
// 6️⃣ **移除空的 span、b、i 标签**
|
||||
text = text.replace(/<span>\s*<\/span>/gi, "");
|
||||
text = text.replace(/<b>\s*<\/b>/gi, "");
|
||||
text = text.replace(/<i>\s*<\/i>/gi, "");
|
||||
|
||||
|
||||
// 7️⃣ **确保不移除半个标签(修复匹配规则)**
|
||||
text = text.replace(/<[^\/>]+>\s*<\/[^>]+>/gi, match => {
|
||||
return match.trim() === "" ? "" : match;
|
||||
});
|
||||
|
||||
|
||||
// 8️⃣ **返回最终内容**
|
||||
return text.trim() === "" ? "" : text;
|
||||
});
|
||||
|
||||
|
||||
console.log(parsedData); // 输出数组,方便调试
|
||||
return parsedData;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
,
|
||||
|
||||
|
||||
parseTableToArray(tableString, callback) {
|
||||
async parseTableToArray(tableString, callback) {
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(tableString, 'text/html');
|
||||
const rows = doc.querySelectorAll('table tr'); // 获取所有的行(<tr>)
|
||||
|
||||
callback(Array.from(rows).map(row => {
|
||||
const cells = row.querySelectorAll('th, td'); // 获取每个行中的单元格(包括 <th> 和 <td>)
|
||||
return Array.from(cells).map(cell => ({
|
||||
// 使用 Promise 来处理异步的 MathJax 解析
|
||||
const result = await Promise.all(
|
||||
Array.from(rows).map(async (row) => {
|
||||
const cells = row.querySelectorAll('th, td'); // 获取每个行中的单元格(包括 <th> 和 <td>)
|
||||
return await Promise.all(
|
||||
Array.from(cells).map(async (cell) => {
|
||||
const text = await this.extractMathJaxLatex(cell);
|
||||
return {
|
||||
text,
|
||||
colspan: cell.getAttribute('colspan') ? parseInt(cell.getAttribute('colspan')) : 1, // 提取 colspan,默认值为 1
|
||||
rowspan: cell.getAttribute('rowspan') ? parseInt(cell.getAttribute('rowspan')) : 1 // 提取 rowspan,默认值为 1
|
||||
};
|
||||
})
|
||||
);
|
||||
})
|
||||
);
|
||||
console.log('result at line 78611:', result)
|
||||
callback(result)
|
||||
// 返回处理后的数组
|
||||
|
||||
text: this.extractContentWithoutOuterSpan(cell),
|
||||
colspan: cell.getAttribute('colspan') ? parseInt(cell.getAttribute('colspan')) : 1, // 提取 colspan,默认值为 1
|
||||
rowspan: cell.getAttribute('rowspan') ? parseInt(cell.getAttribute('rowspan')) : 1 // 提取 rowspan,默认值为 1
|
||||
}));
|
||||
}));
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
parseNumbering(numberingDoc) {
|
||||
const numberingMap = new Map();
|
||||
if (!numberingDoc) return numberingMap;
|
||||
@@ -1834,19 +1950,14 @@ export default {
|
||||
});
|
||||
ed.ui.registry.addButton('LateX', {
|
||||
text: 'LateX', // 按钮文本
|
||||
className: 'custom-button-blue', // 添加自定义类
|
||||
// className: 'custom-button-blue', // 添加自定义类
|
||||
// shortcut: "Ctrl+J",
|
||||
onAction: function () {
|
||||
// 在选中的文本周围包裹 <blue> 标签
|
||||
// var selectedText = ed.selection.getContent();
|
||||
// console.log('selectedText at line 529:', selectedText);
|
||||
// if (selectedText) {
|
||||
// var wrappedText = `<blue>${selectedText}</blue>`;
|
||||
// ed.selection.setContent(wrappedText);
|
||||
// } else {
|
||||
// this.$message.error('请选择要添加蓝色的文本');
|
||||
// }
|
||||
}
|
||||
window.open('/LateX?id=4477', '_blank', 'width=600,height=400');
|
||||
|
||||
// 在新页面中插入 MathLive 编辑器
|
||||
// formulaWindow.document.write(``);
|
||||
}
|
||||
});
|
||||
|
||||
ed.ui.registry.addButton('myuppercase', {
|
||||
|
||||
Reference in New Issue
Block a user