diff --git a/src/components/MCTextFormatter.vue b/src/components/MCTextFormatter.vue index 6a30726..a1dc31b 100644 --- a/src/components/MCTextFormatter.vue +++ b/src/components/MCTextFormatter.vue @@ -251,6 +251,8 @@ export default { // this.isDarkMode = !this.isDarkMode; }; + const colorCodeSymbol = '§'; + const formatText = () => { let formatted = rawText.value; for (let braceCode in colorsBrace.value) { @@ -266,48 +268,63 @@ export default { underline: false, strikethrough: false, }; + let newState = { ...state }; let output = ""; - let i = 0; + let contentBuffer = ""; + + // 应用样式到缓冲内容,并重置缓冲 + const applyStylesAndResetBuffer = () => { + if (contentBuffer) { + let spanStart = ``; + output += spanStart + contentBuffer + ""; + contentBuffer = ""; // 重置内容缓冲 + } + }; - while (i < formatted.length) { - if (formatted[i] === '§') { + for (let i = 0; i < rawText.value.length; i++) { + if (rawText.value[i] === '§') { i++; // 跳过 '§' - let colorTag = ''; - switch (formatted[i]) { + switch (rawText.value[i]) { case 'r': - state = { color: "", bold: false, italic: false, underline: false, strikethrough: false }; + newState = { color: "", bold: false, italic: false, underline: false, strikethrough: false }; break; case 'l': - state.bold = true; + newState.bold = true; break; case 'o': - state.italic = true; + newState.italic = true; break; case 'n': - state.underline = true; + newState.underline = true; break; case 'm': - state.strikethrough = true; + newState.strikethrough = true; break; default: - colorTag = `§${formatted[i]}`; - state.color = colors.value[colorTag] || state.color; + newState.color = colors.value[`${colorCodeSymbol}${rawText.value[i]}`] || newState.color; break; } - } else if (formatted[i] === '\n') { + } else if (rawText.value[i] === '\n') { + applyStylesAndResetBuffer(); // 应用样式并清空缓冲 output += "
"; } else { - let spanStart = ``; - output += spanStart + formatted[i] + ""; + contentBuffer += rawText.value[i]; // 加入当前字符到缓冲 + } + + // 检查状态是否改变 + if (JSON.stringify(state) !== JSON.stringify(newState)) { + applyStylesAndResetBuffer(); // 应用当前样式并重置缓冲 + state = { ...newState }; // 更新当前状态为新状态 } - i++; } + applyStylesAndResetBuffer(); // 确保最后的缓冲内容被应用 + formattedText.value = output; };