使用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结合opencv实现人脸检测与跟踪
Jun 08 Python
使用Python脚本将文字转换为图片的实例分享
Aug 29 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
python2.7实现FTP文件下载功能
Apr 15 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
Python上下文管理器全实例详解
Nov 12 Python
PyCharm第一次安装及使用教程
Jan 08 Python
Python filter过滤器原理及实例应用
Aug 18 Python
python实现简单遗传算法
Sep 18 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
Python中os模块的简单使用及重命名操作
Apr 17 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
php 小乘法表实现代码
2009/07/16 PHP
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
从PHP的源码中深入了解stdClass类
2014/04/18 PHP
php如何获取文件的扩展名
2015/10/28 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
python共享引用(多个变量引用)示例代码
2013/12/04 Python
讲解Python中的递归函数
2015/04/27 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
django-allauth入门学习和使用详解
2019/07/03 Python
django如何通过类视图使用装饰器
2019/07/24 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
关于Java String的一道面试题
2013/09/29 面试题
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
生物化工工艺专业应届生求职信
2013/10/08 职场文书
汉语言文学职业规划
2014/02/14 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
酒会邀请函
2015/01/31 职场文书