Spaces:
Sleeping
Sleeping
Refactor interview parsing and answer splitting logic in Step4Report component
Browse files- Enhanced the `parseInterview` function to handle single-platform answers more effectively, ensuring default answers are set correctly.
- Improved the answer splitting logic to robustly identify numbered sections, accommodating various formats and ensuring cleaner output.
- Updated the handling of answer parts to remove unnecessary prefixes and trailing whitespace, enhancing overall readability.
frontend/src/components/Step4Report.vue
CHANGED
|
@@ -727,8 +727,16 @@ const parseInterview = (text) => {
|
|
| 727 |
interview.redditAnswer = redditMatch[1].trim()
|
| 728 |
}
|
| 729 |
|
| 730 |
-
// 如果
|
| 731 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 732 |
interview.twitterAnswer = answerText
|
| 733 |
}
|
| 734 |
}
|
|
@@ -954,37 +962,51 @@ const InterviewDisplay = {
|
|
| 954 |
const splitAnswerByQuestions = (answerText, questionCount) => {
|
| 955 |
if (!answerText || questionCount <= 0) return [answerText]
|
| 956 |
|
| 957 |
-
//
|
| 958 |
-
|
| 959 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 960 |
|
| 961 |
-
|
| 962 |
-
|
| 963 |
-
|
| 964 |
-
const
|
| 965 |
-
const
|
| 966 |
|
| 967 |
-
|
| 968 |
-
|
| 969 |
-
|
| 970 |
-
|
| 971 |
-
|
| 972 |
-
|
| 973 |
-
|
| 974 |
-
remaining = remaining.substring(splitIdx).trim()
|
| 975 |
-
} else if (i === questionCount) {
|
| 976 |
-
// 最后一个问题,取剩余所有内容
|
| 977 |
-
let currentPart = remaining.replace(new RegExp(`^\\s*${i}\\.\\s*|^\\s*${i}、|^\\s*(${i})|^\\s*\\(${i}\\)`), '').trim()
|
| 978 |
-
parts.push(currentPart)
|
| 979 |
-
}
|
| 980 |
}
|
| 981 |
|
| 982 |
-
// 如果分割
|
| 983 |
-
if (parts.length
|
| 984 |
-
return
|
| 985 |
}
|
| 986 |
|
| 987 |
-
return
|
| 988 |
}
|
| 989 |
|
| 990 |
// 获取某个问题对应的回答
|
|
|
|
| 727 |
interview.redditAnswer = redditMatch[1].trim()
|
| 728 |
}
|
| 729 |
|
| 730 |
+
// 如果只有一个平台的回答,将其作为主回答
|
| 731 |
+
// 这样无论显示哪个平台都能有内容
|
| 732 |
+
if (!twitterMatch && redditMatch) {
|
| 733 |
+
// 只有 Reddit 回答,将其也设为 twitterAnswer 作为默认显示
|
| 734 |
+
interview.twitterAnswer = interview.redditAnswer
|
| 735 |
+
} else if (twitterMatch && !redditMatch) {
|
| 736 |
+
// 只有 Twitter 回答,将其也设为 redditAnswer
|
| 737 |
+
interview.redditAnswer = interview.twitterAnswer
|
| 738 |
+
} else if (!twitterMatch && !redditMatch) {
|
| 739 |
+
// 如果没有明确分平台,整体作为回答
|
| 740 |
interview.twitterAnswer = answerText
|
| 741 |
}
|
| 742 |
}
|
|
|
|
| 962 |
const splitAnswerByQuestions = (answerText, questionCount) => {
|
| 963 |
if (!answerText || questionCount <= 0) return [answerText]
|
| 964 |
|
| 965 |
+
// 更健壮的分割逻辑:查找所有 "数字." 格式的编号位置
|
| 966 |
+
// 支持格式:
|
| 967 |
+
// - "1. \n内容" (数字+点+空格+换行+内容)
|
| 968 |
+
// - "\n\n2. \n内容" (换行+数字+点+空格+换行+内容)
|
| 969 |
+
// 使用更宽松的匹配:开头或换行后的数字+点+空白
|
| 970 |
+
const numberPattern = /(?:^|[\r\n]+)(\d+)\.\s+/g
|
| 971 |
+
const matches = []
|
| 972 |
+
let match
|
| 973 |
+
|
| 974 |
+
while ((match = numberPattern.exec(answerText)) !== null) {
|
| 975 |
+
matches.push({
|
| 976 |
+
num: parseInt(match[1]),
|
| 977 |
+
index: match.index,
|
| 978 |
+
fullMatch: match[0]
|
| 979 |
+
})
|
| 980 |
+
}
|
| 981 |
+
|
| 982 |
+
// 如果没有找到编号或只找到一个,返回整体
|
| 983 |
+
if (matches.length <= 1) {
|
| 984 |
+
// 尝试移除开头的编号(格式:1. \n 或 1. )
|
| 985 |
+
const cleaned = answerText.replace(/^\d+\.\s+/, '').trim()
|
| 986 |
+
return [cleaned || answerText]
|
| 987 |
+
}
|
| 988 |
|
| 989 |
+
// 按编号提取各部分
|
| 990 |
+
const parts = []
|
| 991 |
+
for (let i = 0; i < matches.length; i++) {
|
| 992 |
+
const current = matches[i]
|
| 993 |
+
const next = matches[i + 1]
|
| 994 |
|
| 995 |
+
const startIdx = current.index + current.fullMatch.length
|
| 996 |
+
const endIdx = next ? next.index : answerText.length
|
| 997 |
+
|
| 998 |
+
let part = answerText.substring(startIdx, endIdx).trim()
|
| 999 |
+
// 移除末尾可能的多余换行
|
| 1000 |
+
part = part.replace(/[\r\n]+$/, '').trim()
|
| 1001 |
+
parts.push(part)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1002 |
}
|
| 1003 |
|
| 1004 |
+
// 如果分割成功且数量合理,返回分割结果
|
| 1005 |
+
if (parts.length > 0 && parts.some(p => p)) {
|
| 1006 |
+
return parts
|
| 1007 |
}
|
| 1008 |
|
| 1009 |
+
return [answerText]
|
| 1010 |
}
|
| 1011 |
|
| 1012 |
// 获取某个问题对应的回答
|