使用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绘制铅球的运行轨迹代码分享
Nov 14 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
python检测IP地址变化并触发事件
Dec 26 Python
Python Pillow Image Invert
Jan 22 Python
Python提取频域特征知识点浅析
Mar 04 Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 Python
使用coverage统计python web项目代码覆盖率的方法详解
Aug 05 Python
Python实现语音识别和语音合成功能
Sep 20 Python
python编写微信公众号首图思路详解
Dec 13 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
Jan 21 Python
Pycharm常用快捷键总结及配置方法
Nov 14 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的explode和implode的使用说明
2011/07/17 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
PHP 微信支付类 demo
2015/11/30 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
学习ExtJS 访问容器对象
2009/10/07 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
ES6新增的数组知识实例小结
2020/05/23 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
python实现在目录中查找指定文件的方法
2014/11/11 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
Python如何存储数据到json文件
2020/03/09 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
.NET面试10题
2014/02/24 面试题
跟单文员的岗位职责
2013/11/14 职场文书
广告创意求职信
2014/03/17 职场文书
太太口服液广告词
2014/03/20 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers