前端——代码编辑器

article/2025/9/3 18:54:24

1.codemirror插件

相关网址

  1. Vue 官方插件库推荐的集成实现
    • 这个实现做的比较全面,但不支持动态语法高亮的切换
  2. codemirror 支持的语言类型
  3. codemirror 官网

参考文章:

        vue-codemirror 代码编辑器 - 简书

2.vue-codemirror插件

相关网址

        1.vue-codemirror - npm

参考文章: 

        Vue(27)vue-codemirror实现在线代码编译器 _ - 腾讯云开发者社区-腾讯云

vue案例代码:

<!--这是文档界面-->
<template><div class="containner"><!-- 左边导航区 --><div class="nav"><!-- 头部搜索区 --><div class="nav_top"><div class="input"><el-input v-model="inputSeach" placeholder="请输入内容"></el-input></div><div class="img_seach"><imgsrc="../../assets/img/seach.png"@click="inputSeachClick"alt=""/></div></div><!-- 底部导航区 --><div class="nav_main"><el-menu:default-active="$route.hash"class="el-menu-vertical-demo"background-color="#181a1b"text-color="#fff"@open="showPage"active-text-color="#ffd04b"@select="handleSelect"router><el-submenu index="1"><template slot="title"><i class="el-icon-location"></i><span>入门示例</span></template><el-menu-item index="#1">场景初始化</el-menu-item><el-menu-item index="#2">数据挂接</el-menu-item><el-menu-item index="#3">组件高亮</el-menu-item><el-menu-item index="#4">光源控制</el-menu-item><el-menu-item index="#5">交互控制</el-menu-item><el-menu-item index="#6">测量相关</el-menu-item></el-submenu><!-- 导航2 --><el-submenu index="2"><template slot="title"><i class="el-icon-location"></i><span>待开发</span></template><el-menu-item index="#0">选项1</el-menu-item></el-submenu></el-menu></div></div><!-- 右边 --><div class="wrap"><!-- 代码区域编辑器 --><split-panesplit="vertical"@resize="resize":min-percent="5":default-percent="25"><template slot="paneL"><split-pane split="horizontal" :min-percent="5"><template slot="paneL"><div><!-- 编辑器头部按钮 --><div class="btns"><el-button type="primary" size="mini" @click="submitHtml">运行</el-button><el-button type="primary" size="mini" @click="submitBack">重置</el-button></div><!-- 编辑器 --><div class="edit"><codemirrorclass="code"v-model="code":options="cmOptions"></codemirror></div><!-- <pre class="pre">{{ code }}</pre> --></div></template><template slot="paneR"><div class="doc"><component :is="currentView"></component></div></template></split-pane></template><!-- 内嵌网页区域 --><template slot="paneR"><div id="iframewrapper"></div></template></split-pane></div></div>
</template><script>
// import 《组件名称》 from '《组件路径》';
// 引入的插件部分
import { codemirror } from 'vue-codemirror'
import 'codemirror/lib/codemirror.css'
import 'codemirror/keymap/sublime' // sublime编辑器效果
import 'codemirror/theme/dracula.css'// 配置里面也需要theme设置为monokai
import 'codemirror/mode/vue/vue.js' // 配置里面也需要mode设置为vue
import 'codemirror/addon/selection/active-line' // 光标行背景高亮,配置里面也需要styleActiveLine设置为true
import dedent from 'dedent'// 文档引入部分
import index_1_2 from '../apiShow/index_1_2.vue'
import index_1_3 from '../apiShow/index_1_3.vue'
import { log } from 'three'export default {// import引入的组件需要注入到对象中才能使用components: { codemirror, index_1_2, index_1_3 },data () {// 这里存放数据return {code: '',cmOptions: {tabSize: 4, // tab的空格个数theme: 'dracula', // 主题样式lineWrapping: true, // 是否自动换行styleActiveLine: true, // line选择是是否加亮matchBrackets: true, // 括号匹配mode: 'vue', // 实现javascript代码高亮readOnly: false, // 只读scrollbarStyle: 'native',},// 模糊搜索内容inputSeach: '',// 文档引入index_1_2: index_1_2,index_1_3: index_1_3,}},// 监听属性 类似于data概念computed: {currentView: function () {// if (this.$route.hash === '#1') {//   return this.index_1_2// }if (this.$route.hash === '#2') {return this.index_1_3} else {return this.index_1_2}return false}},// 监控data中的数据变化watch: {},// 方法集合methods: {resize () { },// 保存submitHtml () {let text = this.codeconst patternHtml = /<html[^>]*>((.|[\n\r])*)<\/html>/imconst patternHead = /<head[^>]*>((.|[\n\r])*)<\/head>/imconst arrayMatchesHead = patternHead.exec(text)const patternBody = /<body[^>]*>((.|[\n\r])*)<\/body>/imconst arrayMatchesBody = patternBody.exec(text)if (arrayMatchesHead) {text = text.replace('<head>', '<head>')} else if (patternHtml) {text = text.replace('<html>', '<head>' + '</head>')} else if (arrayMatchesBody) {text = text.replace('<body>', '<body>')}// 动态创建iframeconst ifr = document.createElement('iframe')ifr.setAttribute('frameborder', '0')ifr.setAttribute('id', 'iframeResult')ifr.setAttribute('height', '100%')ifr.setAttribute('width', '100%')// 把创建的iframe追加到页面中document.getElementById('iframewrapper').innerHTML = ''document.getElementById('iframewrapper').appendChild(ifr)// 创建标签const style = document.createElement('style')style.innerHTML = '::-webkit-scrollbar {width: 2px;background-color: red;color: red;}'ifr.contentWindow.document.getElementsByTagName('head')[0].appendChild(style)const ifrw = (ifr.contentWindow) ? ifr.contentWindow : (ifr.contentDocument.document) ? ifr.contentDocument.document : ifr.contentDocument// 打开一个新的文档ifrw.document.open()// 编写文档ifrw.document.write(text)// 关闭文档操作ifrw.document.close()},submitCode (item) {if (item == 1) {this.code = dedent`
<!DOCTYPE html>
<html lang="en"></html>`} else if (item == 2) {this.code = dedent`
<!DOCTYPE html>
<html lang="en">
<body>
${'<\/script>'}
</body></html>`} else if (item == 3) {this.code = dedent`
<!DOCTYPE html>
<html lang="en"><head></head><body>${'<\/script>'}
</body></html>
`} else if (item == 4) {this.code = dedent`
<!DOCTYPE html>
<html lang="en"><head>
</head><body><script type="module">${'<\/script>'}
</body></html>
`} else if (item == 5) {this.code = dedent`
<!DOCTYPE html>
<html lang="en"></html>
`} else if (item == 6) {this.code = dedent`
<!DOCTYPE html>
<html lang="en"></html>
`} else {this.code = null;}this.submitHtml()},// 刷新submitBack () {// 根据刷新的地址请求html文本// 点击刷新,拿到当前hash,并去除井号const path = this.$route.hash.slice(1)this.submitCode(path);},// 模糊搜索inputSeachClick () {// 无输入停止if (this.inputSeach.length === 0) {return false}},// 打开就拿到key值showPage (key) {},getMutilines (data) {let content = new String(data);let start = content.indexOf('/*') + 3;let stop = content.lastIndexOf('*/');return content.substring(start, stop);},// 当选中的选项不同时,展示不同的内容,key子选项卡index的值,keyPath [复选项卡的index,子选项卡的index]handleSelect (key, keyPath) {// 如果key的值为空或者未定义 停止向下执行if (key === 'undefined' || key === '') return falsethis.submitCode(key.slice(1));}},getCode (id) {},// 生命周期 - 创建完成(可以访问当前this实例)created () {// 监听hash的变化const _this = thiswindow.addEventListener('hashchange', function () {_this.submitBack()}, false)},// 生命周期 - 挂载完成(可以访问DOM元素)mounted () {// 当页面渲染完成后加载this.$nextTick(function () {// 点击时,刷新展示最开始展示的文档this.submitBack()})},beforeCreate () { }, // 生命周期 - 创建之前beforeMount () { }, // 生命周期 - 挂载之前beforeUpdate () { }, // 生命周期 - 更新之前updated () { }, // 生命周期 - 更新之后beforeDestroy () { }, // 生命周期 - 销毁之前destroyed () { }, // 生命周期 - 销毁完成activated () { } // 如果页面有keep-alive缓存功能,这个函数会触发
}
</script>
<style lang='less' scoped>
//@import url(); 引入公共css类
.containner {display: flex;box-sizing: border-box;position: absolute;padding-top: 77px;width: 100%;height: 100%;min-width: 1600px;background-color: #181a1b;// border: 1px solid white;.nav {height: 100%;min-width: 240px;background-color: #181a1b;.el-menu {border: none;}/deep/.el-submenu__title {border-radius: 10px;margin: 10px;// border-bottom: 1px solid rgba(204, 204, 204, 0.7);}.nav_top {height: 30px;width: 85%;background-color: #3a3b3c;border-radius: 10px;display: flex;margin: 0 auto;margin-top: 2px;.input {width: 80%;z-index: 9999;/deep/.el-input__inner {height: 30px;padding: 0 10px;color: rgb(235, 235, 235);border: none;background-color: rgba(143, 143, 143, 0);}}.img_seach {flex: 1;display: flex;justify-content: center;align-items: center;z-index: 9999;img {width: 18px;height: 18px;display: block;}}}}/deep/.el-input__inner {border-radius: 0% !important;}.el-menu-item.is-active {background-color: #8d8d8d1a !important;border-radius: 20px;}// 编辑器部分.wrap {box-sizing: border-box;height: 100%;flex: 1;.top {height: 25px;width: 100%;}/deep/.splitter-pane-resizer {background-color: #959595;// opacity: 0.5;}.doc {box-sizing: border-box;width: 100%;height: 100%;// background-color: #181a1b6c;background: linear-gradient(to left,rgba(0, 0, 0, 0.247),#181a1bd3,#181a1b) !important;backdrop-filter: saturate(180%) blur(20px);color: rgb(56, 56, 56);padding: 15px;// 火狐隐藏滚动条overflow-y: scroll;scrollbar-color: transparent transparent;scrollbar-track-color: transparent;-ms-scrollbar-track-color: transparent;}}/deep/ .CodeMirror-code {margin: 10px;margin-top: 20px;margin-bottom: 500px;margin-left: 0;}/deep/ .el-menu-item {margin: 10px;border-radius: 20px;}/deep/.CodeMirror-lines {padding-left: 10px;}.btns {box-sizing: border-box;width: 100%;height: 36px;display: flex;justify-content: center;// background-color: #fff;// border-left: 1px solid #ccc;.el-button {width: 100%;height: 30px;border-radius: 10px;padding: 0;margin: 2px 20px;text-align: center;line-height: 20px;z-index: 9999;}.el-button--primary {background-color: #242526;border-color: #242526;}}.el-button--primary:hover {background-color: #4d4f52;border-color: #4d4f52;}.edit {height: 100%;box-sizing: border-box;.code {box-sizing: border-box;height: 800px;width: 100%;}}
}#iframewrapper {width: 98%;height: 99%;// min-width: 1300px;margin: 10px;margin-top: 0;box-sizing: border-box;border-radius: 20px;// border: 1px solid rgba(204, 204, 204, 0.7);background-color: #242526;
}
</style>// 全局样式
<style>
.CodeMirror {box-sizing: border-box;height: 100%;overflow-y: scroll;margin-top: 10px;margin-left: 10px;margin-right: 10px;border-radius: 10px;scrollbar-color: transparent transparent;scrollbar-track-color: transparent;-ms-scrollbar-track-color: transparent;
}
</style>


http://chatgpt.dhexx.cn/article/8eFZwE9x.shtml

相关文章

三款好用的前端代码编辑器推荐

想学web前端开发&#xff0c;那么必然离不开一款实用的代码编辑器&#xff0c;了解一些代码编辑器及其功能和快捷方式可以让开发人员在工作效率方面获得巨大优势。下面小千就整理了三款常用web前端代码编辑器&#xff0c;一起来看看吧。 1、Visual Studio Code 微软的Visual…

这7个web前端开发写代码软件,你过用几个?

群里的朋友,经常问到web前端开发写代码用那个软件好?今天在这里统一回答下,主流的web前端开发写代码的软件有这些Webstorm、Vscode、Sublime Text、HBuilder、Dreamweaver、notepad++、editplus等,做前端这么多年了,下面谈下我的使用感受吧。 1.WebStorm【推荐】 WebStorm…

你居然不知道前端常用的这6种编辑器

前端常用的6种编辑器 Visual Studio Code 下载地址&#xff1a;https://code.visualstudio.com/ 介绍&#xff1a; Visual Studio Code简称VS Code&#xff0c;是一款由微软开发且跨平台的免费代码编辑器&#xff0c;该软件功能十分强大&#xff0c;功能和插件也非常的全面&…

和菜鸟一起学电子小玩意之四轴飞行器原理

前几天看到个视频&#xff0c;觉得四轴飞行器很赞&#xff0c;于是乎想研究下&#xff0c;准备做一个玩玩。凡事还得先从基础开始。先学习下四轴的工作原理&#xff0c;那样&#xff0c;对以后的开发也相对来说方便多了。下面摘抄了一篇好文章&#xff0c;结合图形&#xff0c;…

多旋翼无人机进阶教程

无人机是一个系统的工程&#xff0c;不可谓不庞大。 开源飞控盛行&#xff0c;重复造轮子的工作实在无需再做。 但是若决定真正的去研究飞控&#xff0c;必须从本质出发&#xff0c;熟悉并了解其实现原理。 纷繁复杂的资料&#xff0c;让人无法分辨。 笔者不才&#xff0c;…

四轴飞行器入门——飞行器的硬件结构

引言 本篇文章主要介绍四轴飞行器的硬件结构。前半篇文章介绍每种硬件的作用&#xff0c;后半部分会讲一些硬件选型的相关知识。 本文大部分内容为原创&#xff0c;少部分内容搬运自其它博客或文章。对于搬运过来的内容&#xff0c;文末附上原文链接。 飞行器的硬件结构 以…

F450四旋翼搭建

这次是用Pixhawk飞控搭建四旋翼&#xff01; 一、底板焊接 将四个电调以及XT60电源线焊接在底板上&#xff0c;注意线穿过底板留出的孔&#xff0c;红白线对应正负极&#xff0c;同时焊点不能太大&#xff0c;会阻挡以后电池的安装。 二、电机香蕉头焊接和套上热缩管 香蕉头…

四轴飞行器姿态控制

四轴飞行器姿态控制 一、姿态解算相关概念 1.欧拉角 用来表示三维空间中运动物体绕坐标轴旋转的情况&#xff0c;即物体每时每秒的姿态可以由欧拉角表示。 2.四元数 四元数用于物体的旋转&#xff0c;是一种复杂但是效率较高的旋转方式。 对于一个物体的旋转&#xff0c…

四轴飞行器学习笔记

四轴飞行器学习笔记 程序员除了素质一无所有 纯手工打造 独具匠心 Mr_zhang 访问此博客 好评 非常好评 极度好评 文章目录 **四轴飞行器学习笔记**访问此博客 四轴飞行器飞行原理其基本的运动状态分别为机翼陀螺仪**倾角传感器**(角度传感器&#xff0c;并不是四轴飞行器常用部…

一起DIY四轴飞行器(一)项目简介

前言 前段时间看到一篇博客&#xff0c;利用开源的飞控&#xff0c;自己DIY的四轴飞行器&#xff0c;内心就开始躁动&#xff0c;想自己也DIY一架四轴飞行器。本系列博客&#xff0c;记录业余时间DIY的过程&#xff0c;个人能力有限&#xff0c;中间肯定会遇到很多困难&#xf…

图文并茂详细教程之-- 用pixhawk飞控组装一台F450四轴无人机(下)

摘自&#xff1a;https://mp.weixin.qq.com/s/1vXfYPgaQEkXLfpSnjJqAw 图文并茂详细教程之-- 用pixhawk飞控组装一台F450四轴无人机&#xff08;下&#xff09; CJKK 苍穹四轴DIY 2019-11-15 第八步 失控保护设置 PIX 的失控保护是通过 故障保护 菜单配置的&#xff0c;点…

四旋翼飞行器教学笔记1 ——四轴飞行器飞行原理简介

顾名思义&#xff0c;四轴飞行器由四个螺旋桨高速旋转产生升力&#xff0c;为其提供飞行动力。 四个电机转向正反各两个&#xff0c;可以相互抵消反扭矩。不同于常规固定翼飞机&#xff0c;多旋翼无人机属于静不稳定系统&#xff0c;因此必须依赖于强大的飞控系统才能飞行。 …

四轴飞控DIY调试起飞简明步骤

四轴飞控DIY调试起飞简明步骤 调试起飞简明步骤Step1&#xff1a;飞控配置Step2&#xff1a;试飞目标测试内容坐标系 Step3&#xff1a;试飞方法1.升降&#xff08;Throttle&#xff09;2.偏航&#xff08;yaw&#xff09;3.俯仰&#xff08;Pitch&#xff09;4.翻滚&#xff0…

飞越650四轴无人机安装全程详解(多图)

飞越650四轴无人机安装全程详解&#xff08;多图&#xff09; 本文根据自己的安装实际过程&#xff0c;总结了开箱后一个比较合理的650四轴无人机安装顺序&#xff0c;以及各个步骤的注意事项&#xff0c;主要内容包括&#xff1a; 系统基本配置 机架安装 安装机臂与机架上板…

1-2 四轴飞行器基本原理

关于基本原理这里只作简单的介绍 无刷电机转动都会有个反扭力&#xff0c;但是显然飞机必须平衡才能好好飞行&#xff0c;所以四旋翼无人机一般都会有两个正转的电机&#xff0c;两个反转的电机&#xff0c;且处于对角线位置&#xff0c;这样的布局就是为了平衡每个电机反扭力。…

图文并茂详细教程之--用pixhawk飞控组装一台F450四轴无人机(上)

摘自&#xff1a;https://mp.weixin.qq.com/s/24Sdne3Yw4LOaMwTHzgF-Q 图文并茂详细教程之--用pixhawk飞控组装一台F450四轴无人机&#xff08;上&#xff09; 原创 CJKK 苍穹四轴DIY 2019-11-15 前面的教程已经详细介绍了如何使用Pixhawk飞控组装一台S500无人机。因为很多…

四轴飞行器的设计与开发过程

文章目录 一、系统组成模块1、上位机 &#xff08;PC&#xff09;2、遥控器系统3、飞行器机体系统3.1 接收遥控器无线数据&#xff0c; 并发送飞行数据到遥控器无线通信模块 Nordic NRF24L013.2 采集传感器数据并进行姿态解算&#xff08;1&#xff09;陀螺仪 &#xff08;角速…

用开源飞控套件做一架Mini四轴飞行器

用开源飞控套件做一架Mini四轴飞行器 四轴飞行器已经不是什么新鲜的东西&#xff0c;世界上很多不太平的地方也用某疆的四轴做侦察&#xff0c;你只要花几千块钱&#xff0c;就可以买到一套“进入白宫同款”的四轴无人机。不过&#xff0c;要是能亲手制作一架比手掌还小、仅重3…

如何控制四轴飞行器四个方向飞行

四旋翼飞行器通过调节四个电机转速来改变旋翼转速&#xff0c;实现升力的变化&#xff0c;从而控制飞行器的姿态和位置。四旋翼飞行器是一种六自由度的垂直升降机&#xff0c;但只有四个输入力&#xff0c;同时却有六个状态输出&#xff0c;所以它又是一种欠驱动系统。 以四轴…

四轴飞控DIY简明步骤介绍

新手四轴飞控DIY组装简明步骤介绍 1. 什么叫做新手&#xff1f;2. 新手如何思考&#xff1f;3. 上手步骤Step1&#xff1a;四轴飞控介绍定义运动原理组成 Step2&#xff1a;四轴飞控组装视频Step3&#xff1a;四轴飞控新手规格定义需求考量规格 Step4&#xff1a;四轴飞控组件分…