vue实现xml,sql,JSON自动格式化高亮

news2024/11/15 10:30:22

实现xml,json,sql代码组件格式化高亮:
需要下载的依赖:
在这里插入图片描述

<template>
	<div class="box">
		<div class="top" v-if="flag">
			<span class="text">Theme:</span>
			<el-select v-model="defaultOptions.theme" placeholder="请选择编辑器主题" class="select" @change="changeTheme">
				<el-option v-for="(theme, index) in themes" :key="index" :label="theme.label"
					:value="theme.value"></el-option>
			</el-select>
			<span class="text">Language:</span>
			<el-select v-model="defaultOptions.language" placeholder="请选择格式化语言" class="select">
				<el-option v-for="(item, index) in languageList" :key="index" :label="item.label" :value="item.value">
				</el-option>
			</el-select>
			<el-button type="primary" plain class="btn" @click="formatCode">格式化</el-button>
			<el-button type="primary" plain class="btn" @click="clearSelection">清空</el-button>
		</div>
		<div :style="{ height, width }" :id="`monacoEditorContainer${index}`" class="container" @mouseleave="handleValue"></div>
	</div>
</template>
 
<script>
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js';
import 'monaco-editor/esm/vs/editor/contrib/folding/folding.js';
// 代码高亮(将所有支持的语言全部显示)
import 'monaco-editor/esm/vs/basic-languages/monaco.contribution'
import { format } from 'sql-formatter';
import prettyData from 'pretty-data/pretty-data';
// 用于xml语法校验
import xml2js from 'xml2js';


export default {
	props: {
		flag: { //顶部按钮是否显示
			type: Boolean,
			default: true
		},
		options: {
			type: Object,
			default: () => {
			}
		},
		code: {
			type: String,
		},
		height: {
			type: String,
			default: '90%'
		},
		width: {
			type: String,
			default: '100%'
		},
		index: {
			type: String,
			default: "01"
		},
	},
	data() {
		return {
			defaultOptions: {
				value: '', // 编辑器的值
				language: 'xml', //语言
				folding: true, // 是否折叠
				theme: 'vs-dark', // 编辑器主题:vs, hc-black, or vs-dark
				autoIndent: true, // 自动缩进
				wordWrap: 'on', // 启用自动换行
				readOnly: false, // 是否只读
			},
			languageList: [
				{ value: 'sql', label: 'SQL' },
				{ value: 'javascript', label: 'JSON' },
				{ value: 'xml', label: 'XML' },
			],
			themes: [
				{ value: 'vs', label: 'vs' },
				{ value: 'vs-dark', label: 'vs-dark' },
				{ value: 'hc-black', label: 'hc-black' }
			],
			monacoEditor: null
		};
	},
	mounted() {
		this.createMonacoEditor();
	},
	watch: {
		options: {
			handler() {
				this.$nextTick(() => {
					this.monacoEditor.updateOptions(this.standaloneEditorConstructionOptions)
				})
			},
			deep: true
		},
		code: {
			handler(newCode) {
			this.$nextTick(() => {
				// 将新数据显示在monacoEditor上
				this.monacoEditor.setValue(newCode);
				this.formatCode();
			});
			},
			deep: true,
			immediate: true,
		}
	},
	computed: {
		standaloneEditorConstructionOptions() {
			const options = Object.assign(this.defaultOptions, this.options);
			if (options.language.toUpperCase() === "JSON") {
				options.language = "javascript";
			}
			return options;
		}
	},
	methods: {
		formatCode() {
			const code = this.monacoEditor.getValue();
			if (!code.trim() || !this.defaultOptions.language) {
				//  值为空或者语言为空,不执行格式化操作
				return;
			}
			let formattedCode;
			switch (this.defaultOptions.language) {
				case 'sql':
					formattedCode = format(code);
					break;
				case 'javascript':
					try {
						JSON.parse(code); 
						formattedCode = prettyData.pd.json(code);
					} catch (error) {
						this.$message.error(`JSON 解析错误: ${error}`);
						return;
					}
					break;
				case 'xml':
					try {
						// 使用 xml2js 库进行 XML 校验
						const parser = new xml2js.Parser();
						parser.parseString(code, (error) => {
						if (error) {
							this.$message.error(`XML 解析错误: ${error}`);
							// Message.error(`XML 解析错误: ${error}`);
							return;
						}
						});
						formattedCode = prettyData.pd.xml(code);
					} catch (error) {
						return;
					}
					break;
				default:
					return;
			}
			monaco.editor.setModelLanguage(this.monacoEditor.getModel(), this.defaultOptions.language);
			const model = this.monacoEditor.getModel();
			const formattedContent = {
				range: model.getFullModelRange(),
				text: formattedCode,
			};
			this.monacoEditor.executeEdits('format', [formattedContent]);
		},
		createMonacoEditor() {
			const container = document.getElementById(`monacoEditorContainer${this.index}`);
			this.monacoEditor = monaco.editor.create(container, this.standaloneEditorConstructionOptions);
		},
		clearSelection() {
			this.monacoEditor.setValue('');
		},
		changeTheme() {
			monaco.editor.setTheme(this.defaultOptions.theme);
		},
		handleValue() {			
			this.formatCode();
			this.$emit('getValue', this.monacoEditor.getValue())
			// 鼠标失去焦点
			document.activeElement.blur();
		},
	},
};
</script>
 
<style scoped lang="less">
.box {
	width: 100%;
	height: 100%;

	.top {
		margin-bottom: 10px;
		.text {
			margin-right: 4px;
		}

		.btn {
			margin-right: 20px;
			margin-left: 0px;
		}

		.select {
			width: 200px!important;
			margin-right: 20px;
		}
	}

	.container {
		// width: 100%;
		// height: 90%;
		// margin-top: 20px;
	}
}
</style>
 

实现效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微擎安装,卡在“安装微擎”界面

进入install.php&#xff0c;点击【在线安装】 下一步配置数据库&#xff0c;开始安装系统 然后显示进度条&#xff0c;进度条一闪而过 然后就没有进度条显示了&#xff0c;一直卡在这里 第一次等了好久&#xff0c; 删除目录下的文件&#xff0c;重装还是这样 再重启服务器&…

嵌入式蓝桥杯做题总结

第十二届省赛 按键代码 ——自认为比较巧妙&#xff0c;定时器3被设置为10ms进入一次中断&#xff0c;代替了HAL_Delay(10)的方法消抖&#xff1b; 运用状态机机思想实现检测多个按键检测——且分为两个状态&#xff0c;其中一个状态PB&#xff11;和PB&#xff12;的按键不…

Claude 3 模型列表

claude-3-opus-20240229 这个模型就好

解锁AI大模型秘籍:未来科技的前沿探索

在当今这个技术高速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了我们生活中不可或缺的一部分。从简单的个人助手到复杂的数据分析和决策制定&#xff0c;AI的应用范围日益扩大&#xff0c;其目的是为了让我们的生活变得更加智能化。本文旨在探讨AI如何…

计网面试题整理下

1. HTTP常见的状态码有哪些&#xff1f; 常见状态码&#xff1a; 200&#xff1a;服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。301 &#xff1a; (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时&am…

STM32CubeMX学习笔记10 ---低功耗模式

在实际使用中很多产品都需要考虑低功耗的问题&#xff0c;STM32F10X提供了三种低功耗模式&#xff1a;睡眠模式&#xff08;Sleep mode&#xff09;、停机模式&#xff08;Stop mode&#xff09;和待机模式&#xff08;Standby mode&#xff09;。这些低功耗模式可以有效减少系…

gRPC-第二代rpc服务

在如今云原生技术的大环境下&#xff0c;rpc服务作为最重要的互联网技术&#xff0c;蓬勃发展&#xff0c;诞生了许多知名基于rpc协议的框架&#xff0c;其中就有本文的主角gRPC技术。 一款高性能、开源的通用rpc框架 作者作为一名在JD实习的Cpper&#xff0c;经过一段时间的学…

使用postman测试若依登录接口API-2

请求方式 由于登录控制器可知&#xff1a;该请求方式为Post请求 请求地址 在请求路径栏输入请求地址&#xff0c;如下图所示&#xff1a; 参数体 在Body键入所需参数&#xff0c;类型选择raw,数据格式选择"JSON"&#xff1a;如下图所示&#xff1a; 认证成功与失败…

SpringBoot-Thymeleaf

1.概念 Thymeleaf是一个模板引擎&#xff0c;它可以在我们开发前后端混合应用时发挥动态的从后端获取数据&#xff0c;并且展示在前端页面&#xff0c;它的出现代替了JSP 2.入门程序 分析Thymeleaf的源码可知&#xff0c;他的默认路径是templates&#xff0c;并且文件的后缀必须…

低代码平台开发实践:基于React的高效构建与创新【文末送书-29】

文章目录 背景低代码平台简介基于React的优势低代码平台的实际应用 低代码平台开发实践&#xff1a;基于React【文末送书-29】 背景 随着技术的不断进步和业务需求的日益复杂&#xff0c;低代码平台成为现代软件开发领域中备受关注的工具之一。在这个快节奏的时代&#xff0c;…

【QT】Qt Charts概述

目录 1 QtCharts模块 2 图表的主要组成部分 2.1 QChartView的功能 2.2 序列 2.3 坐标轴 2.4 图例 3 一个简单的QChart绘图程序 QtCharts是Qt提供的图表模块&#xff0c;在Qt5.7以前只有商业版才有Qt Charts&#xff0c;但是从Qt5.7开始&#xff0c;社区版本也包含了Qt C…

fortigate 防火墻通過CLT命令行 downgrade降級IOS

​Troubleshooting Tip: Downgrade of FortiOS fails due to BIOS check 通過u盤放入2個文件(Os命名為image.out,配置文件命名為fgt_system.conf),插入 fortigate 防火墻。一般防火墻就自動更新OS,但如果要降級,不會自動更新,需要在CLT裡頭操作一些設置後才能順利降級 …

指针中的回调函数与qsort的深度理解与模拟

今天给大家在更新一下指针类型的知识&#xff0c;这里讲到了一个库函数sqort&#xff0c;以及回调函数的理解。 望喜欢 目录 回调函数 qsort函数 qsort模拟实现 回调函数 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数…

Java - 获取汉字大写首字母输出

背景 有个项目需要将一批字符串的拼音首字母输出并大写&#xff0c;写了个工具类。 实现 需要引入外部jar。 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version> </dep…

数字人解决方案——阿里EMO音频驱动肖像生成能说话能唱歌的逼真视频

前言 数字可以分为3D数字人和2D数字人。3D数字人以虚幻引擎的MetaHuman为代表&#xff0c;而2D数字人则现有的图像或者视频做为输入&#xff0c;然后生成对口型的数字人&#xff0c;比如有SadTalker和Wav2Lip。 SadTalker&#xff1a;SadTalker是一种2D数字人算法&#xff0c;…

Android 中get请求网络数据 详细举例

请求链接 https://api.bilibili.com/x/web-interface/ranking 1.添加网络权限 依赖等 implementation com.squareup.okhttp3:okhttp:4.9.3 implementation com.google.code.gson:gson:2.8.92.写请求类network package com.example.myapplication;import android.graphics.Bi…

【C语言】Leetcode 876. 链表的中间节点

主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《Leetcode》 题目 通过题目的要求可以判断出有两种示例要解决&#xff0c;一种是偶数节点的链表&#xff0c;一种是奇数节点的链表&#xff0c;应对这两种情况我们需要使程序对二者都可以兼容。 解决思路 struct ListNode…

【论文精读】I-JEPA

摘要 计算机视觉中&#xff0c;常采用基于不变性和基于生成的方法进行自监督学习。对比学习&#xff08;CL&#xff09;是典型的基于不变性的方法&#xff0c;通过预训练方法优化编码器&#xff0c;使其能生成同一图像的两个或多个视图的相似嵌入&#xff0c;其中图像视图通常由…

Linux安全加固功能

提示:工具下载链接在文章最后 目录 一.加固功能介绍二.配置加固功能1.配置安全加固功能1.1 开放目前设备监听的所有端口1.2 只开放80、443、20、21、22端口1.3 防火墙配置工具1.3.1 开放允许访问的端口1.3.2 删除允许访问的端口1.3.3 添加IP地址允许访问规则1.3.4 添加IP地址禁…