VUE2.0集成 Markdown 编辑器

news2024/11/18 13:57:52

Markdown编辑器的使用
这是一款基于Vue的markdown编辑器。既可以用来编辑Markdown语法,又可以用来解析
效果图,mavonEditor实现了Markdown集成
Markdown是一种标记语言,相较于word文档更加清晰方便,适合进行笔记等。将Markdown集成进入自己项目之后,就可以在项目中使用的Markdown编辑器了
1、安装mavonEditor包
mavon-editor:  2.10.4版本

npm install mavon-editor --s
or
npm install mavon-editor --save

第一步: 导入相关的配置: 


第二步:  还是导入配置

第三步: 写一个按钮来跳入富文本的一个页面

       <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleCoding(scope.row)"
          >编写代码</el-button>


  /**
     * 编写代码的功能
     */
    handleCoding() {
      this.$router.push('/index2')
    },

第四步: 继续编写富文本的代码: 

<template>
  <div>
    <EditorBaidu v-bind:content="content" id="editor" ref="refUEditor"></EditorBaidu>
    <el-button type="primary" size="mini" @click="save">保存</el-button>
  </div>
</template>


<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等),
//例如:import 《组件名称》 from '《组件路径》,
import RuleEngine from "@/views/rules/rules/index.vue";

import VueUeditorWrap from "vue-ueditor-wrap";
import EditorBaidu from "@/components/EditorBaidu/index.vue";
import {FuEngine} from "@/api/rules/rules";

export default {
  //import引入的组件需要注入到对象中才能使用"
  components: {EditorBaidu, VueUeditorWrap, RuleEngine},
  props: {},
  data() {
    //这里存放数据"

    return {
      content:''
    };
  },
  //计算属性 类似于data概念",
  computed: {},
  //监控data中的数据变化",
  watch: {},
  //方法集合",
  methods: {
    // 获取纯文本内容
    getText() {
      alert(UE.getEditor('editor').selection.getText())
      return this.UE.getEditor('editor').selection.getText();
    },
    // 获取富文本内容
    getContent() {
      return this.UE.getEditor('editor').getContent()
    },
    save() {
      alert(this.$refs.refUEditor.getText())
      FuEngine(this.$refs.refUEditor.getText()).then(res => {
        if (res.code ==200){
          this.$message.success(res.msg)
        }else {
          this.$message.error(res.msg)
        }
      })
    }
  },
  //声明周期 - 创建完成(可以访问当前this实例)",
  created() {
  },
  //声明周期 - 挂载完成(可以访问DOM元素)",
  mounted() {
  },
};
</script>
<style scoped>


</style>

官网: Editor.md - 开源在线 Markdown 编辑器

idea里面进行测试

这里是一个封装的demo代码:

package compiler.mydemo;

import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.FileObject;
import javax.tools.ForwardingJavaFileManager;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Create by andy on 2018-12-06 21:25
 */
public class CustomStringJavaCompiler {
    //类全名
    private String fullClassName;
    private String sourceCode;
    //存放编译之后的字节码(key:类全名,value:编译之后输出的字节码)
    private Map<String, ByteJavaFileObject> javaFileObjectMap = new ConcurrentHashMap<>();
    //获取java的编译器
    private JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    //存放编译过程中输出的信息
    private DiagnosticCollector<JavaFileObject> diagnosticsCollector = new DiagnosticCollector<>();
    //执行结果(控制台输出的内容)
    private String runResult;
    //编译耗时(单位ms)
    private long compilerTakeTime;
    //运行耗时(单位ms)
    private long runTakeTime;


    public CustomStringJavaCompiler(String sourceCode) {
        this.sourceCode = sourceCode;
        this.fullClassName = getFullClassName(sourceCode);
    }

    /**
     * 编译字符串源代码,编译失败在 diagnosticsCollector 中获取提示信息
     *
     * @return true:编译成功 false:编译失败
     */
    public boolean compiler() {
        long startTime = System.currentTimeMillis();
        //标准的内容管理器,更换成自己的实现,覆盖部分方法
        StandardJavaFileManager standardFileManager = compiler.getStandardFileManager(diagnosticsCollector, null, null);
        JavaFileManager javaFileManager = new StringJavaFileManage(standardFileManager);
        //构造源代码对象
        JavaFileObject javaFileObject = new StringJavaFileObject(fullClassName, sourceCode);
        //获取一个编译任务
        JavaCompiler.CompilationTask task = compiler.getTask(null, javaFileManager, diagnosticsCollector, null, null, Arrays.asList(javaFileObject));
        //设置编译耗时
        compilerTakeTime = System.currentTimeMillis() - startTime;
        return task.call();
    }

    /**
     * 执行main方法,重定向System.out.print
     */
    public void runMainMethod() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, UnsupportedEncodingException {
        PrintStream out = System.out;
        try {
            long startTime = System.currentTimeMillis();
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            PrintStream printStream = new PrintStream(outputStream);
            //PrintStream PrintStream = new PrintStream("/Users/andy/Desktop/tem.sql"); //输出到文件
            System.setOut(printStream);

            StringClassLoader scl = new StringClassLoader();
            Class<?> aClass = scl.findClass(fullClassName);
            Method main = aClass.getMethod("main", String[].class);
            Object[] pars = new Object[]{1};
            pars[0] = new String[]{};
            main.invoke(null, pars); //调用main方法
            //设置运行耗时
            runTakeTime = System.currentTimeMillis() - startTime;
            //设置打印输出的内容
            runResult = new String(outputStream.toByteArray(), "utf-8");
        } finally {
            //还原默认打印的对象
            System.setOut(out);
        }

    }

    /**
     * @return 编译信息(错误 警告)
     */
    public String getCompilerMessage() {
        StringBuilder sb = new StringBuilder();
        List<Diagnostic<? extends JavaFileObject>> diagnostics = diagnosticsCollector.getDiagnostics();
        for (Diagnostic diagnostic : diagnostics) {
            sb.append(diagnostic.toString()).append("\r\n");
        }
        return sb.toString();
    }

    /**
     * @return 控制台打印的信息
     */
    public String getRunResult() {
        return runResult;
    }


    public long getCompilerTakeTime() {
        return compilerTakeTime;
    }

    public long getRunTakeTime() {
        return runTakeTime;
    }

    /**
     * 获取类的全名称
     *
     * @param sourceCode 源码
     * @return 类的全名称
     */
    public static String getFullClassName(String sourceCode) {
        String className = "";
        Pattern pattern = Pattern.compile("package\\s+\\S+\\s*;");
        Matcher matcher = pattern.matcher(sourceCode);
        if (matcher.find()) {
            className = matcher.group().replaceFirst("package", "").replace(";", "").trim() + ".";
        }

        pattern = Pattern.compile("class\\s+\\S+\\s+\\{");
        matcher = pattern.matcher(sourceCode);
        if (matcher.find()) {
            className += matcher.group().replaceFirst("class", "").replace("{", "").trim();
        }
        return className;
    }

    /**
     * 自定义一个字符串的源码对象
     */
    private class StringJavaFileObject extends SimpleJavaFileObject {
        //等待编译的源码字段
        private String contents;

        //java源代码 => StringJavaFileObject对象 的时候使用
        public StringJavaFileObject(String className, String contents) {
            super(URI.create("string:///" + className.replaceAll("\\.", "/") + Kind.SOURCE.extension), Kind.SOURCE);
            this.contents = contents;
        }

        //字符串源码会调用该方法
        @Override
        public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
            return contents;
        }

    }

    /**
     * 自定义一个编译之后的字节码对象
     */
    private class ByteJavaFileObject extends SimpleJavaFileObject {
        //存放编译后的字节码
        private ByteArrayOutputStream outPutStream;

        public ByteJavaFileObject(String className, Kind kind) {
            super(URI.create("string:///" + className.replaceAll("\\.", "/") + Kind.SOURCE.extension), kind);
        }

        //StringJavaFileManage 编译之后的字节码输出会调用该方法(把字节码输出到outputStream)
        @Override
        public OutputStream openOutputStream() {
            outPutStream = new ByteArrayOutputStream();
            return outPutStream;
        }

        //在类加载器加载的时候需要用到
        public byte[] getCompiledBytes() {
            return outPutStream.toByteArray();
        }
    }

    /**
     * 自定义一个JavaFileManage来控制编译之后字节码的输出位置
     */
    private class StringJavaFileManage extends ForwardingJavaFileManager {
        StringJavaFileManage(JavaFileManager fileManager) {
            super(fileManager);
        }

        //获取输出的文件对象,它表示给定位置处指定类型的指定类。
        @Override
        public JavaFileObject getJavaFileForOutput(Location location, String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException {
            ByteJavaFileObject javaFileObject = new ByteJavaFileObject(className, kind);
            javaFileObjectMap.put(className, javaFileObject);
            return javaFileObject;
        }
    }

    /**
     * 自定义类加载器, 用来加载动态的字节码
     */
    private class StringClassLoader extends ClassLoader {
        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            ByteJavaFileObject fileObject = javaFileObjectMap.get(name);
            if (fileObject != null) {
                byte[] bytes = fileObject.getCompiledBytes();
                return defineClass(name, bytes, 0, bytes.length);
            }
            try {
                return ClassLoader.getSystemClassLoader().loadClass(name);
            } catch (Exception e) {
                return super.findClass(name);
            }
        }
    }
}

 测试代码:

package compiler.mydemo;

/**
 * Create by andy on 2018-12-06 15:21
 */
public class Test1 {

    public static void main(String[] args) {
        String code = "public class HelloWorld {\n" +
                "    public static void main(String []args) {\n" +
                "\t\tfor(int i=0; i < 1; i++){\n" +
                "\t\t\t       System.out.println(\"Hello World!\");\n" +
                "\t\t}\n" +
                "    }\n" +
                "}";
        CustomStringJavaCompiler compiler = new CustomStringJavaCompiler(code);
        boolean res = compiler.compiler();
        if (res) {
            System.out.println("编译成功");
            System.out.println("compilerTakeTime:" + compiler.getCompilerTakeTime());
            try {
                compiler.runMainMethod();
                System.out.println("runTakeTime:" + compiler.getRunTakeTime());
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(compiler.getRunResult());
            System.out.println("诊断信息:" + compiler.getCompilerMessage());
        } else {
            System.out.println("编译失败");
            System.out.println(compiler.getCompilerMessage());
        }

    }


}

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

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

相关文章

Matlab使用S函数

什么是S函数&#xff1f; S-函数是系统函数&#xff08;System Function&#xff09;的简称&#xff0c;在 Simulink 中用非图形化的方式来描述一个模块。一个完整的S-函数结构体系包含了描述一个动态系统所需要的全部能力。使用S-函数用户可以向 Simulink 模型中添加自己的模块…

【PCB专题】Allegro中设置泪滴

PCB绘制完成后有时按需要对PCB进行添加泪滴的操作是非常必要的。 添加泪滴的作用主要是: 信号传输时平滑阻抗,减少阻抗的急剧跳变,避免高频信号传输时由于线宽突然变小而造成反射。 焊接时可以保护焊盘,避免多次焊接时焊盘的脱落,生产时可以避免蚀刻不均,以及过孔偏位出…

一键安装和导出当前Python项目的依赖包总结

创建python环境&#xff0c;配置一个python运行项目。在项目可以运行的环境下&#xff0c;导出该项目所依赖包到一个requirements.txt文档中。在另一个纯净环境中&#xff0c;快速批量安装项目所依赖的包&#xff0c;便于快速进行项目迁移 一、导出当前Python项目的依赖包1、方…

【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问

目录 一、虚拟头节点二、数组的随机访问三、动态数组、链表复杂度分析四、动态数组 add(E element) 复杂度分析五、动态数组的缩容 一、虚拟头节点 &#x1f33c; 为了让代码更加精简&#xff0c;统一所有节点的处理逻辑&#xff0c;可以在最前面增加一个虚拟的头节点&#xf…

2023 年最佳 C++ IDE

文章目录 前言1. Visual Studio2. Code::Blocks3. CLion4. Eclipse CDT&#xff08;C/C 开发工具&#xff09;5. CodeLite6. Apache NetBeans7. Qt Creator8. Dev C9. C Builder10. Xcode11. GNAT Programming Studio12. Kite总结 前言 要跟踪极佳 IDE&#xff08;集成开发环境…

嵌入式系统复习要点

目录 1、嵌入式系统的核心部分主要由硬件和软件两部分组成&#xff1a; 2、嵌入式系统硬件&#xff1a; 3、嵌入式处理器从体系上分类&#xff0c;可以分为冯诺依曼结构和哈佛结构两种&#xff1a; 4、几类常见的嵌入式处理器类型&#xff1a; 5、MCU组成结构&#xff1a;…

chatgpt赋能python:介绍:Python经典小游戏合集

介绍&#xff1a;Python经典小游戏合集 作为一门简洁易学、受到广泛喜爱的编程语言&#xff0c;Python已经在各个领域中得到了广泛应用&#xff0c;包括游戏开发。在这篇文章中&#xff0c;我们将为您介绍一些Python编程中的经典小游戏&#xff0c;让您感受到Python的多功能性…

idea乱码的相关问题

idea控制台乱码&#xff08;即&#xff1a;tomacat等启动时的乱码&#xff09; 第一步&#xff1a; 控制台tomcat启动信息乱码解决&#xff08;红色字体&#xff09; 1 在本地 tomcat 的配置文件中找到 logging.properties 文件设置日志输出的编码为 UTF-8 追加的配置信息为…

【Android复习笔记】Handler机制(一)

从 Android 初学者常见的一个错误开始: 导致这个错误的代码通常长下面这样: new Thread(){@Overridepublic void run() {new Handler(); } }.

chatgpt赋能python:Python编程中常见的问题和解决方案

Python编程中常见的问题和解决方案 Python作为一门高级编程语言&#xff0c;广泛用于数据分析、人工智能、Web开发等领域&#xff0c;然而在实际应用中我们不可避免地会遇到许多问题。在本文中&#xff0c;我们将探讨一些常见的Python编程问题以及解决方案。 1. 编码问题 Py…

碰撞检测算法详述

算法的分类 目录 一、基于空间域的碰撞检测算法分类 1. 基于图像空间的碰撞算法 2.基于几何空间的碰撞检测算法 &#xff08;1&#xff09;基于空间剖分算法 &#xff08;2&#xff09;裁剪扫掠法 &#xff08;3&#xff09;基于距离场的算法 &#xff08;4&#xff09;…

ModaHub魔搭社区:向量数据库的工作原理

目录 1. 为什么需要向量数据库 1&#xff09;CPU 工作原理 2&#xff09;GPU 工作原理 3&#xff09;二者的差异 4&#xff09;总结 5&#xff09;大模型的工作原理 学习 推理 1. 为什么需要向量数据库 向量数据库这一概念随着黄仁勋的演讲火爆了之后&#xff0c;不少…

如何使用upupw搭建服务器,并映射外网访问

作为计算机行业从业人员&#xff0c;相信很多人都接触并使用过phpstudy等类似环境集成包&#xff0c;着对于upupw就比较好理解了。UPUPW绿色服务器平台是Windows下很有特色的一款免费服务器PHP套件&#xff0c;UPUPW PHP套件简化了PHP环境搭建步骤&#xff0c;一个压缩包解压到…

chatgpt赋能python:Python经典游戏:从命令行到桌面

Python经典游戏&#xff1a;从命令行到桌面 Python是一个热门的编程语言&#xff0c;尤其在编写游戏方面表现出色。Python允许开发人员使用简单的语法和丰富的库编写高效率的游戏。在这篇文章中&#xff0c;我们将介绍Python的一些经典游戏&#xff0c;包括简单的命令行游戏和…

GithubAction的使用-简单易懂

一、Github Action简介 github Action &#xff08;工作流&#xff09;&#xff0c;简单理解就是自动化部署、测试。也就是之前人工手动部署变为现在由机器&#xff08;服务器&#xff09;自动部署、测试了。 二、对github Action&#xff08;工作流&#xff09;的使用 首先…

〖编程初学者的自我修养 - 满分面试篇①〗- 面试之前需要做的「长期准备工作」

简介&#xff1a;应 850 小伙伴要求&#xff0c; 无论你是迷茫的在校生还是已经就业的老司机&#xff0c;该专栏都值得你订阅&#xff0c;它会让你成就更好的自己&#xff01;说明&#xff1a;该文属于 编程初学者的自我修养 专栏&#xff0c;购买任意白宝书体系化专栏可加入易…

SpringBoot 解决跨站脚本漏洞(XSS)问题

一、问题背景 使用 SpringBoot 的项目出现了跨站脚本漏洞&#xff08;XSS&#xff09;问题。 二、解决方案 步骤如下&#xff1a; 1、添加maven依赖 在 pom.xml 文件中&#xff0c;增加如下依赖&#xff1a; <dependency><groupId>org.apache.tomcat</group…

莫兰指数P值,Z值分析

仔细看完下面两个链接绝对可以明白。写的非常清晰。 白话空间统计之四&#xff1a;P值和Z得分&#xff08;中&#xff09; 白话空间统计之四&#xff1a;P值和Z得分&#xff08;下&#xff09; 个人理解&#xff1a;P值决定了数据有没有显著性&#xff0c;数据能不能用的问题…

什么是 CI/CD ?

说在开头 CI、CD 其实是三个概念&#xff0c;包含了一个 CI 和两个 CD&#xff0c;CI全称 Continuous Integration&#xff0c;表示持续集成&#xff0c;CD包含 Continuous Delivery和 Continuous Deployment&#xff0c;分别是持续交付和持续部署。这三个概念之间是有前后依赖…

chatgpt赋能python:Python如何等分区间

Python如何等分区间 Python是一种高级编程语言&#xff0c;经常用于数据分析和科学计算。在数据分析中&#xff0c;等分数据区间是常见的操作。本文将介绍Python如何等分区间&#xff0c;并提供一些实用的代码示例。 什么是等分区间 等分数据区间是将数据划分为几个大小相等…