使用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 相关文章推荐
在matplotlib的图中设置中文标签的方法
Dec 13 Python
python random从集合中随机选择元素的方法
Jan 23 Python
实例介绍Python中整型
Feb 11 Python
python微信撤回监测代码
Apr 29 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
python读文件的步骤
Oct 08 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
Nov 19 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
python range实例用法分享
Feb 06 Python
Python数据处理的三个实用技巧分享
Apr 01 Python
Python pyecharts案例超市4年数据可视化分析
Aug 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判断所处服务器操作系统的类型
2013/06/20 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
jQuery 对象中的类数组操作
2009/04/27 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
简单实现js拖拽效果
2017/07/25 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
Python3 伪装浏览器的方法示例
2017/11/23 Python
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
css sprite简单实例
2016/05/23 HTML / CSS
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
自考毕业自我鉴定范文
2013/10/27 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
财会专业大学生求职信
2014/09/26 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
本溪关门山导游词
2015/02/09 职场文书
小学教师自我评价
2015/03/04 职场文书
教师节祝酒词
2015/08/11 职场文书
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python