使用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获取外网ip地址的方法总结
Jul 02 Python
举例讲解Python中的迭代器、生成器与列表解析用法
Mar 20 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
Python使用爬虫爬取静态网页图片的方法详解
Jun 05 Python
python实现剪切功能
Jan 23 Python
Pandas中resample方法详解
Jul 02 Python
python读出当前时间精度到秒的代码
Jul 05 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 Python
python redis 批量设置过期key过程解析
Nov 26 Python
Python实现bilibili时间长度查询的示例代码
Jan 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
德生PL990的分析评价
2021/03/02 无线电
详解:――如何将图片储存在数据库里
2006/12/05 PHP
收集的DedeCMS一些使用经验
2007/03/17 PHP
符合W3C网页标准的iframe标签的使用方法
2007/07/19 Javascript
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
python实现excel读写数据
2021/03/02 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
全球工业:Global Industrial
2020/02/01 全球购物
文秘专业应届生求职信范文
2013/11/14 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
网络教育自我鉴定
2014/02/04 职场文书
英语专业求职信
2014/07/08 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
淘宝好评语句大全
2014/12/31 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
2016党员党课心得体会
2016/01/07 职场文书
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL