- 判题结果页引入友好错误解释面板,按 verdict 类型给出提示与改进建议 - 新增 dedup_runtimeinfo() 函数将重复 RE 测试点折叠为区间汇总 - 区分管理员/源浏览者与普通用户视图,原始错误默认折叠 - 错误模式匹配扩展至 28 条,覆盖 glibc/Java/Python/Go 等常见运行时异常 - 提交页改用卡片式布局,编辑器工具栏与测试运行区交互优化 - 中英文语言文件补充相关文案与快捷操作标签 - 切换 LLM 点评 API 至 newapi.klarkxy.xyz,模型改为 minimax-m3 - 新增 .codegraph/.gitignore 忽略本地调试数据
591 lines
23 KiB
PHP
591 lines
23 KiB
PHP
<?php $show_title=$id." - $MSG_ERROR_INFO - $OJ_NAME"; ?>
|
||
<?php include("template/$OJ_TEMPLATE/header.php");?>
|
||
|
||
<script src="include/vditor-adapter.js"></script>
|
||
<script src="template/<?php echo $OJ_TEMPLATE?>/js/textFit.min.js"></script>
|
||
<style>
|
||
.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">
|
||
<?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);
|
||
?>
|
||
|
||
<!-- 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">
|
||
<?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>
|
||
|
||
<!-- 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');
|
||
$('#llm-review-loading').show();
|
||
$('#llm-review-error').hide();
|
||
$('#llm-review-result').hide();
|
||
|
||
var fullText = "";
|
||
var container = document.getElementById('llm-review-content');
|
||
var resultDiv = document.getElementById('llm-review-result');
|
||
var reader = null;
|
||
var decoder = new TextDecoder();
|
||
|
||
var sseBuffer = "";
|
||
function processSSE(text) {
|
||
sseBuffer += text;
|
||
var lines = sseBuffer.split('\n');
|
||
sseBuffer = lines.pop();
|
||
|
||
var currentEvent = "";
|
||
for (var i = 0; i < lines.length; i++) {
|
||
var line = lines[i];
|
||
if (line.indexOf('event: ') === 0) {
|
||
currentEvent = line.substring(7);
|
||
} else if (line.indexOf('data: ') === 0) {
|
||
var dataStr = line.substring(6);
|
||
try {
|
||
var data = JSON.parse(dataStr);
|
||
if (currentEvent === 'chunk') {
|
||
fullText += data.text;
|
||
container.textContent = fullText;
|
||
resultDiv.style.display = 'block';
|
||
} else if (currentEvent === 'cached') {
|
||
fullText = data.text;
|
||
container.textContent = fullText;
|
||
resultDiv.style.display = 'block';
|
||
} else if (currentEvent === 'done') {
|
||
finishReview();
|
||
} else if (currentEvent === 'error') {
|
||
showError(data.message || '未知错误');
|
||
}
|
||
} catch(e) {}
|
||
currentEvent = "";
|
||
}
|
||
}
|
||
}
|
||
|
||
function finishReview() {
|
||
btn.removeClass('loading').hide();
|
||
document.getElementById('llm-review-loading').style.display = 'none';
|
||
resultDiv.style.display = 'block';
|
||
if (fullText && typeof HustOJVditor !== 'undefined' && HustOJVditor.renderMarkdownBlocks) {
|
||
HustOJVditor.renderMarkdownBlocks('#llm-review-content', { useTextContent: true });
|
||
}
|
||
}
|
||
|
||
function showError(msg) {
|
||
btn.removeClass('loading').prop('disabled', false);
|
||
document.getElementById('llm-review-loading').style.display = 'none';
|
||
document.getElementById('llm-review-error-msg').textContent = msg;
|
||
document.getElementById('llm-review-error').style.display = 'block';
|
||
}
|
||
|
||
if (typeof fetch === 'undefined') {
|
||
showError('浏览器不支持,请升级浏览器');
|
||
return;
|
||
}
|
||
|
||
fetch('llm-review.php?sid=<?php echo intval($id); ?>')
|
||
.then(function(response) {
|
||
if (!response.ok) {
|
||
return response.text().then(function(text) {
|
||
try {
|
||
var d = JSON.parse(text);
|
||
showError(d.error || '请求失败 (HTTP ' + response.status + ')');
|
||
} catch(e) {
|
||
showError('请求失败 (HTTP ' + response.status + ')');
|
||
}
|
||
});
|
||
}
|
||
reader = response.body.getReader();
|
||
function read() {
|
||
reader.read().then(function(result) {
|
||
if (result.done) {
|
||
if (fullText) finishReview();
|
||
return;
|
||
}
|
||
var text = decoder.decode(result.value, { stream: true });
|
||
processSSE(text);
|
||
read();
|
||
}).catch(function(err) {
|
||
if (fullText) {
|
||
finishReview();
|
||
} else {
|
||
showError('读取响应失败: ' + err.message);
|
||
}
|
||
});
|
||
}
|
||
read();
|
||
})
|
||
.catch(function(err) {
|
||
showError('网络请求失败: ' + err.message);
|
||
});
|
||
}
|
||
</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> → " + 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");?>
|