使用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之编写类之三子类
Oct 11 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
详解python算法之冒泡排序
Mar 05 Python
python使用KNN算法识别手写数字
Apr 25 Python
python占位符输入方式实例
May 27 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
Python离线安装各种库及pip的方法
Nov 28 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 Python
Autopep8的使用(python自动编排工具)
Mar 02 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实现的功能是显示8条基色色带
2006/10/09 PHP
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
js 操作css实现代码
2009/06/11 Javascript
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
javascript生成大小写字母
2015/07/03 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
Python使用pymysql小技巧
2017/06/04 Python
简单实现python聊天程序
2018/04/01 Python
Python格式化日期时间操作示例
2018/06/28 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
python中if及if-else如何使用
2020/06/02 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
英国探险旅游专家:Explore
2018/12/20 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
static关键字的用法
2013/10/07 面试题
党员服务承诺书
2014/05/28 职场文书
星级党支部申报材料
2014/05/31 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
初中信息技术教学计划
2015/01/22 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书