✨ feat: 更新问题页面和提交页面,集成Vditor适配器,优化Markdown渲染
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
<script src="<?php echo $OJ_CDN_URL.$path_fix."include/"?>jquery-latest.js"></script>
|
||||
|
||||
<?php if(isset($OJ_MARKDOWN)&&$OJ_MARKDOWN){ ?>
|
||||
<script src="<?php echo $OJ_CDN_URL.$path_fix."template/$OJ_TEMPLATE/"?>marked.min.js"></script>
|
||||
<script src="include/vditor-adapter.js"></script>
|
||||
<?php } ?>
|
||||
|
||||
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
|
||||
|
||||
6
web/template/bs3/marked.min.js
vendored
6
web/template/bs3/marked.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -246,74 +246,93 @@
|
||||
}
|
||||
} );
|
||||
}
|
||||
function getFrameSourceValue(frameWindow) {
|
||||
if (frameWindow.editor && typeof frameWindow.editor.getValue === "function") {
|
||||
return frameWindow.editor.getValue();
|
||||
}
|
||||
return frameWindow.$("#source").text();
|
||||
}
|
||||
function setFrameSourceValue(frameWindow, value) {
|
||||
if (frameWindow.editor && typeof frameWindow.editor.setValue === "function") {
|
||||
frameWindow.editor.setValue(value);
|
||||
return;
|
||||
}
|
||||
frameWindow.$("#source").text(value);
|
||||
}
|
||||
function selectOne( num, answer){
|
||||
let editor = $("iframe")[0].contentWindow.$("#source");
|
||||
let old=editor.text();
|
||||
let frameWindow = $("iframe")[0].contentWindow;
|
||||
let old=getFrameSourceValue(frameWindow);
|
||||
let key= num+".*";
|
||||
console.log(key);
|
||||
let rep=old.replace(new RegExp(key),num+" "+answer);
|
||||
editor.text(rep);
|
||||
setFrameSourceValue(frameWindow, rep);
|
||||
}
|
||||
function selectMulti( num, answer){
|
||||
let editor = $("iframe")[0].contentWindow.$("#source");
|
||||
let old=editor.text();
|
||||
let frameWindow = $("iframe")[0].contentWindow;
|
||||
let old=getFrameSourceValue(frameWindow);
|
||||
let key= num+".*";
|
||||
console.log(key);
|
||||
let rep=old.replace(new RegExp(key),num+" "+answer);
|
||||
editor.text(rep);
|
||||
setFrameSourceValue(frameWindow, rep);
|
||||
}
|
||||
function renderProblemMarkdown() {
|
||||
<?php if(isset($OJ_MARKDOWN)&&$OJ_MARKDOWN){ ?>
|
||||
return HustOJVditor.renderMarkdownBlocks('.md');
|
||||
<?php } ?>
|
||||
return Promise.resolve([]);
|
||||
}
|
||||
function initializeProblemChoices() {
|
||||
$('span[class=auto_select]').each(function(){
|
||||
let i=1;
|
||||
let start=0;
|
||||
let raw=$(this).html();
|
||||
let options=['A','B','C','D'];
|
||||
while(start>=0){
|
||||
start=raw.indexOf(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);
|
||||
if(j==0&&raw.substring(start,end).indexOf("多选")>0) type="checkbox";
|
||||
if (end<0) break;
|
||||
let disp="<input type=\""+type+"\" name=\""+i+"\" value=\""+option+"\" />"+option+".";
|
||||
raw= raw.substring(0,end-1)+disp+raw.substring(end+2);
|
||||
start+=disp.length;
|
||||
}
|
||||
start=end+1;
|
||||
i++;
|
||||
}
|
||||
$(this).html(raw);
|
||||
});
|
||||
$('input[type="radio"]').click(function(){
|
||||
if ($(this).is(':checked'))
|
||||
{
|
||||
selectOne($(this).attr("name"),$(this).val());
|
||||
}
|
||||
});
|
||||
$('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);
|
||||
});
|
||||
<?php if ($row['spj']>1 || isset($_GET['sid']) || (isset($OJ_AUTO_SHOW_OFF)&&$OJ_AUTO_SHOW_OFF)){ ?>
|
||||
transform();
|
||||
<?php }?>
|
||||
}
|
||||
window.renderProblemMarkdown = renderProblemMarkdown;
|
||||
$( document ).ready( function () {
|
||||
$( "#creator" ).load( "problem-ajax.php?pid=<?php echo $id?>" );
|
||||
<?php if(isset($OJ_MARKDOWN)&&$OJ_MARKDOWN){ ?>
|
||||
$(".md").each(function(){
|
||||
$(this).html(marked.parse($(this).html()));
|
||||
});
|
||||
<?php } ?>
|
||||
//单纯文本1. A. B. C. D. 自动变控件
|
||||
$('span[class=auto_select]').each(function(){
|
||||
let i=1;
|
||||
let start=0;
|
||||
let raw=$(this).html();
|
||||
let options=['A','B','C','D'];
|
||||
while(start>=0){
|
||||
start=raw.indexOf(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);
|
||||
if(j==0&&raw.substring(start,end).indexOf("多选")>0) type="checkbox";
|
||||
if (end<0) break;
|
||||
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);
|
||||
});
|
||||
$('input[type="radio"]').click(function(){
|
||||
if ($(this).is(':checked'))
|
||||
{
|
||||
selectOne($(this).attr("name"),$(this).val());
|
||||
}
|
||||
});
|
||||
$('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);
|
||||
});
|
||||
<?php if ($row['spj']>1 || isset($_GET['sid']) || (isset($OJ_AUTO_SHOW_OFF)&&$OJ_AUTO_SHOW_OFF)){ ?>
|
||||
transform();
|
||||
<?php }?>
|
||||
renderProblemMarkdown().catch(function (error) {
|
||||
console.error('Failed to render problem markdown.', error);
|
||||
}).then(function () {
|
||||
initializeProblemChoices();
|
||||
});
|
||||
|
||||
|
||||
} );
|
||||
|
||||
@@ -39,83 +39,78 @@
|
||||
<?php include("template/$OJ_TEMPLATE/js.php");?>
|
||||
|
||||
<?php if(isset($OJ_MARKDOWN)&&$OJ_MARKDOWN){ ?>
|
||||
<script src="<?php echo $OJ_CDN_URL.$path_fix."template/bs3/"?>marked.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
marked.use({
|
||||
// 开启异步渲染
|
||||
async: true,
|
||||
pedantic: false,
|
||||
gfm: true,
|
||||
mangle: false,
|
||||
headerIds: false
|
||||
});
|
||||
$("#errtxt").each(function(){
|
||||
$(this).html(marked.parse($(this).html()));
|
||||
});
|
||||
// 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>");
|
||||
}
|
||||
|
||||
|
||||
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"
|
||||
"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"
|
||||
"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"
|
||||
"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){
|
||||
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>");
|
||||
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{
|
||||
}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>");
|
||||
});
|
||||
|
||||
$("#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);
|
||||
|
||||
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>
|
||||
|
||||
@@ -65,30 +65,25 @@
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<?php include("template/$OJ_TEMPLATE/js.php");?>
|
||||
|
||||
<script src="<?php echo $OJ_CDN_URL?>ace/ace.js"></script>
|
||||
<script src="<?php echo $OJ_CDN_URL?>ace/ext-language_tools.js"></script>
|
||||
<script src="include/vditor-adapter.js"></script>
|
||||
<script>
|
||||
$("#language").on("change",changeLanguage);
|
||||
//初始化对象
|
||||
editor = ace.edit("code");
|
||||
editor = HustOJVditor.createDeferredCodeEditor({
|
||||
container: "code",
|
||||
sourceField: "source",
|
||||
readOnly: <?php echo $readOnly ?>,
|
||||
theme: "ace/theme/clouds",
|
||||
fontSize: 18
|
||||
});
|
||||
|
||||
//设置风格和语言(更多风格和语言,请到github上相应目录查看)
|
||||
theme = "clouds"
|
||||
language = "c_cpp"
|
||||
editor.setTheme("ace/theme/" + theme);
|
||||
editor.session.setMode("ace/mode/" + language);
|
||||
|
||||
//字体大小
|
||||
editor.setFontSize(18);
|
||||
|
||||
//设置只读(true时只读,用于展示代码)
|
||||
editor.setReadOnly(<?php echo $readOnly ?>);
|
||||
|
||||
//自动换行,设置为off关闭
|
||||
editor.setOption("wrap", "free")
|
||||
|
||||
//启用提示菜单
|
||||
ace.require("ace/ext/language_tools");
|
||||
editor.setOptions({
|
||||
enableBasicAutocompletion: true,
|
||||
enableSnippets: true,
|
||||
|
||||
@@ -389,20 +389,20 @@ function resume(){
|
||||
<script language="Javascript" type="text/javascript" src="<?php echo $OJ_CDN_URL?>include/base64.js"></script>
|
||||
|
||||
<?php if($OJ_ACE_EDITOR){ ?>
|
||||
<script src="<?php echo $OJ_CDN_URL?>ace/ace.js"></script>
|
||||
|
||||
<script src="<?php echo $OJ_CDN_URL?>ace/ext-language_tools.js"></script>
|
||||
<script src="include/vditor-adapter.js"></script>
|
||||
|
||||
<script>
|
||||
ace.require("<?php echo $OJ_CDN_URL?>ace/ext/language_tools");
|
||||
var editor = ace.edit("source");
|
||||
editor.setTheme("ace/theme/chrome");
|
||||
var editor = HustOJVditor.createDeferredCodeEditor({
|
||||
container: "source",
|
||||
hiddenField: "hide_source",
|
||||
theme: "ace/theme/chrome",
|
||||
fontSize: 20
|
||||
});
|
||||
switchLang(<?php echo isset($lastlang)?$lastlang:0 ; ?>);
|
||||
editor.setOptions({
|
||||
enableBasicAutocompletion: true,
|
||||
enableSnippets: true,
|
||||
enableLiveAutocompletion: false,
|
||||
//fontFamily: "Consolas",
|
||||
fontSize: "20px"
|
||||
});
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user