|
@@ -149,37 +149,8 @@
|
|
|
$stemLine = trim($stemMatch[1]);
|
|
$stemLine = trim($stemMatch[1]);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- // 将题干中的空括号/下划线替换为短波浪线;如无占位符,则在末尾追加短波浪线
|
|
|
|
|
- $blankSpan = '<span style="display:inline-block; min-width:80px; border-bottom:1.2px dashed #444; vertical-align:bottom;"> </span>';
|
|
|
|
|
- // 【修复】扩展下划线转换规则,支持LaTeX格式和多种占位符
|
|
|
|
|
- $renderedStem = $stemLine;
|
|
|
|
|
- // 先处理LaTeX格式的underline命令
|
|
|
|
|
- $renderedStem = preg_replace('/\\\underline\{[^}]*\}/', $blankSpan, $renderedStem);
|
|
|
|
|
- $renderedStem = preg_replace('/\\\qquad+/', $blankSpan, $renderedStem);
|
|
|
|
|
- // 【修复】在处理填空占位符时,保护LaTeX公式不被破坏
|
|
|
|
|
- // 先标记LaTeX公式区域
|
|
|
|
|
- $latexPlaceholders = [];
|
|
|
|
|
- $counter = 0;
|
|
|
|
|
- $renderedStem = preg_replace_callback('/\$[^$]+\$/u', function($matches) use (&$latexPlaceholders, &$counter, $blankSpan) {
|
|
|
|
|
- $placeholder = '<<<LATEX_' . $counter . '>>>';
|
|
|
|
|
- $latexPlaceholders[$placeholder] = $matches[0];
|
|
|
|
|
- $counter++;
|
|
|
|
|
- return $placeholder;
|
|
|
|
|
- }, $renderedStem);
|
|
|
|
|
-
|
|
|
|
|
- // 现在处理普通占位符(不会破坏LaTeX公式)
|
|
|
|
|
- $renderedStem = preg_replace(['/(\s*)/u', '/\(\s*\)/', '/_{2,}/'], $blankSpan, $renderedStem);
|
|
|
|
|
-
|
|
|
|
|
- // 恢复LaTeX公式(并进行HTML实体编码防止被浏览器解析)
|
|
|
|
|
- foreach ($latexPlaceholders as $placeholder => $latexContent) {
|
|
|
|
|
- $encodedLatex = htmlspecialchars($latexContent, ENT_QUOTES | ENT_HTML5, 'UTF-8');
|
|
|
|
|
- $renderedStem = str_replace($placeholder, $encodedLatex, $renderedStem);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 如果没有占位符,在末尾添加
|
|
|
|
|
- if ($renderedStem === $stemLine) {
|
|
|
|
|
- $renderedStem .= ' ' . $blankSpan;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 选择题只做占位符归一,不再兜底追加下划线,避免出现“( )+下划线”重复。
|
|
|
|
|
+ [$renderedStem] = \App\Support\BlankPlaceholderRenderer::replaceToBlankSpan($stemLine, null, true);
|
|
|
$renderedStem = $mathProcessed ? $renderedStem : \App\Services\MathFormulaProcessor::processFormulas($renderedStem);
|
|
$renderedStem = $mathProcessed ? $renderedStem : \App\Services\MathFormulaProcessor::processFormulas($renderedStem);
|
|
|
@endphp
|
|
@endphp
|
|
|
<div class="question">
|
|
<div class="question">
|
|
@@ -312,32 +283,10 @@
|
|
|
@php
|
|
@php
|
|
|
// 【修复】使用question_number字段作为显示序号,确保全局序号一致性
|
|
// 【修复】使用question_number字段作为显示序号,确保全局序号一致性
|
|
|
$questionNumber = $q->question_number ?? (count($choiceQuestions) + $index + 1);
|
|
$questionNumber = $q->question_number ?? (count($choiceQuestions) + $index + 1);
|
|
|
- $blankSpan = '<span style="display:inline-block; min-width:80px; border-bottom:1.2px dashed #444; vertical-align:bottom;"> </span>';
|
|
|
|
|
- // 【修复】扩展下划线转换规则,支持LaTeX格式和多种占位符
|
|
|
|
|
- $renderedContent = $q->content;
|
|
|
|
|
- // 【修复】在处理填空占位符时,保护LaTeX公式不被破坏
|
|
|
|
|
- // 先标记LaTeX公式区域(支持包含反斜杠和花括号的LaTeX命令)
|
|
|
|
|
- $latexPlaceholders = [];
|
|
|
|
|
- $counter = 0;
|
|
|
|
|
- $renderedContent = preg_replace_callback('/\$(?:[^\$]|\\.)*\$/u', function($matches) use (&$latexPlaceholders, &$counter, $blankSpan) {
|
|
|
|
|
- $placeholder = '<<<LATEX_FILL_' . $counter . '>>>';
|
|
|
|
|
- $latexPlaceholders[$placeholder] = $matches[0];
|
|
|
|
|
- $counter++;
|
|
|
|
|
- return $placeholder;
|
|
|
|
|
- }, $renderedContent);
|
|
|
|
|
-
|
|
|
|
|
- // 现在处理普通占位符(不会破坏LaTeX公式)
|
|
|
|
|
- $renderedContent = preg_replace(['/(\s*)/u', '/\(\s*\)/', '/_{2,}/'], $blankSpan, $renderedContent);
|
|
|
|
|
-
|
|
|
|
|
- // 恢复LaTeX公式(并进行HTML实体编码防止被浏览器解析)
|
|
|
|
|
- foreach ($latexPlaceholders as $placeholder => $latexContent) {
|
|
|
|
|
- $encodedLatex = htmlspecialchars($latexContent, ENT_QUOTES | ENT_HTML5, 'UTF-8');
|
|
|
|
|
- $renderedContent = str_replace($placeholder, $encodedLatex, $renderedContent);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 如果没有占位符且内容没有变化,在末尾添加
|
|
|
|
|
- // 但要检查是否已经有填空占位符(如\underline{\qquad})
|
|
|
|
|
- if ($renderedContent === $q->content && !preg_match('/\\\\underline|\\\\qquad|(\s*)|\(\s*\)/', $renderedContent)) {
|
|
|
|
|
|
|
+ $blankSpan = \App\Support\BlankPlaceholderRenderer::defaultBlankSpan();
|
|
|
|
|
+ [$renderedContent, $hasPlaceholders] = \App\Support\BlankPlaceholderRenderer::replaceToBlankSpan((string) $q->content, $blankSpan, false);
|
|
|
|
|
+ // 填空题保留兜底:题干无任何占位时,在末尾补一个标准空位。
|
|
|
|
|
+ if (!$hasPlaceholders) {
|
|
|
$renderedContent .= ' ' . $blankSpan;
|
|
$renderedContent .= ' ' . $blankSpan;
|
|
|
}
|
|
}
|
|
|
$renderedContent = $mathProcessed ? $renderedContent : \App\Services\MathFormulaProcessor::processFormulas($renderedContent);
|
|
$renderedContent = $mathProcessed ? $renderedContent : \App\Services\MathFormulaProcessor::processFormulas($renderedContent);
|