使用CodeMirror实现Python3在线编辑器的示例代码


Posted in Python onJanuary 14, 2019

一、编写页面

主要是引入相关的css文件和js文件,这里采用简单插入link和script标签的形式。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <link rel="stylesheet" href="codemirror/lib/codemirror.css" rel="external nofollow" >
  <link rel="stylesheet" href="codemirror/addon/fold/foldgutter.css" rel="external nofollow" >
  <link rel="stylesheet" href="codemirror/addon/hint/show-hint.css" rel="external nofollow" >
  <link rel="stylesheet" href="codemirror/addon/lint/lint.css" rel="external nofollow" >
  <link rel="stylesheet" href="leetcode.css" rel="external nofollow" > 
</head>
<body>
  <form action="">
    <textarea id="editor" class="editor"></textarea>
  </form>  
  <button id="test">click</button>
</body>
</html>
<script src="codemirror/lib/codemirror.js"></script>

<script src="codemirror/addon/comment/comment.js"></script>

<script src="codemirror/addon/selection/active-line.js"></script>

<script src="codemirror/keymap/sublime.js"></script>

<script src="codemirror/addon/hint/show-hint.js"></script>
<script src="codemirror/mode/python/python.js"></script> 

<script src="codemirror/addon/fold/foldcode.js"></script>
<script src="codemirror/addon/fold/foldgutter.js"></script>
<script src="codemirror/addon/fold/brace-fold.js"></script>
<script src="codemirror/addon/fold/indent-fold.js"></script>
<script src="codemirror/addon/fold/comment-fold.js"></script>

<script src="codemirror/addon/edit/closebrackets.js"></script>
<script src="codemirror/addon/edit/matchbrackets.js"></script>

<script src="axios.js"></script>

<script src="index.js"></script>

二、配置CodeMirror

在index.js中配置CodeMirror

window.onload = function () {
  var el = document.getElementById("editor");
  var version = "# version: Python3\n\n";
  var codeAreaTip = "# please edit your code here:\n";
  var codeStart = "# code start\n\n";
  var codeEnd = "# code end\n\n";
  var codeTip = "'''\nThis function is the entry of this program and\nit must be return your answer of current question.\n'''\n";
  var code = "def solution():\n\tpass";
  var initValue = version + codeAreaTip + codeStart + codeEnd + codeTip + code;
  var myCodeMirror = CodeMirror.fromTextArea(el, {
    mode: "python", // 语言模式
    theme: "leetcode", // 主题
    keyMap: "sublime", // 快键键风格
    lineNumbers: true, // 显示行号
    smartIndent: true, // 智能缩进
    indentUnit: 4, // 智能缩进单位为4个空格长度
    indentWithTabs: true, // 使用制表符进行智能缩进
    lineWrapping: true, // 
    // 在行槽中添加行号显示器、折叠器、语法检测器
    gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "CodeMirror-lint-markers"], 
    foldGutter: true, // 启用行槽中的代码折叠
    autofocus: true, // 自动聚焦
    matchBrackets: true, // 匹配结束符号,比如"]、}"
    autoCloseBrackets: true, // 自动闭合符号
    styleActiveLine: true, // 显示选中行的样式
  });
  // 设置初始文本,这个选项也可以在fromTextArea中配置
  myCodeMirror.setOption("value", initValue);
  // 编辑器按键监听
  myCodeMirror.on("keypress", function() {
    // 显示智能提示
    myCodeMirror.showHint(); // 注意,注释了CodeMirror库中show-hint.js第131行的代码(阻止了代码补全,同时提供智能提示)
  });
  var test = document.getElementById("test");
  test.onclick = function() {
    var value = myCodeMirror.getValue();
    axios.post("http://localhost/api/runcode", {
      code: value
    }).then(function(res) {
      console.log(res);
    });
  };
};

三、后台调用python shell

过程如下:

  • 在接收的代码字符串后面添加print(solution())用于打印结果
  • 将第一步处理后的字符串写入一个文件中这里是code/code.py
  • 使用child_process模块的exec方法调用shell执行python code/code.py命令,获取打印结果
const express = require("express");
const { exec } = require("child_process");
const router = express.Router();
router.post("/api/runcode", (req, res) => {
  let code = req.body.code;
  fs.writeFile("code/code.py", code+"\nprint(solution())", (err) => {
    let command = "python code/code.py";
    exec(command, (err, stdout, stdin) => {
      if(err){
        let reg = /[\d\D]*(line\s\d)[\d\D]*?(\w*(?:Error|Exception).*)/im;
        let matchArr = reg.exec(err.message);
        matchArr.shift();
        res.send(matchArr.join(", "));
      }
      else
        res.send(stdout);
    });
  });
});

效果:

使用CodeMirror实现Python3在线编辑器的示例代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 检查数组元素是否存在类似PHP isset()方法
Oct 14 Python
python通过yield实现数组全排列的方法
Mar 18 Python
python开发之for循环操作实例详解
Nov 12 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
使用python为mysql实现restful接口
Jan 05 Python
详解在python操作数据库中游标的使用方法
Nov 12 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
python编写函数注意事项总结
Mar 29 Python
python引入其他文件夹下的py文件具体方法
May 23 Python
python 根据时间来生成唯一的字符串方法
Jan 14 #Python
python ipset管理 增删白名单的方法
Jan 14 #Python
python 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 #Python
在python 不同时区之间的差值与转换方法
Jan 14 #Python
Python常见数据结构之栈与队列用法示例
Jan 14 #Python
解决nohup执行python程序log文件写入不及时的问题
Jan 14 #Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 #Python
You might like
php代码运行时间查看类代码分享
2011/08/06 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
javascript类型转换示例
2014/04/29 Javascript
js读取cookie方法总结
2014/10/31 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
Django设置Postgresql的操作
2020/05/14 Python
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
总经理助理岗位职责
2013/11/08 职场文书
银行求职信怎么写
2014/05/26 职场文书
5s标语大全
2014/06/23 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
先进工作者推荐材料
2014/12/23 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
贷款收入证明格式
2015/06/24 职场文书
Go gorilla/sessions库安装使用
2022/08/14 Golang