Răsfoiți Sursa

页面错乱的问题修复

yemeishu 2 ore în urmă
părinte
comite
a753641ad3
1 a modificat fișierele cu 49 adăugiri și 8 ștergeri
  1. 49 8
      resources/views/components/exam/paper-body.blade.php

+ 49 - 8
resources/views/components/exam/paper-body.blade.php

@@ -146,8 +146,27 @@
             // 先处理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;
             }
@@ -200,9 +219,14 @@
                     <div class="question-lead spacer"></div>
                     <div class="{{ $optionsClass }}">
                         @foreach($options as $optIndex => $opt)
-                            @php $label = chr(65 + (int)$optIndex); @endphp
+                            @php
+                                $label = chr(65 + (int)$optIndex);
+                                // 对LaTeX公式中的特殊字符进行HTML实体编码,防止被浏览器当作HTML标签处理
+                                $encodedOpt = htmlspecialchars($opt, ENT_QUOTES | ENT_HTML5, 'UTF-8');
+                                $renderedOpt = $mathProcessed ? $encodedOpt : \App\Services\MathFormulaProcessor::processFormulas($encodedOpt);
+                            @endphp
                             <div class="option option-compact">
-                                <strong>{{ $label }}.</strong>&nbsp;{!! $mathProcessed ? $opt : \App\Services\MathFormulaProcessor::processFormulas($opt) !!}
+                                <strong>{{ $label }}.</strong>&nbsp;{!! $renderedOpt !!}
                             </div>
                         @endforeach
                     </div>
@@ -254,12 +278,29 @@
             $blankSpan = '<span style="display:inline-block; min-width:80px; border-bottom:1.2px dashed #444; vertical-align:bottom;">&nbsp;</span>';
             // 【修复】扩展下划线转换规则,支持LaTeX格式和多种占位符
             $renderedContent = $q->content;
-            // 先处理LaTeX格式的underline命令
-            $renderedContent = preg_replace('/\\\underline\{[^}]*\}/', $blankSpan, $renderedContent);
-            $renderedContent = preg_replace('/\\\qquad+/', $blankSpan, $renderedContent);
-            // 再处理普通占位符
+            // 【修复】在处理填空占位符时,保护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);
-            if ($renderedContent === $q->content) {
+
+            // 恢复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)) {
                 $renderedContent .= ' ' . $blankSpan;
             }
             $renderedContent = $mathProcessed ? $renderedContent : \App\Services\MathFormulaProcessor::processFormulas($renderedContent);