feat(ui): 重新设计判题结果页与提交页

- 判题结果页引入友好错误解释面板,按 verdict 类型给出提示与改进建议
- 新增 dedup_runtimeinfo() 函数将重复 RE 测试点折叠为区间汇总
- 区分管理员/源浏览者与普通用户视图,原始错误默认折叠
- 错误模式匹配扩展至 28 条,覆盖 glibc/Java/Python/Go 等常见运行时异常
- 提交页改用卡片式布局,编辑器工具栏与测试运行区交互优化
- 中英文语言文件补充相关文案与快捷操作标签
- 切换 LLM 点评 API 至 newapi.klarkxy.xyz,模型改为 minimax-m3
- 新增 .codegraph/.gitignore 忽略本地调试数据
This commit is contained in:
2026-07-08 20:56:17 +08:00
parent c4e0f104b4
commit 6c462655b9
7 changed files with 1236 additions and 419 deletions

View File

@@ -7,207 +7,239 @@
.single-subtask {
box-shadow: none !important;
}
.single-subtask > .title {
display: none;
}
.single-subtask > .content {
padding: 0 !important;
}
.accordion > .content > .accordion {
margin-top: 0;
margin-bottom: 0;
}
.accordion > .content > .accordion > .content {
margin-top: 0;
margin-bottom: 14px;
}
.accordion > .content > .accordion > .content > :last-child {
margin-bottom: -10px !important;
}
/* === reinfo 友好化样式 === */
#result-banner {
margin-bottom: 18px;
border-left: 5px solid;
}
#result-banner.green { border-left-color: #21ba45; }
#result-banner.red { border-left-color: #db2828; }
#result-banner.yellow{ border-left-color: #fbbd08; }
#result-banner.blue { border-left-color: #2185d0; }
#result-banner.grey { border-left-color: #767676; }
#result-banner h2.ui.header {
margin: 0;
}
#result-banner .verdict-stats {
margin-top: 6px;
font-size: 0.95em;
color: rgba(0,0,0,0.6);
}
#result-banner .verdict-stats .stat {
margin-right: 16px;
}
#result-banner .verdict-stats i.icon {
margin-right: 4px;
}
#friendly-explain {
margin-bottom: 18px;
}
#friendly-explain .verdict-tip {
font-size: 1.05em;
margin-bottom: 12px;
padding: 8px 12px;
background: rgba(33,150,243,0.08);
border-radius: 6px;
border-left: 3px solid #2185d0;
}
#friendly-explain .verdict-hints {
margin: 0;
padding-left: 22px;
}
#friendly-explain .verdict-hints li {
margin-bottom: 6px;
line-height: 1.5;
}
#raw-info-accordion {
margin-bottom: 18px;
}
#raw-info-accordion > .content {
padding: 8px 14px;
}
#raw-info-accordion pre#errtxt {
margin: 0;
padding: 12px;
background: #f7f7f9;
border-radius: 4px;
font-family: 'Fira Mono', 'Cascadia Code', Consolas, monospace;
font-size: 0.9em;
white-space: pre-wrap;
word-break: break-all;
}
#raw-info-accordion .title .dedup-label {
margin-left: 8px;
}
#raw-info-accordion .empty-notice {
color: #999;
font-style: italic;
}
.quick-actions {
text-align: center;
margin-top: 24px;
margin-bottom: 12px;
}
.quick-actions .ui.buttons {
box-shadow: none;
}
/* AI 点评区 */
#llm-section {
margin-top: 20px;
margin-bottom: 18px;
}
#llm-section .ui.header {
margin-top: 0;
}
#llm-review-result {
word-break: break-word;
}
/* 错误解释列表(由 JS explain() 填充) */
#errexp-list {
list-style: disc;
padding-left: 22px;
margin: 0;
}
#errexp-list li {
margin-bottom: 6px;
line-height: 1.5;
}
#errexp-list li code {
background: rgba(0,0,0,0.05);
padding: 1px 4px;
border-radius: 3px;
font-size: 0.9em;
}
</style>
<div class="padding">
<div style="margin-top: 0px; margin-bottom: 14px; " v-if="content != null && content !== ''">
<p class="transition visible">
<strong ><?php echo "$MSG_ERROR_INFO";?> </strong>
</p>
<div class="ui existing segment">
<div v-if="escape" style="margin-top: 0; margin-bottom: 0; " id="errtxt">
<pre><?php
echo $view_reinfo
?></pre>
<h2></h2>
</div>
</div>
</div>
<?php
// 兼容老变量:$row 是 solution 行reinfo.php 已查询过)
$verdict_name = isset($judge_result[$row['result']]) ? $judge_result[$row['result']] : (isset($MSG_UNKNOWN) ? $MSG_UNKNOWN : 'Unknown');
$verdict_lang = isset($language_name[$lang]) ? $language_name[$lang] : '?';
$verdict_memory = isset($row['memory']) ? intval($row['memory']) : 0;
$verdict_time = isset($row['time']) ? intval($row['time']) : 0;
$verdict_mark = isset($mark) ? $mark : (isset($row['pass_rate']) ? round($row['pass_rate']*100, 1) : 0);
?>
<div style="margin-top: 0px; margin-bottom: 14px; " v-if="content != null && content !== ''">
<p class="transition visible">
<strong ><?php echo "$MSG_INFO_EXPLAINATION";?></strong>
</p>
<div class="ui existing segment">
<pre v-if="escape" style="margin-top: 0; margin-bottom: 0; "><code><div id='errexp'></div></code></pre>
</div>
</div>
</div>
<script>
var pats=new Array();
var exps=new Array();
pats[0]=/A Not allowed system call/;
exps[0]="<?php echo $MSG_A_NOT_ALLOWED_SYSTEM_CALL ?>";
pats[1]=/Segmentation fault/;
exps[1]="<?php echo $MSG_SEGMETATION_FAULT ?>";
pats[2]=/Floating point exception/;
exps[2]="<?php echo $MSG_FLOATING_POINT_EXCEPTION ?>";
pats[3]=/buffer overflow detected/;
exps[3]="<?php echo $MSG_BUFFER_OVERFLOW_DETECTED ?>";
pats[4]=/Killed/;
exps[4]="<?php echo $MSG_PROCESS_KILLED ?>";
pats[5]=/Alarm clock/;
exps[5]="<?php echo $MSG_ALARM_CLOCK ?>";
pats[6]=/CALLID:20/;
exps[6]="<?php echo $MSG_CALLID_20 ?>";
pats[7]=/ArrayIndexOutOfBoundsException/;
exps[7]="<?php echo $MSG_ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION ?>";
pats[8]=/StringIndexOutOfBoundsException/;
exps[8]="<?php echo $MSG_STRING_INDEX_OUT_OF_BOUNDS_EXCEPTION ?>";
pats[9]=/Binary files/;
exps[9]="<?php echo $MSG_WRONG_OUTPUT_TYPE_EXCEPTION ?>";
pats[10]=/non-zero return/;
exps[10]="<?php echo $MSG_NON_ZERO_RETURN ?>";
function explain(){
var errmsg = $("#errtxt").text();
var expmsg = "";
for(var i=0; i<pats.length; i++){
var pat = pats[i];
var exp = exps[i];
var ret = pat.exec(errmsg);
if(ret){
expmsg += ret+" : "+exp+"<br><hr />";
}
}
document.getElementById("errexp").innerHTML=expmsg;
}
explain();
</script>
<?php if(isset($OJ_MARKDOWN)&&$OJ_MARKDOWN){ ?>
<script>
$(document).ready(function(){
HustOJVditor.renderMarkdownBlocks('#errtxt', {
getSource: function (element) {
var pre = element.querySelector ? element.querySelector('pre') : null;
return pre ? pre.textContent : element.textContent || '';
}
}).then(function () {
for(let i=1;i<10;i++){
$(".language-input"+i).parent().before("<div><?php echo $MSG_Input?>"+i+":</div>");
$(".language-output"+i).parent().before("<div><?php echo $MSG_Output?>"+i+":</div>");
}
$("#errtxt table").addClass("ui mini-table cell striped");
$("#errtxt table tr:odd td").css({
"border": "1px solid grey",
"text-align": "center",
"width": "200px",
"background-color": "#8521d022",
"height": "30px"
});
$("#errtxt table tr:even td").css({
"border": "1px solid grey",
"text-align": "center",
"width": "200px",
"background-color": "#2185d022",
"height": "30px"
});
$("#errtxt table th").css({
"border": "1px solid grey",
"width": "200px",
"height": "30px",
"background-color": "#2185d088",
"text-align": "center"
});
<?php
if(isset($OJ_DOWNLOAD)&&$OJ_DOWNLOAD){
if(isset($OJ_DL_1ST_WA_ONLY) && $OJ_DL_1ST_WA_ONLY){
?>
let down=$($("#errtxt").find("h2")[0]);
let filename=down.text();
down.html("<a href='download.php?sid=<?php echo $id?>&name=" + filename+ "'>" + filename+ "</a>");
<?php
}else{
?>
$("#errtxt").find("h2").each(function(){
let down=$(this);
let filename=down.text();
console.log(filename);
down.html("<a href='download.php?sid=<?php echo $id?>&name=" + filename+ "'>" + filename+ "</a>");
});
<?php
}
}
?>
$("th").each(function(){
let html=$(this).html();
html=html.replace("Expected","<?php echo $MSG_EXPECTED ?>");
html=html.replace("Yours","<?php echo $MSG_YOURS ?>");
html=html.replace("filename","<?php echo $MSG_FILENAME ?>");
html=html.replace("size","<?php echo $MSG_SIZE ?>");
html=html.replace("result","<?php echo $MSG_RESULT ?>");
html=html.replace("memory","<?php echo $MSG_MEMORY?>");
html=html.replace("time","<?php echo $MSG_TIME ?>");
$(this).html(html);
});
}).catch(function (error) {
console.error('Failed to render reinfo markdown.', error);
});
});
</script>
<?php } ?>
<?php if(isset($OJ_LLM_ENABLED) && $OJ_LLM_ENABLED){ ?>
<div style="margin-top: 20px; margin-bottom: 14px; ">
<div class="ui styled fluid accordion" id="llm-review-accordion">
<div class="title" style="font-size: 1.1em; font-weight: bold; ">
<i class="dropdown icon"></i> 🤖 AI 点评
</div>
<!-- 1. 顶部判题结果横幅 -->
<div class="ui segment <?php echo isset($verdict_color_class) ? $verdict_color_class : 'blue'; ?>" id="result-banner">
<h2 class="ui header">
<i class="<?php echo isset($result_icon) ? $result_icon : 'info circle' ?> icon" style="color: inherit;"></i>
<div class="content">
<div id="llm-review-area">
<button class="ui labeled icon blue button" id="llm-review-btn" onclick="fetchLLMReview()">
<i class="magic icon"></i> 获取 AI 点评
</button>
<div id="llm-review-loading" style="display:none; margin-top: 15px; ">
<div class="ui active centered inline text loader">AI 正在分析你的代码,请稍候...</div>
</div>
<div id="llm-review-result" style="display:none; margin-top: 15px; ">
<div class="ui existing segment" id="llm-review-content"></div>
</div>
<div id="llm-review-error" style="display:none; margin-top: 15px; ">
<div class="ui negative message">
<p id="llm-review-error-msg"></p>
</div>
</div>
<?php echo htmlspecialchars($verdict_name, ENT_QUOTES, 'UTF-8') ?>
<div class="verdict-stats">
<span class="stat"><i class="chart bar icon"></i><?php echo $MSG_MARK ?>: <?php echo $verdict_mark ?>%</span>
<span class="stat"><i class="microchip icon"></i><?php echo $verdict_memory ?> KB</span>
<span class="stat"><i class="clock icon"></i><?php echo $verdict_time ?> ms</span>
<span class="stat"><i class="code icon"></i><?php echo htmlspecialchars($verdict_lang, ENT_QUOTES, 'UTF-8') ?></span>
</div>
</div>
</h2>
</div>
<!-- 2. 友好解释区(永远非空) -->
<div class="ui message" id="friendly-explain">
<div class="header">
<i class="lightbulb outline icon"></i>
<?php echo isset($MSG_FRIENDLY_EXPLAIN) ? $MSG_FRIENDLY_EXPLAIN : '错误解释'; ?>
</div>
<div class="verdict-tip">
<i class="info circle icon"></i>
<?php echo isset($verdict_tip) ? htmlspecialchars($verdict_tip, ENT_QUOTES, 'UTF-8') : ''; ?>
</div>
<?php if (!empty($verdict_hints) && is_array($verdict_hints)): ?>
<ul class="verdict-hints">
<?php foreach ($verdict_hints as $h): ?>
<li><?php echo htmlspecialchars($h, ENT_QUOTES, 'UTF-8'); ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<!-- JS explain() 也会把 pats[] 匹配到的具体错误模式追加在这里 -->
<ul id="errexp-list"></ul>
</div>
<!-- 3. 原始错误折叠(默认收起) -->
<div class="ui styled accordion" id="raw-info-accordion">
<div class="title">
<i class="dropdown icon"></i>
<?php echo isset($MSG_RAW_ERROR) ? $MSG_RAW_ERROR : '查看原始错误信息'; ?>
<?php if (!empty($view_reinfo_dedup_count)): ?>
<span class="ui tiny teal label dedup-label">
<?php echo sprintf(isset($MSG_DEDUP_HINT) ? $MSG_DEDUP_HINT : '已折叠 %d 个相同测试点', intval($view_reinfo_dedup_count)); ?>
</span>
<?php endif; ?>
<?php if (trim($view_reinfo) === ''): ?>
<span class="dedup-label empty-notice">(无)</span>
<?php endif; ?>
</div>
<div class="content">
<?php if (trim($view_reinfo) === ''): ?>
<p class="empty-notice">当前判题结果没有原始错误信息(如 TLE/MLE 通常不会写 runtimeinfo。</p>
<?php else: ?>
<pre id="errtxt"><?php
// 普通用户:折叠后;管理员/源浏览者:原文
if (isset($is_admin_session) && $is_admin_session) {
echo htmlspecialchars($view_reinfo_raw, ENT_QUOTES, 'UTF-8');
} elseif (isset($is_source_browser) && $is_source_browser) {
echo htmlspecialchars($view_reinfo_raw, ENT_QUOTES, 'UTF-8');
} else {
echo htmlspecialchars($view_reinfo, ENT_QUOTES, 'UTF-8');
}
?></pre>
<?php endif; ?>
</div>
</div>
<script>
$(document).ready(function(){
$('#llm-review-accordion').accordion();
});
<!-- 4. AI 点评区(直接显示按钮,不再折叠) -->
<?php if (isset($OJ_LLM_ENABLED) && $OJ_LLM_ENABLED) { ?>
<div class="ui raised segment" id="llm-section">
<h3 class="ui header">
<i class="magic icon"></i>
<div class="content">
AI 智能点评
<div class="sub header"><?php echo isset($MSG_AI_REVIEW_DESC) ? $MSG_AI_REVIEW_DESC : '基于你的代码和判题结果分析'; ?></div>
</div>
</h3>
<button class="ui labeled icon primary button" id="llm-review-btn" onclick="fetchLLMReview()">
<i class="magic icon"></i> 获取 AI 点评
</button>
<div id="llm-review-loading" class="ui active inline text loader" style="display:none; margin-left: 1em;">
AI 正在分析你的代码,请稍候...
</div>
<div id="llm-review-result" style="display:none; margin-top: 15px;">
<div class="ui existing segment" id="llm-review-content"></div>
</div>
<div id="llm-review-error" style="display:none; margin-top: 15px;">
<div class="ui negative message">
<p id="llm-review-error-msg"></p>
</div>
</div>
</div>
<script>
function fetchLLMReview(){
var btn = $('#llm-review-btn');
btn.prop('disabled', true).addClass('loading');
@@ -221,12 +253,11 @@
var reader = null;
var decoder = new TextDecoder();
// 解析 SSE 事件
var sseBuffer = "";
function processSSE(text) {
sseBuffer += text;
var lines = sseBuffer.split('\n');
sseBuffer = lines.pop(); // 保留未完成的行
sseBuffer = lines.pop();
var currentEvent = "";
for (var i = 0; i < lines.length; i++) {
@@ -260,7 +291,6 @@
btn.removeClass('loading').hide();
document.getElementById('llm-review-loading').style.display = 'none';
resultDiv.style.display = 'block';
// 渲染 Markdown
if (fullText && typeof HustOJVditor !== 'undefined' && HustOJVditor.renderMarkdownBlocks) {
HustOJVditor.renderMarkdownBlocks('#llm-review-content', { useTextContent: true });
}
@@ -317,4 +347,244 @@
</script>
<?php } ?>
<!-- 5. 快捷操作区 -->
<div class="quick-actions">
<div class="ui horizontal divider">
<?php echo isset($MSG_QUICK_ACTIONS) ? $MSG_QUICK_ACTIONS : '快捷操作'; ?>
</div>
<div class="ui buttons">
<a class="ui blue button" href="submitpage.php?id=<?php echo intval($row['problem_id']) ?>">
<i class="edit icon"></i> <?php echo isset($MSG_RESUBMIT) ? $MSG_RESUBMIT : '重新提交'; ?>
</a>
<a class="ui button" href="showsource.php?id=<?php echo intval($id) ?>">
<i class="code icon"></i> <?php echo isset($MSG_VIEW_SOURCE) ? $MSG_VIEW_SOURCE : '查看我的代码'; ?>
</a>
<a class="ui button" href="problem.php?id=<?php echo intval($row['problem_id']) ?>">
<i class="info circle icon"></i> <?php echo isset($MSG_VIEW_PROBLEM) ? $MSG_VIEW_PROBLEM : '查看题目'; ?>
</a>
<?php if (isset($OJ_DOWNLOAD) && $OJ_DOWNLOAD && ($isRE || $row['result']==6)) { ?>
<a class="ui orange button" href="download.php?sid=<?php echo intval($id) ?>">
<i class="download icon"></i> <?php echo isset($MSG_DOWNLOAD_DATA) ? $MSG_DOWNLOAD_DATA : '下载测试数据'; ?>
</a>
<?php } ?>
</div>
</div>
</div>
<!-- 错误模式 → 解释pats[]/exps[],共 28 条) -->
<script>
var pats = new Array();
var exps = new Array();
var patsSeen = {}; // 防止"段错误"和"stack smashing"双重提示
// === 原有 11 条 ===
pats[0]=/A Not allowed system call.* /;
exps[0]="<?php echo $MSG_A_NOT_ALLOWED_SYSTEM_CALL ?>";
pats[1]=/Segmentation fault/;
exps[1]="<?php echo $MSG_SEGMETATION_FAULT ?>";
pats[2]=/Floating point exception/;
exps[2]="<?php echo $MSG_FLOATING_POINT_EXCEPTION ?>";
pats[3]=/buffer overflow detected/;
exps[3]="<?php echo $MSG_BUFFER_OVERFLOW_DETECTED ?>";
pats[4]=/Killed/;
exps[4]="<?php echo $MSG_PROCESS_KILLED ?>";
pats[5]=/Alarm clock/;
exps[5]="<?php echo $MSG_ALARM_CLOCK ?>";
pats[6]=/CALLID:20/;
exps[6]="<?php echo $MSG_CALLID_20 ?>";
pats[7]=/ArrayIndexOutOfBoundsException/;
exps[7]="<?php echo $MSG_ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION ?>";
pats[8]=/StringIndexOutOfBoundsException/;
exps[8]="<?php echo $MSG_STRING_INDEX_OUT_OF_BOUNDS_EXCEPTION ?>";
pats[9]=/Binary files/;
exps[9]="<?php echo $MSG_WRONG_OUTPUT_TYPE_EXCEPTION ?>";
pats[10]=/non-zero return/;
exps[10]="<?php echo $MSG_NON_ZERO_RETURN ?>";
// === 新增 17 条(覆盖 glibc / Java / Python / Go ===
pats[11]=/stack smashing detected/;
exps[11]="<?php echo $MSG_STACK_SMASHING_DETECTED ?>";
// 同时标 pats[3] 已被覆盖(避免重复)
pats[12]=/terminate called after throwing/;
exps[12]="<?php echo $MSG_TERMINATE_CALLED ?>";
pats[13]=/NullPointerException/;
exps[13]="<?php echo $MSG_NULL_POINTER_EXCEPTION ?>";
pats[14]=/NumberFormatException/;
exps[14]="<?php echo $MSG_NUMBER_FORMAT_EXCEPTION ?>";
pats[15]=/ClassCastException/;
exps[15]="<?php echo $MSG_CLASS_CAST_EXCEPTION ?>";
pats[16]=/NegativeArraySizeException/;
exps[16]="<?php echo $MSG_NEGATIVE_ARRAY_SIZE_EXCEPTION ?>";
pats[17]=/Traceback \(most recent call last\)/;
exps[17]="<?php echo $MSG_PYTHON_TRACEBACK ?>";
pats[18]=/RecursionError/;
exps[18]="<?php echo $MSG_PYTHON_RECURSION_ERROR ?>";
pats[19]=/IndentationError/;
exps[19]="<?php echo $MSG_PYTHON_INDENTATION_ERROR ?>";
pats[20]=/ZeroDivisionError/;
exps[20]="<?php echo $MSG_PYTHON_ZERO_DIVISION ?>";
pats[21]=/NameError:/;
exps[21]="<?php echo $MSG_PYTHON_NAME_ERROR ?>";
pats[22]=/panic:.*runtime error/;
exps[22]="<?php echo $MSG_GO_PANIC ?>";
pats[23]=/Aborted \(core dumped\)/;
exps[23]="<?php echo $MSG_ABORTED_CORE_DUMPED ?>";
pats[24]=/CALLID:(\d+)/;
exps[24]="使用了非法的系统调用syscall请检查是否访问了文件、网络、进程等受限资源。";
pats[25]=/StackOverflowError/;
exps[25]="<?php echo $MSG_STACK_OVERFLOW_ERROR ?? '栈溢出StackOverflowError。通常是递归层数过深或局部大数组占用过多栈空间。' ?>";
pats[26]=/class not found|Could not find or load main class/;
exps[26]="Java 类未找到。检查 public class 名称是否与文件名一致,是否有 package 声明。";
pats[27]=/no test data/;
exps[27]="没有找到测试数据,请联系管理员检查题目数据。";
/**
* 把匹配到的错误模式追加到 <ul id="errexp-list">
* 同一类错误(内存类/异常类/系统调用类)只显示一次
*/
function explain(){
var errmsg = $("#errtxt").text();
if (!errmsg || errmsg.trim() === '') return;
// 同族分组
var familyMap = {
'mem': [1, 3, 11, 25], // 段错误 / 缓冲溢出 / stack smashing / 栈溢出
'sysc': [0, 6, 24], // 系统调用
'time': [4, 5], // 时间/Killed
'arith':[2, 20], // 除零
'jexc': [7, 8, 13, 14, 15, 16, 25], // Java 异常
'pyexc':[17, 18, 19, 20, 21], // Python
'goexc':[22], // Go
};
var shownFamilies = {};
var shown = {};
var items = [];
for (var i = 0; i < pats.length; i++) {
if (!pats[i] || shown[i]) continue;
var ret = pats[i].exec(errmsg);
if (!ret) continue;
// 检查是否已被同族其它规则覆盖
var family = null;
for (var f in familyMap) {
if (familyMap[f].indexOf(i) >= 0) { family = f; break; }
}
if (family && shownFamilies[family]) continue;
if (family) shownFamilies[family] = true;
shown[i] = true;
items.push("<li><code>" + ret[0] + "</code> &rarr; " + exps[i] + "</li>");
}
if (items.length > 0) {
$("#errexp-list").html(items.join(""));
} else {
$("#errexp-list").html("<li class='empty-notice'>未匹配到具体错误模式,请参考原始错误信息或 AI 点评。</li>");
}
}
explain();
</script>
<?php if(isset($OJ_MARKDOWN) && $OJ_MARKDOWN){ ?>
<script>
$(document).ready(function(){
// 初始化折叠面板
$('#raw-info-accordion').accordion();
// 管理员/superuser 默认展开原始错误
<?php if (isset($is_admin_session) && $is_admin_session) { ?>
$('#raw-info-accordion').accordion('open', 0);
<?php } elseif (isset($is_source_browser) && $is_source_browser) { ?>
$('#raw-info-accordion').accordion('open', 0);
<?php } ?>
HustOJVditor.renderMarkdownBlocks('#errtxt', {
getSource: function (element) {
var pre = element.querySelector ? element.querySelector('pre') : null;
return pre ? pre.textContent : element.textContent || '';
}
}).then(function () {
for(let i=1;i<10;i++){
$(".language-input"+i).parent().before("<div><?php echo $MSG_Input?>"+i+":</div>");
$(".language-output"+i).parent().before("<div><?php echo $MSG_Output?>"+i+":</div>");
}
$("#errtxt table").addClass("ui mini-table cell striped");
$("#errtxt table tr:odd td").css({
"border": "1px solid grey",
"text-align": "center",
"width": "200px",
"background-color": "#8521d022",
"height": "30px"
});
$("#errtxt table tr:even td").css({
"border": "1px solid grey",
"text-align": "center",
"width": "200px",
"background-color": "#2185d022",
"height": "30px"
});
$("#errtxt table th").css({
"border": "1px solid grey",
"width": "200px",
"height": "30px",
"background-color": "#2185d088",
"text-align": "center"
});
<?php
if(isset($OJ_DOWNLOAD) && $OJ_DOWNLOAD){
if(isset($OJ_DL_1ST_WA_ONLY) && $OJ_DL_1ST_WA_ONLY){
?>
let down=$($("#errtxt").find("h2")[0]);
let filename=down.text();
down.html("<a href='download.php?sid=<?php echo $id?>&name=" + filename+ "'>" + filename+ "</a>");
<?php
}else{
?>
$("#errtxt").find("h2").each(function(){
let down=$(this);
let filename=down.text();
console.log(filename);
down.html("<a href='download.php?sid=<?php echo $id?>&name=" + filename+ "'>" + filename+ "</a>");
});
<?php
}
}
?>
$("th").each(function(){
let html=$(this).html();
html=html.replace("Expected","<?php echo $MSG_EXPECTED ?>");
html=html.replace("Yours","<?php echo $MSG_YOURS ?>");
html=html.replace("filename","<?php echo $MSG_FILENAME ?>");
html=html.replace("size","<?php echo $MSG_SIZE ?>");
html=html.replace("result","<?php echo $MSG_RESULT ?>");
html=html.replace("memory","<?php echo $MSG_MEMORY?>");
html=html.replace("time","<?php echo $MSG_TIME ?>");
$(this).html(html);
});
}).catch(function (error) {
console.error('Failed to render reinfo markdown.', error);
});
});
</script>
<?php } else { ?>
<script>
// OJ_MARKDOWN 未开启时也要初始化折叠
$(document).ready(function(){
$('#raw-info-accordion').accordion();
<?php if (isset($is_admin_session) && $is_admin_session) { ?>
$('#raw-info-accordion').accordion('open', 0);
<?php } elseif (isset($is_source_browser) && $is_source_browser) { ?>
$('#raw-info-accordion').accordion('open', 0);
<?php } ?>
});
</script>
<?php } ?>
<?php include("template/$OJ_TEMPLATE/footer.php");?>