import win.ui;
/*DSG{{*/
mainForm = win.form(text="WebWin";right=944;bottom=475)
mainForm.add(
pyrun={cls="button";text="运 行";left=109;top=443;right=220;bottom=467;db=1;z=2};
pyshow={cls="edit";text="Edit";left=469;top=6;right=937;bottom=437;bgcolor=0;border=1;color=65280;db=1;dl=1;dr=1;dt=1;hidesel=1;hscroll=1;multiline=1;vscroll=1;z=3};
web={cls="static";text="Static";left=8;top=6;right=465;bottom=435;border=1;db=1;dl=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/
import web.form;
var wb=web.form(mainForm.web);
import py3;
mainForm.pyshow.text="";
//重定向输出...>>>>>
var pyCode = /**
import sys
#写个输出信息的类
class CatchOutErr:
def __init__(self):
self.value = ''
def write(self, txt):
self.value += txt
#创建有输出功能的对象
catchOutErr = CatchOutErr()
#标准输入重定向到 catchOutErr (不再输出到默认的『控制台命令行黑窗口』)
sys.stdin = catchOutErr #这句好像不管用
#标准输出重定向到 catchOutErr (不再输出到默认的『控制台命令行黑窗口』)
sys.stdout = catchOutErr
#标准错误输出重定向到 catchOutErr(不再输出到默认的『控制台命令行黑窗口』)
sys.stderr = catchOutErr
**/
py3.exec( pyCode )
//重定向输出...<<<<<
wb.external = {
getkeyword=function(){//要行尾加 ":"的关键字
var keys=/**
import,0,//导入库
var,0,//定义变量
def,1,//定义函数
for,1,//范围循环
if,1,//如果...
while,1,//条件循环
class,1,//定义类
elif,1,//否则如果..
else,1,//否则...
**/;
return keys;
}
}
wb.html = /**
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<style type="text/css">
html,body{ height:100%; margin:0; }
p{margin:0;padding:0;}
code:{
line-height:15px;
width:85%;
height=100%;
top=0px;
left=0px;
border=1;
font-size:16px;
overflow-y:hidden;
}
</style>
</head>
<body>
<table width=100% height=100% border="0">
<tr>
<td width=4% height=100% bgcolor="#aabbcc" align=left valign=top>
<div id="hh" class="code" scroll=no border=1 valign=top align=right>
0
</div>
</td>
<td align="left" width=85% bgcolor="#ccffaa" height=100% valign='top'>
<div id="txt" tabindex="0" onkeydown="keydown(event);setlinenumber();" onkeyup="keyUp(event);setlinenumber();" onkeypress="setlinenumber();" contenteditable="true" class="code">
<p><font color='#ff00ff'>import</font> os</p>
<p><font color='#ff00ff'>import</font> sys</p>
<p>print("九九乘法表")</p>
<p>for i in range(1,10):</p>
<p> for j in range(1,i+1):</p>
<p> print(f"{j}x{i}={i*j}",end=" ")</p>
<p> print()</p>
<p></p>
</div>
</td>
</tr>
</table>
<script language="javascript">
var hhh=document.getElementById("hh");
var tt=document.getElementById("txt");
var pykeys=external.getkeyword();
pykeys=pykeys.replace(" ","");
pykeys=pykeys.replace(" ","");
pykeys=pykeys.split('\n');
var setlinenumber=function(){
var ttx=tt.innerHTML.split("<p>");
hhh.innerHTML="";
for(i=1;i<ttx.length;i++){
var fc='#ffffff';//彩底白字
var bk='#'+(i*35%255).toString(16)+(i*55%255).toString(16)+(255).toString(16);
hhh.innerHTML+="<p><span style='background:"+bk+";color:"+fc+";'>"+i+"</span></p>";
}
}
var keydown=function(event){
var curp=getPtext(event);
var pp=tt.getElementsByTagName("P");
//alert(event.keyCode);
for(var i=0;i<pp.length;i++){
var clss=pp[i].textContent;
if(event.ctrlKey && (event.key=="V"||event.key=="v")){setlinenumber();}
if(clss==curp){//判断是否为当前行
if(event.keyCode==13){//按下回车键
cl=(clss.trim()).split(" ");
for(var j=0;j<pykeys.length;j++){//循环关键字
pk=pykeys[j].trim().split(',')
if(cl[0]==pk[0]){//判断是否为关键字
var tmp=pp[i].innerHTML;
if(pk[1]=='1' && cl[cl.length-1].substr(-1)!=':'){//加冒号
//pp[i].textContent+=":";
tmp=tmp.replace("<font color='#ff00ff'>","");//去除原有着色
tmp=tmp.replace("<\/font>","");//去除原有着色
tmp=tmp.replace(pk[0],"<font color='#ff00ff'>"+pk[0]+"<\/font>")+":";
} else {
tmp=tmp.replace("<font color='#ff00ff'>","");//去除原有着色
tmp=tmp.replace("<\/font>","");//去除原有着色
tmp=tmp.replace(pk[0],"<font color='#ff00ff'>"+pk[0]+"<\/font>");
}
pp[i].innerHTML=tmp;
}
}
}
}
//var reg=/^\s*(\S+)/;//^表示从字符串开始位置,\s* 0个或多个空白字符 (\S+) \S 非空白字符,+ 一个或多个非空白字符
//alert(clss.match(reg));
}
}
var keyUp=function(event){
//下面加入自动缩进代码
if(event.key=="Enter"){
var lp=tt.getElementsByTagName("P");
var lnum=getcurlinenumber(event);
var lpt=lp[lnum-2].textContent.trim();
var tmp=lp[lnum-2].innerHTML;
tmp=tmp.replace('<font color="#ff00ff">',"");//去除原有着色
tmp=tmp.replace("</font>","");//去除原有着色
var tabspace=tmp.replace(lpt,"");//lp[lnum-2].innerText.match(/^\s*/)[0];
//alert("["+lpt+"]"+tabspace+"");
setPHtml(lnum-1,tabspace);
}
if(event.key=="Tab"){
var range=window.getSelection().getRangeAt(0);
var text='\t';//" ";
range.deleteContents();
var tnode=document.createTextNode(text);
range.insertNode(tnode);
}
}
setPHtml=function(linenum,txt){
var lp=tt.getElementsByTagName("P");
var rg=document.createRange();
//var sel=window.getSelection();
rg.setStart(tt.childNodes[linenum*2-1],0);
rg.collapse(true);
//sel.removeAllRanges();
//sel.addRange(rg);
lp[linenum].innerHTML=txt;
}
var getcurlinenumber=function(event){
var cursorText=window.getSelection().getRangeAt(0).startContainer.textContent;
var lines=tt.getElementsByTagName("P");
var linenumber=0;
for(var i=0;i<lines.length;i++){
if(cursorText.trim()==lines[i].textContent.trim()){
linenumber=i;
break;
}
}
return(linenumber+1);
}
var getPtext=function(event){//<p>与</p>之间不能含有其它标贴,如果文字有重复,的,有点无语
//var ele=event.target;
var cursorText=window.getSelection().getRangeAt(0).startContainer.textContent;
/*
//startOffset 选区开始位置
//startContainer 选区开始容器
//endOffset 选区结束位置
//endContainer 选区结束容器
*/
return(cursorText);
}
setlinenumber();
</script>
</body>
</html>
**/
mainForm.pyrun.oncommand = function(id,event){
mainForm.pyshow.text="";
var mbx=wb.getEle("txt").innerText;
mbx=string.replace(mbx,'\r\n','\n');
mbx=string.replace(mbx,'\n\n','\n');
py3.main.catchOutErr.value="";//清除错误信息
mainForm.pyshow.print("【运行结果,如下:】");
py3.exec(mbx);
var pyrtn=string.split(tostring(py3.main.catchOutErr.value ),'\n');//获取控制台输出信息
for(i=1;#pyrtn;1){
var xx=string.match(pyrtn[i],"line[ ]\d+");
if(xx){xx=string.split(xx," ")[2];mainForm.pyshow.print("出错行:",xx);}
else{mainForm.pyshow.print(pyrtn[i]);}//显示到指定窗口
sleep(50)
}
}
mainForm.show();
return win.loopMessage();
4029

被折叠的 条评论
为什么被折叠?



