Add a copy button to markdown code blocks in the problem view for easier code snippet copying. The button appears in the top-right corner of code blocks and provides visual feedback on copy success or failure. This improves user experience by eliminating the need to manually select and copy code.
775 lines
28 KiB
PHP
775 lines
28 KiB
PHP
<?php
|
||
if ($pr_flag) {
|
||
$show_title = "P$id - " . $row['title'] . " - $OJ_NAME";
|
||
} else {
|
||
$id = $row['problem_id'];
|
||
$show_title = "$MSG_PROBLEM " . $PID[$pid] . ": " . $row['title'] . " - $OJ_NAME";
|
||
}
|
||
?>
|
||
<?php include("template/$OJ_TEMPLATE/header.php"); ?>
|
||
<style>
|
||
.ace_cursor {
|
||
border-left-width: 1px !important;
|
||
color: #000 !important;
|
||
}
|
||
|
||
#languages-menu::-webkit-scrollbar,
|
||
#testcase-menu::-webkit-scrollbar {
|
||
width: 0px;
|
||
background: transparent;
|
||
}
|
||
|
||
div[class*=ace_br] {
|
||
border-radius: 0 !important;
|
||
}
|
||
|
||
.copy {
|
||
font-size: 12px;
|
||
color: #4d4d4d;
|
||
background-color: white;
|
||
padding: 2px 8px;
|
||
margin: 8px;
|
||
border-radius: 4px;
|
||
cursor: pointer;
|
||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05), 0 2px 4px rgba(0, 0, 0, 0.05);
|
||
}
|
||
|
||
.md pre {
|
||
position: relative;
|
||
}
|
||
|
||
.md-code-copy {
|
||
position: absolute;
|
||
top: 8px;
|
||
right: 8px;
|
||
z-index: 1;
|
||
font-size: 12px;
|
||
color: #4d4d4d;
|
||
background-color: #fff;
|
||
border: 1px solid #e0e0e0;
|
||
padding: 2px 8px;
|
||
border-radius: 4px;
|
||
cursor: pointer;
|
||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
||
}
|
||
|
||
.md-code-copy:hover {
|
||
background-color: #f5f5f5;
|
||
}
|
||
</style>
|
||
<script src="<?php echo $OJ_CDN_URL . $path_fix . "template/$OJ_TEMPLATE/" ?>clipboard.min.js"></script>
|
||
<script src="<?php echo $OJ_CDN_URL . $path_fix . "template/bs3/" ?>marked.min.js"></script>
|
||
<script src="<?php echo $OJ_CDN_URL . $path_fix . "template/syzoj/js/" ?>markdown-it.min.js"></script>
|
||
|
||
<div class="padding ">
|
||
<div class="ui center aligned grid">
|
||
<div class="row">
|
||
<h1 class="ui header">
|
||
<?php
|
||
if ($pr_flag) {
|
||
echo "$id: " . $row['title'];
|
||
// <%= problem.title %><% if (problem.allowedEdit && !problem.is_public) { %><span class="ui tiny red label">未公开</span><% } %>";
|
||
//echo "<title>$MSG_PROBLEM".$row['problem_id']."--". $row['title']."</title>";
|
||
//echo "<center><h2><strong>$id: ".$row['title']."</strong></h2>";
|
||
} else {
|
||
$id = $row['problem_id'];
|
||
//echo "<title>$MSG_PROBLEM ".$PID[$pid].": ".$row['title']." </title>";
|
||
echo "$MSG_PROBLEM " . $PID[$pid] . ": " . $row['title'];
|
||
}
|
||
if ($row['defunct'] == "Y")
|
||
echo "<span class=\"p-label ui tiny red label\">$MSG_RESERVED</span>";
|
||
?>
|
||
</h1>
|
||
</div>
|
||
<div class="row" style="margin-top: -15px">
|
||
<span class="ui label"><?php echo $MSG_Memory_Limit ?>:<?php echo $row['memory_limit']; ?> MB</span>
|
||
<span class="ui label"><?php echo $MSG_Time_Limit ?>:<?php echo $row['time_limit']; ?> S</span>
|
||
<!-- <span class="ui label">标准输入输出</span> -->
|
||
</div>
|
||
<div class="row" style="margin-top: -23px">
|
||
<!-- <span class="ui label">题目类型:传统</span> -->
|
||
<span
|
||
class="ui label"><?php echo $MSG_JUDGE_STYLE ?>:<?php echo array($MSG_NJ, $MSG_SPJ, $MSG_RTJ)[$row['spj']]; ?>
|
||
</span>
|
||
<span class="ui label"><?php echo $MSG_Creator ?>:<span id='creator'></span></span>
|
||
</div>
|
||
<div class="row" style="margin-top: -23px">
|
||
<span class="ui label"><?php echo $MSG_SUBMIT ?>:<?php echo $row['submit']; ?></span>
|
||
<span class="ui label"><?php echo $MSG_SOVLED ?>:<?php echo $row['accepted']; ?></span>
|
||
</div>
|
||
</div>
|
||
<div class="ui grid">
|
||
<div class="row" id="submit-buttons">
|
||
<div class="column">
|
||
<div class="ui buttons">
|
||
|
||
<?php
|
||
if ($pr_flag) {
|
||
echo "<a id='submit' class=\"small ui primary button\" href=\"submitpage.php?id=$id\">$MSG_SUBMIT</a>";
|
||
echo "<a class=\"small ui positive button\" href=\"status.php?problem_id=$id\">$MSG_SUBMIT_RECORD</a>";
|
||
echo "<a class=\"small ui orange button\" href=\"problemstatus.php?id=$id\">$MSG_STATISTICS</a>";
|
||
if ($OJ_BBS)
|
||
echo "<a class=\"small ui red button\" href=\"discuss.php?pid=$id\">$MSG_BBS</a>";
|
||
} else {
|
||
echo "<a href=\"contest.php?cid=$cid\" class=\"ui orange button\">$MSG_RETURN_CONTEST</a>";
|
||
if ($contest_is_over)
|
||
echo "<a id='submit' class=\"small ui primary button\" href=\"submitpage.php?id=$id\">$MSG_SUBMIT</a>";
|
||
else
|
||
echo "<a id='submit' class=\"small ui primary button\" href=\"submitpage.php?cid=$cid&pid=$pid&langmask=$langmask\">$MSG_SUBMIT</a>";
|
||
echo "<a class=\"small ui positive button\" href=\"status.php?problem_id=$id\">$MSG_GLOBAL$MSG_SUBMIT_RECORD</a>";
|
||
echo "<a class=\"small ui orange button\" href=\"status.php?problem_id=$PID[$pid]&cid=$cid\">$MSG_THIS_CONTEST$MSG_SUBMIT_RECORD</a>";
|
||
|
||
}
|
||
if (!file_exists($OJ_DATA . "/" . $id . "/solution.name"))
|
||
echo "<a class='small ui primary button' href='#' onclick='transform()' role='button'>$MSG_SHOW_OFF</a>";
|
||
?>
|
||
|
||
</div>
|
||
|
||
<?php
|
||
if (isset($_SESSION[$OJ_NAME . '_' . 'administrator']) || isset($_SESSION[$OJ_NAME . '_' . "p" . $row['problem_id']])) { //only the original editor can edit this problem
|
||
|
||
require_once("include/set_get_key.php");
|
||
?>
|
||
|
||
<div class="ui buttons right floated">
|
||
<a class="small ui button"
|
||
href="admin/problem_edit.php?id=<?php echo $id ?>&getkey=<?php echo $_SESSION[$OJ_NAME . '_' . 'getkey'] ?>"><?php echo $MSG_EDIT . $MSG_PROBLEM ?></a>
|
||
<a class="small ui button"
|
||
href='javascript:phpfm(<?php echo $row['problem_id']; ?>)'><?php echo $MSG_TEST_DATA ?></a>
|
||
</div>
|
||
<?php } ?>
|
||
</div>
|
||
</div>
|
||
<?php
|
||
function trans_md($str)
|
||
{
|
||
$s = $str;
|
||
// $s = bbcode_to_html($s);
|
||
if (
|
||
strpos($s, "class='md") === false &&
|
||
strpos($s, "class=\"md") === false
|
||
) // 没找到,那就加上
|
||
$s = "<span class='md'>" . $s . "</span>";
|
||
// 删除代码块里的html字符防止引起混乱
|
||
$s = preg_replace_callback('/(```.*?```|`[^`]*`)/s', function ($matches) {
|
||
$ss = str_replace('<br />', '', $matches[0]);
|
||
return $ss;
|
||
}, $s);
|
||
// 特殊转义
|
||
$s = str_replace("<br />", "\n", $s);
|
||
// 把<pre></pre>中间的html字符转成原始字符
|
||
$s = preg_replace_callback('/<pre>(.*?)<\/pre>/s', function ($matches) {
|
||
$content = $matches[1];
|
||
$content = htmlspecialchars_decode($content, ENT_QUOTES);
|
||
$content = str_replace("<", "<", $content);
|
||
$content = str_replace(">", ">", $content);
|
||
$content = str_replace("&", "&", $content);
|
||
$content = str_replace(""", "\"", $content);
|
||
$content = str_replace("'", "'", $content);
|
||
return "<pre>" . $content . "</pre>";
|
||
}, $s);
|
||
return $s;
|
||
}
|
||
?>
|
||
<div class="row">
|
||
<div class="column">
|
||
<h4 class="ui top attached block header"><?php echo $MSG_Description ?></h4>
|
||
<div id="description" class="ui bottom attached segment font-content">
|
||
<?php
|
||
// echo $row['description'];
|
||
echo trans_md($row['description']);
|
||
if (isset($_SESSION[$OJ_NAME . '_' . 'administrator']) || isset($_SESSION[$OJ_NAME . '_' . "p" . $row['problem_id']])) {
|
||
// 管理员增加一个显示源数据
|
||
echo '<div class="ui accordion" style="margin-top: 15px;">
|
||
<div class="title">
|
||
<i class="dropdown icon"></i>
|
||
Markdown原文
|
||
</div>
|
||
<div class="content">
|
||
<pre style="overflow: auto; max-height: 300px; border: 1px solid #ddd; padding: 10px; background-color: #f5f5f5;">' .
|
||
$row['description'] .
|
||
'</pre>
|
||
</div>
|
||
</div>';
|
||
}
|
||
?>
|
||
<script>
|
||
$(document).ready(function() {
|
||
$('.ui.accordion').accordion();
|
||
});
|
||
</script>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php if ($row['input'] || isset($_GET['spa'])) { ?>
|
||
<div class="row">
|
||
<div class="column">
|
||
<h4 class="ui top attached block header"><?php echo $MSG_Input ?></h4>
|
||
<div id='input' class="ui bottom attached segment font-content">
|
||
<?php
|
||
echo trans_md($row['input']);
|
||
?>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php } ?>
|
||
<?php if ($row['output'] || isset($_GET['spa'])) { ?>
|
||
<div class="row">
|
||
<div class="column">
|
||
<h4 class="ui top attached block header"><?php echo $MSG_Output ?></h4>
|
||
<div id='output' class="ui bottom attached segment font-content">
|
||
<?php
|
||
echo trans_md($row['output']);
|
||
?>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php } ?>
|
||
|
||
<?php
|
||
$sinput = str_replace("<", "<", $row['sample_input']);
|
||
$sinput = str_replace(">", ">", $sinput);
|
||
$soutput = str_replace("<", "<", $row['sample_output']);
|
||
$soutput = str_replace(">", ">", $soutput);
|
||
?>
|
||
<?php if (strlen($sinput) > 0 && $sinput != "\n" || isset($_GET['spa'])) { ?>
|
||
<div class="row">
|
||
<div class="column">
|
||
<h4 class="ui top attached block header"><?php echo $MSG_Sample_Input ?>
|
||
<span class="copy" id="copyin"
|
||
data-clipboard-text="<?php echo htmlentities($sinput, ENT_QUOTES, 'UTF-8'); ?>"><?php echo $MSG_COPY; ?></span>
|
||
</h4>
|
||
<!-- <span class=copy id=\"copyin\" data-clipboard-text=\"".($sinput)."\"><?php echo $MSG_COPY; ?></span> -->
|
||
<div class="ui bottom attached segment font-content">
|
||
<!-- <pre><?php echo ($sinput); ?></pre> -->
|
||
<pre
|
||
style="margin-top: 0; margin-bottom: 0; "><code id='sinput' class="lang-plain"><?php echo ($sinput); ?></code></pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php } ?>
|
||
<?php if (strlen($soutput) > 0 && $soutput != "\n" || isset($_GET['spa'])) { ?>
|
||
<div class="row">
|
||
<div class="column">
|
||
<h4 class="ui top attached block header"><?php echo $MSG_Sample_Output ?>
|
||
<span class="copy" id="copyout"
|
||
data-clipboard-text="<?php echo htmlentities($soutput, ENT_QUOTES, 'UTF-8'); ?>"><?php echo $MSG_COPY; ?></span>
|
||
</h4>
|
||
<!-- <span class=copy id=\"copyout\" data-clipboard-text=\"".($soutput)."\"><?php echo $MSG_COPY; ?></span> -->
|
||
<div class="ui bottom attached segment font-content">
|
||
<!-- <div class="ui existing segment"> -->
|
||
<pre
|
||
style="margin-top: 0; margin-bottom: 0; "><code id='soutput' class="lang-plain"><?php echo ($soutput); ?></code></pre>
|
||
<!-- </div> -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php } ?>
|
||
<?php if ($row['hint'] || isset($_GET['spa'])) { ?>
|
||
<div class="row">
|
||
<div class="column">
|
||
<h4 class="ui top attached block header"><?php echo $MSG_HINT ?></h4>
|
||
<div id='hint' class="ui bottom attached segment font-content hint">
|
||
<?php
|
||
echo trans_md($row['hint']);
|
||
?>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php } ?>
|
||
<?php
|
||
$color = array("blue", "teal", "orange", "pink", "olive", "red", "violet", "yellow", "green", "purple");
|
||
$tcolor = 0;
|
||
?>
|
||
<?php if ($row['source'] && !isset($_GET['cid'])) {
|
||
$cats = explode(" ", $row['source']);
|
||
?>
|
||
<div class="row">
|
||
<div class="column">
|
||
<h4 class="ui block header top attached" id="show_tag_title_div"
|
||
style="margin-bottom: 0; margin-left: -1px; margin-right: -1px; ">
|
||
<?php echo $MSG_SOURCE ?>
|
||
</h4>
|
||
<div class="ui bottom attached segment" id="show_tag_div">
|
||
|
||
<?php foreach ($cats as $cat) {
|
||
if (trim($cat) == "")
|
||
continue;
|
||
$label_theme = $color[$tcolor % count($color)];
|
||
$tcolor++;
|
||
?>
|
||
<a href="<?php
|
||
if (mb_ereg("^http", $cat)) // remote oj pop links
|
||
echo htmlentities($cat, ENT_QUOTES, 'utf-8') . '" target="_blank';
|
||
else
|
||
echo "problemset.php?search=" . urlencode(htmlentities($cat, ENT_QUOTES, 'utf-8'));
|
||
?>" class="ui medium <?php echo $label_theme; ?> label">
|
||
<?php echo htmlentities($cat, ENT_QUOTES, 'utf-8'); ?>
|
||
</a>
|
||
<?php } ?>
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
<?php } ?>
|
||
|
||
<div class="ui buttons">
|
||
|
||
<?php
|
||
if ($pr_flag) {
|
||
echo "<a id='submit' class=\"small ui primary button\" href=\"submitpage.php?id=$id\">$MSG_SUBMIT</a>";
|
||
echo "<a class=\"small ui positive button\" href=\"status.php?problem_id=$id\">$MSG_SUBMIT_RECORD</a>";
|
||
echo "<a class=\"small ui orange button\" href=\"problemstatus.php?id=$id\">$MSG_STATISTICS</a>";
|
||
if ($OJ_BBS)
|
||
echo "<a class=\"small ui red button\" href=\"discuss.php?pid=$id\">$MSG_BBS</a>";
|
||
} else {
|
||
echo "<a href=\"contest.php?cid=$cid\" class=\"ui orange button\">$MSG_RETURN_CONTEST</a>";
|
||
if ($contest_is_over)
|
||
echo "<a id='submit' class=\"small ui primary button\" href=\"submitpage.php?id=$id\">$MSG_SUBMIT</a>";
|
||
else
|
||
echo "<a id='submit' class=\"small ui primary button\" href=\"submitpage.php?cid=$cid&pid=$pid&langmask=$langmask\">$MSG_SUBMIT</a>";
|
||
echo "<a class=\"small ui positive button\" href=\"status.php?problem_id=$PID[$pid]&cid=$cid\">$MSG_SUBMIT_RECORD</a>";
|
||
}
|
||
if (!file_exists($OJ_DATA . "/" . $id . "/solution.name"))
|
||
echo "<a class='small ui primary button' href='#' onclick='transform()' role='button'>$MSG_SHOW_OFF</a>";
|
||
?>
|
||
|
||
</div>
|
||
</div>
|
||
<style>
|
||
#dragButton {
|
||
width: 10px;
|
||
height: 10%;
|
||
background-color: gray;
|
||
position: absolute;
|
||
top: 350px;
|
||
left: 0;
|
||
cursor: col-resize;
|
||
/* 显示可调整宽度的光标 */
|
||
}
|
||
</style>
|
||
<script type="text/javascript">
|
||
|
||
function transform() {
|
||
let height = document.body.clientHeight;
|
||
<?php if ($row['spj'] == 2) { ?>
|
||
let width = parseInt(document.body.clientWidth * 0.3);
|
||
let width2 = parseInt(document.body.clientWidth * 0.7);
|
||
<?php } else { ?>
|
||
let width = parseInt(document.body.clientWidth * 0.6);
|
||
let width2 = parseInt(document.body.clientWidth * 0.4);
|
||
<?php } ?>
|
||
let submitURL = $("#submit")[0].href;
|
||
<?php
|
||
if (isset($_GET['sid']))
|
||
echo "submitURL+='&sid=" . intval($_GET['sid']) . "';";
|
||
?>
|
||
console.log(width);
|
||
let main = $("#main");
|
||
let problem = main.html();
|
||
if (window.screen.width < 500) {
|
||
main.parent().append("<div id='submitPage' class='container' style='opacity:0.95;z-index:2;top:49px;'></div>");
|
||
$("#submitPage").html("<iframe id='ansFrame' src='" + submitURL + "&spa' width='100%' height='" + window.screen.height + "px' ></iframe>");
|
||
window.setTimeout('$("#ansFrame")[0].scrollIntoView()', 1000);
|
||
} else {
|
||
main.removeClass("container");
|
||
main.css("width", width2);
|
||
main.css("margin-left", "10px");
|
||
main.parent().append("<div id='submitPage' class='container' style='opacity:0.95;position:fixed;z-index:2;top:49px;right:-" + width2 + "px'></div>");
|
||
$("#submitPage").html("<iframe src='" + submitURL + "&spa' width='" + width + "px' height='" + height + "px' ></iframe>");
|
||
}
|
||
$("#submit").remove();
|
||
<?php if ($row['spj'] > 1) { ?>
|
||
window.setTimeout('$("iframe")[0].contentWindow.$("#TestRun").remove();', 1000);
|
||
<?php } ?>
|
||
|
||
// Add code to place drag button on the left side of the iframe
|
||
$("#submitPage").prepend("<div id='dragButton'></div>");
|
||
$(document).ready(function () {
|
||
let isDragging = false;
|
||
let startX = 0;
|
||
let initialWidth = 0;
|
||
|
||
|
||
function setIframeReadonly(readonly) {
|
||
const iframe = $("#submitPage").find('iframe')
|
||
if (readonly) {
|
||
iframe.css({
|
||
position: 'relative',
|
||
'z-index': -999
|
||
})
|
||
} else {
|
||
iframe.css({
|
||
position: 'static',
|
||
'z-index': 'unset'
|
||
})
|
||
}
|
||
}
|
||
|
||
|
||
// 鼠标按下时开始拖拽,颜色变为绿色
|
||
$("#dragButton").mousedown(function (event) {
|
||
if (event.target === this) { // Only allow dragging if the mouse button is clicked on the drag button itself
|
||
isDragging = true;
|
||
startX = event.pageX;
|
||
initialWidth = parseInt($("#main").css("width"));
|
||
$(this).css("background-color", "#a5ff00");
|
||
|
||
setIframeReadonly(true)
|
||
|
||
}
|
||
});
|
||
|
||
// 拖拽过程中更新宽度
|
||
$(document).mousemove(function (event) {
|
||
if (isDragging) {
|
||
let diffX = event.pageX - startX;
|
||
let newWidth = initialWidth + diffX;
|
||
$("#main").css("width", newWidth);
|
||
$("#submitPage").css("right", "-" + newWidth + "px");
|
||
$("#submitPage").find("iframe").attr("width", document.body.clientWidth - newWidth + "px");
|
||
}
|
||
});
|
||
|
||
// 鼠标释放时停止拖拽,恢复原始颜色
|
||
$(document).mouseup(function () {
|
||
if (isDragging) {
|
||
$("#dragButton").css("background-color", "gray");
|
||
}
|
||
isDragging = false;
|
||
|
||
setIframeReadonly(false)
|
||
|
||
});
|
||
|
||
// 鼠标移开页面或失焦时停止拖拽,恢复原始颜色
|
||
$(document).mouseleave(function () {
|
||
if (isDragging) {
|
||
$("#dragButton").css("background-color", "gray");
|
||
}
|
||
isDragging = false;
|
||
|
||
setIframeReadonly(false)
|
||
|
||
});
|
||
|
||
$(window).blur(function () {
|
||
if (isDragging) {
|
||
$("#dragButton").css("background-color", "gray");
|
||
}
|
||
isDragging = false;
|
||
setIframeReadonly(false)
|
||
|
||
});
|
||
|
||
});
|
||
|
||
}
|
||
|
||
function submit_code() {
|
||
if (!$('#submit_code input[name=answer]').val().trim() && !editor.getValue().trim()) return false;
|
||
$('#submit_code input[name=language]').val($('#languages-menu .item.active').data('value'));
|
||
lastSubmitted = editor.getValue();
|
||
$('#submit_code input[name=code]').val(editor.getValue());
|
||
return true;
|
||
}
|
||
|
||
// $('#languages-menu')[0].scrollTop = $('#languages-menu .active')[0].offsetTop - $('#languages-menu')[0].firstElementChild.offsetTop;
|
||
|
||
$(function () {
|
||
$('#languages-menu .item').click(function () {
|
||
$(this)
|
||
.addClass('active')
|
||
.closest('.ui.menu')
|
||
.find('.item')
|
||
.not($(this))
|
||
.removeClass('active')
|
||
;
|
||
editor.getSession().setMode("ace/mode/" + $(this).data('mode'));
|
||
});
|
||
});
|
||
</script>
|
||
|
||
|
||
<?php include("template/$OJ_TEMPLATE/footer.php"); ?>
|
||
|
||
<script>
|
||
function phpfm(pid) {
|
||
//alert(pid);
|
||
$.post("admin/phpfm.php", { 'frame': 3, 'pid': pid, 'pass': '' }, function (data, status) {
|
||
if (status == "success") {
|
||
document.location.href = "admin/phpfm.php?frame=3&pid=" + pid;
|
||
}
|
||
});
|
||
}
|
||
function selectOne(num, answer) {
|
||
let editor = $("iframe")[0].contentWindow.$("#source");
|
||
let old = editor.text();
|
||
let key = num + ".*";
|
||
console.log(key);
|
||
let rep = old.replace(new RegExp(key), num + " " + answer);
|
||
editor.text(rep);
|
||
}
|
||
function selectMulti(num, answer) {
|
||
let editor = $("iframe")[0].contentWindow.$("#source");
|
||
let old = editor.text();
|
||
let key = num + ".*";
|
||
console.log(key);
|
||
let rep = old.replace(new RegExp(key), num + " " + answer);
|
||
editor.text(rep);
|
||
}
|
||
|
||
$(document).ready(function () {
|
||
$("#creator").load("problem-ajax.php?pid=<?php echo $id ?>");
|
||
|
||
function copyText(content, onSuccess, onFail) {
|
||
if (navigator.clipboard && window.isSecureContext) {
|
||
navigator.clipboard.writeText(content).then(onSuccess).catch(onFail);
|
||
return;
|
||
}
|
||
const textarea = document.createElement('textarea');
|
||
textarea.value = content;
|
||
textarea.style.position = 'fixed';
|
||
textarea.style.left = '-9999px';
|
||
document.body.appendChild(textarea);
|
||
textarea.focus();
|
||
textarea.select();
|
||
try {
|
||
const copied = document.execCommand('copy');
|
||
copied ? onSuccess() : onFail();
|
||
} catch (err) {
|
||
onFail();
|
||
}
|
||
document.body.removeChild(textarea);
|
||
}
|
||
|
||
function initMarkdownCodeCopy() {
|
||
$('.md pre').each(function () {
|
||
const pre = $(this);
|
||
if (pre.find('.md-code-copy').length > 0) return;
|
||
|
||
const btn = $('<button type="button" class="md-code-copy"><?php echo $MSG_COPY; ?></button>');
|
||
btn.on('click', function () {
|
||
const code = pre.find('code').first();
|
||
const text = code.length > 0 ? code.text() : pre.text();
|
||
const currentBtn = $(this);
|
||
|
||
copyText(
|
||
text,
|
||
function () {
|
||
currentBtn.text('<?php echo $MSG_COPY . $MSG_SUCCESS; ?>!');
|
||
setTimeout(function () { currentBtn.text('<?php echo $MSG_COPY; ?>'); }, 1500);
|
||
},
|
||
function () {
|
||
currentBtn.text('<?php echo $MSG_COPY . $MSG_FAIL; ?>!');
|
||
setTimeout(function () { currentBtn.text('<?php echo $MSG_COPY; ?>'); }, 1500);
|
||
}
|
||
);
|
||
});
|
||
|
||
pre.prepend(btn);
|
||
});
|
||
}
|
||
|
||
<?php if (isset($OJ_MARKDOWN) && $OJ_MARKDOWN) { ?>
|
||
marked.use({
|
||
// 开启异步渲染
|
||
async: true,
|
||
pedantic: false,
|
||
gfm: true,
|
||
mangle: false,
|
||
headerIds: false
|
||
});
|
||
|
||
// Helper function to decode HTML entities from Markdown source
|
||
function decodeHtmlEntities(text) {
|
||
var textArea = document.createElement('textarea');
|
||
textArea.innerHTML = text;
|
||
return textArea.value;
|
||
}
|
||
|
||
$(".md").each(function () {
|
||
let raw_markdown_source = $(this).html();
|
||
let decoded_markdown_source = decodeHtmlEntities(raw_markdown_source);
|
||
|
||
<?php if ( $OJ_MARKDOWN == "marked.js") { ?>
|
||
let markdown_content = marked.parse(decoded_markdown_source);
|
||
<?php } else if ($OJ_MARKDOWN == "markdown-it") { ?>
|
||
const md = window.markdownit();
|
||
md.set({
|
||
html: true,
|
||
linkify: true,
|
||
typographer: true,
|
||
});
|
||
let markdown_content = md.render(decoded_markdown_source);
|
||
<?php } ?>
|
||
$(this).html(markdown_content);
|
||
});
|
||
// adding note for ```input1 ```output1 in description
|
||
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>");
|
||
}
|
||
|
||
|
||
$(".md table tr td").css({
|
||
"border": "1px solid grey",
|
||
"text-align": "center",
|
||
"width": "200px",
|
||
"height": "30px"
|
||
});
|
||
|
||
$(".md table th").css({
|
||
"border": "1px solid grey",
|
||
"width": "200px",
|
||
"height": "30px",
|
||
"background-color": "#9e9e9ea1",
|
||
"text-align": "center"
|
||
});
|
||
|
||
initMarkdownCodeCopy();
|
||
|
||
<?php } ?>
|
||
//单纯文本1. A. B. C. D. 自动变控件
|
||
$('span[class=auto_select]').each(function () {
|
||
let i = 1;
|
||
let start = 0;
|
||
let next = 0;
|
||
let raw = $(this).html();
|
||
let options = ['A', 'B', 'C', 'D'];
|
||
console.log("scanning...");
|
||
while (start >= 0) {
|
||
start = raw.indexOf("\n" + i + ".", start);
|
||
if (start < 0) break;
|
||
let end = start;
|
||
let type = "radio"
|
||
for (let j = 0; j < 4; j++) {
|
||
let option = options[j];
|
||
end = raw.indexOf(option + ".", start);
|
||
next = raw.indexOf("\n" + (i + 1) + ".", start);
|
||
console.log("[" + raw.substring(start, end) + "]");
|
||
if (end < 0 || (end > next && next > 0)) {
|
||
console.log("i:" + i + " j:" + option + " end:" + end + " next:" + next);
|
||
end = start;
|
||
break;
|
||
}
|
||
if (j == 0 && raw.substring(start, end).indexOf("多选") > 0) type = "checkbox";
|
||
let disp = "<input type=\"" + type + "\" name=\"" + i + "\" value=\"" + option + "\" />" + option + ".";
|
||
//console.log(disp);
|
||
raw = raw.substring(0, end - 1) + disp + raw.substring(end + 2);
|
||
start += disp.length;
|
||
}
|
||
start = end + 1;
|
||
i++;
|
||
}
|
||
//console.log(raw);
|
||
$(this).html(raw);
|
||
});
|
||
|
||
// subjective problems from hydroOJ markdown and embeded marks
|
||
$('span[class="md auto_select"]').each(function () {
|
||
let i = 1;
|
||
let options = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
|
||
$(this).find("ul").each(function () {
|
||
let type = "radio";
|
||
let ol = $(this).prev("ol");
|
||
if (ol != undefined && ol.attr("start") != undefined) i = ol.attr("start");
|
||
console.log("id[" + i + "]");
|
||
if ($(this).html().indexOf("多选") > 0 || (ol != undefined && ol.html() != undefined && ol.html().indexOf("multiselect") > 0)) type = "checkbox";
|
||
let j = 0;
|
||
$(this).find("li").each(function () {
|
||
let option = options[j];
|
||
let disp = "<input type=\"" + type + "\" name=\"" + i + "\" value=\"" + option + "\" />" + option + ".";
|
||
$(this).prepend(disp);
|
||
//console.log(options[j]);
|
||
j++;
|
||
});
|
||
i++;
|
||
});
|
||
let html = $(this).html();
|
||
for (; i > 0; i--) {
|
||
console.log("searching..." + i);
|
||
html = html.replace("{{ input(" + i + ") }}", "<input type='text' size=5 name='" + i + "' placeholder='第" + i + "题' ><br>");
|
||
}
|
||
html = html.replaceAll("<", "<");
|
||
html = html.replaceAll(">", ">");
|
||
$(this).html(html);
|
||
});
|
||
|
||
|
||
$(".auto_select").find('input[type="text"]').change(function () {
|
||
selectOne($(this).attr("name"), $(this).val());
|
||
});
|
||
|
||
|
||
$('input[type="radio"]').click(function () {
|
||
if ($(this).is(':checked'))
|
||
selectOne($(this).attr("name"), $(this).val());
|
||
}).css("width", "24px").css("height", "21px");
|
||
$('input[type="checkbox"]').click(function () {
|
||
let num = $(this).attr("name");
|
||
let answer = "";
|
||
$("input[type=checkbox][name=" + num + "]").each(function () {
|
||
if ($(this).is(':checked'))
|
||
answer += $(this).val();
|
||
});
|
||
selectMulti(num, answer);
|
||
}).css("width", "24px").css("height", "21px");
|
||
<?php if ($row['spj'] > 1 || isset($_GET['sid']) || (isset($OJ_AUTO_SHOW_OFF) && $OJ_AUTO_SHOW_OFF)) { ?>
|
||
transform();
|
||
<?php } ?>
|
||
|
||
});
|
||
</script>
|
||
|
||
|
||
<script>
|
||
if ($('#copyin')[0] != undefined) {
|
||
|
||
var clipboardin = new Clipboard($('#copyin')[0]);
|
||
clipboardin.on('success', function (e) {
|
||
$("#copyin").text("<?php echo $MSG_COPY . $MSG_SUCCESS; ?>!");
|
||
setTimeout(function () { $("#copyin").text("<?php echo $MSG_COPY; ?>"); }, 1500);
|
||
console.log(e);
|
||
});
|
||
clipboardin.on('error', function (e) {
|
||
$("#copyin").text("<?php echo $MSG_COPY . $MSG_FAIL; ?>!");
|
||
setTimeout(function () { $("#copyin").text("<?php echo $MSG_COPY; ?>"); }, 1500);
|
||
console.log(e);
|
||
});
|
||
}
|
||
if ($('#copyout')[0] != undefined) {
|
||
|
||
var clipboardout = new Clipboard($('#copyout')[0]);
|
||
clipboardout.on('success', function (e) {
|
||
$("#copyout").text("<?php echo $MSG_COPY . $MSG_SUCCESS; ?>!");
|
||
setTimeout(function () { $("#copyout").text("<?php echo $MSG_COPY; ?>"); }, 1500);
|
||
console.log(e);
|
||
});
|
||
clipboardout.on('error', function (e) {
|
||
$("#copyout").text("<?php echo $MSG_COPY . $MSG_FAIL; ?>!");
|
||
setTimeout(function () { $("#copyout").text("<?php echo $MSG_COPY; ?>"); }, 1500);
|
||
console.log(e);
|
||
});
|
||
}
|
||
|
||
</script>
|
||
<?php if (isset($OJ_MATHJAX) && $OJ_MATHJAX) { ?>
|
||
<!--以下为了加载公式的使用而既加入-->
|
||
<script>
|
||
MathJax = {
|
||
tex: { inlineMath: [['$', '$'], ['\\(', '\\)']] }
|
||
};
|
||
</script>
|
||
|
||
<script id="MathJax-script" async src="template/bs3/tex-chtml.js"></script>
|
||
<style>
|
||
.jumbotron1 {
|
||
font-size: 18px;
|
||
}
|
||
</style>
|
||
|
||
<?php } ?>
|