KindEditor富文编辑器集成kityformula数学公式

最近做着个考试的项目,有要求数学公式的题目,原来这个项目是使用kindEditor的就不想换了,我看了一下在网上的都是使用jmeditor公式编辑器,但是发现了比较严重的BUG,果断的放弃了,转用kityformula,原来是不支持 kindEditor的,以下是我改造的过程。

我使用的是kindEditor 4.13 在线HTML编辑器

kityformula

1、复制kitformual到kindEditor/plugin的目录下面

2、修改kindeditor-all-min.js(这是我在项目中引用的文件,所以我修改这个),在itmes下面增加 "kityformula"

3、复制kityformula/icons/kityformula.png到kindEditor/themes/default目录下

 4、修改default.css 增加

.ke-toolbar .ke-icon-kityformula {
   width: 16px;
   height: 16px;
   background: url(kityformula.png) 0 0  no-repeat;
}

 5、在kityformula目录下新建一个kityformula.js并修改

 

KindEditor.plugin("kityformula", function(e){
    var self = this, name = 'kityformula';
    var jme_fid = "kityformula_" + Math.ceil(Math.random()*100) ;
    self.clickToolbar(name, function() {
        var dialog = self.createDialog({
            title : '插入公式',
            width : 785,
            height :390,
            onShow:function(){
              alert('hahaha');
            },
            yesBtn:{
                name:"保存",
                click:function (e) {


                    var ifr = document.getElementById(jme_fid).contentWindow.onok(self);

                    setTimeout(function () {
                        self.hideDialog().focus();
                    },100);

                    return true;
                }
            },

            body:'<div style="width:800px;height:600px;">' +
                     '<iframe id="'+jme_fid+'" style="width:785px;height:390px;" frameborder="no" src=" '+ KindEditor.basePath + 'plugins/kityformula/kityFormulaDialog.html"></iframe></div>'


        });
    });

});



function getIFrameDOM(fid){
    var fm = getIFrame(fid);
    return fm.document||fm.contentDocument;
}

function getIFrame(fid){
    return document.getElementById(fid)||document.frames[fid];
}

 

6、修改kityformula目录下的kityFormulaDialog.html

 将原来的代码注析掉,由于在kindEditor下是使用iframe调用的,需要配置与子页面通讯的方法

<script>

    var factory, kfe = null;

    $(function () {

        $( "#tips").html('<div id="loading"><img src="kityformula/loading.gif" alt="loading" /><p>正在加载,请耐心等待...</p></div>' );

        window.k = {
           init:function () {
               $( "#tips").html('<div id="loading"><img src="kityformula/loading.gif" alt="loading" /><p>正在加载,请耐心等待...</p></div>' );
               return new Promise(function (resolve) {
                   if(kfe == null){

                       factory = kf.EditorFactory.create( $( "#kfEditorContainer" )[ 0 ], {
                           render: {
                               fontsize: 24
                           },
                           resource: {
                               path: "./kityformula/resource/"
                           }
                       } );

                       factory.ready( function ( KFEditor ) {

                           $( "#tips").remove();
                           this.execCommand( "render", null || "\\placeholder" );
                           this.execCommand( "focus" );

                           kfe = this;
                           resolve(kfe);
                       });


                   }else{
                       resolve(kfe);
                   }
               });


           } ,

            setMessage :function() {
                try {
                    kfe.execCommand( "render", sessionStorage.getItem('latex') || "\\placeholder" );
                    sessionStorage.setItem("latex", "");
                }catch (e) {
                    setTimeout(function() {
                        k.setMessage();
                    },200)
                }
            },

            onok:function (editor) {

                kfe.execCommand('get.image.data', function(data){
                    var latex = kfe.execCommand('get.source');
                    editor.insertHtml('<img class="kfformula" style="vertical-align: middle;" src="'+ data.img +'" data-latex="' + latex + '" />');
                    $( "#tips").remove();

                    return true;
                });
                return false;

            },

        };

        k.init().then(function (kfe) {
           k.setMessage();
        });

    });



    function setlatex(imgLatex){
        try {
            window.kfe.execCommand( "render", imgLatex || "\\placeholder" );
            window.kfe.execCommand( "focus" );
        }catch (e) {}

    }


    function onok(editor){
       k.init().then(function (kfe) {
          k.onok(editor);
       });
    }

    // jQuery( function ($) {
    //     if ( document.body.addEventListener ) {
    //         $( "#tips").html('<div id="loading"><img src="kityformula/loading.gif" alt="loading" /><p>正在加载,请耐心等待...</p></div>' );
    //
    //         var factory = kf.EditorFactory.create( $( "#kfEditorContainer" )[ 0 ], {
    //             render: {
    //                 fontsize: 24
    //             },
    //             resource: {
    //                 path: "./kityformula/resource/"
    //             }
    //         } );
    //
    //         factory.ready( function ( KFEditor ) {
    //
    //             $( "#tips").remove();
    //             this.execCommand( "render", null || "\\placeholder" );
    //             this.execCommand( "focus" );
    //
    //             window.kfe = this;
    //
    //         } );
    //
    //         onok = function(editor){
    //             kfe.execCommand('get.image.data', function(data){
    //                 var latex = window.kfe.execCommand('get.source');
    //                 //editor.insertHtml('<img class="kfformula" style="vertical-align: middle;" src="'+ data.img +'" data-latex="' + latex + '" />');
    //                 $( "#tips").remove();
    //
    //                 //return true;
    //                 return '<img class="kfformula" style="vertical-align: middle;" src="'+ data.img +'" data-latex="' + latex + '" />';
    //             });
    //             return false;
    //         }
    //
    //         //解决第一次赋值失败的问题
    //         let setMessage =  () => {
    //             try {
    //                 window.kfe.execCommand( "render", sessionStorage.getItem('latex') || "\\placeholder" );
    //                 sessionStorage.setItem("latex", "");
    //             }catch (e) {
    //                 setTimeout(() => {
    //                     setMessage()
    //                 },200)
    //             }
    //         }
    //         setMessage();
    //
    //
    //     } else {
    //         $( "#tips").css( "color", "black" );
    //         $( "#tips").css( "padding", "10px" );
    //     }
    //
    // } );
</script>

我在这里构建了与父页面通讯的方法

 这样就可以在iframe父页面调用了

7、完成后看下效果

 

 

 

 

 

kityformula是采用img返回,插件已经将公式转换成base64的图片返回,所以在编辑器上面会看到是图片来的 

8、要记得在kindEditor/lang/zh-CN.js增加

kityformula : '数学公式'

 这样的完成了,感觉比原来的jmeditor好用

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
首先,我们需要在 Spring Boot 项目中引入 kindeditor 的相关依赖。可以通过在 Maven 或 Gradle 配置文件中添加以下依赖来实现: Maven: ```xml <dependency> <groupId>com.github.kindeditor</groupId> <artifactId>kindeditor</artifactId> <version>4.1.11</version> </dependency> ``` Gradle: ```groovy compile group: 'com.github.kindeditor', name: 'kindeditor', version: '4.1.11' ``` 接着,在 Spring Boot 项目中添加一个控制器,用于处理 kindeditor 的上传请求和获取文件列表请求。示例代码如下: ```java @RestController @RequestMapping("/kindeditor") public class KindEditorController { @Autowired private Environment env; /** * KindEditor上传文件接口 * @param file * @param request * @return */ @PostMapping("/upload") public Map<String, Object> upload(@RequestParam("imgFile") MultipartFile file, HttpServletRequest request) { Map<String, Object> result = new HashMap<>(); String url = ""; try { // 获取上传文件目录 String uploadDir = env.getProperty("kindeditor.upload-dir"); if (StringUtils.isBlank(uploadDir)) { uploadDir = request.getServletContext().getRealPath("/upload"); } File dir = new File(uploadDir); if (!dir.exists()) { dir.mkdirs(); } // 获取上传文件名 String fileName = file.getOriginalFilename(); // 生成新的文件名 String newFileName = UUID.randomUUID().toString() + "." + StringUtils.substringAfterLast(fileName, "."); // 保存文件 File dest = new File(dir, newFileName); file.transferTo(dest); // 返回文件访问URL url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/upload/" + newFileName; result.put("error", 0); result.put("url", url); } catch (Exception e) { result.put("error", 1); result.put("message", "文件上传失败"); } return result; } /** * KindEditor获取文件列表接口 * @param request * @return */ @GetMapping("/filemanager") public Map<String, Object> fileManager(HttpServletRequest request) { Map<String, Object> result = new HashMap<>(); try { // 获取上传文件目录 String uploadDir = env.getProperty("kindeditor.upload-dir"); if (StringUtils.isBlank(uploadDir)) { uploadDir = request.getServletContext().getRealPath("/upload"); } File dir = new File(uploadDir); if (!dir.exists()) { dir.mkdirs(); } // 遍历目录,获取文件列表 List<Map<String, Object>> fileList = new ArrayList<>(); File[] files = dir.listFiles(); if (files != null && files.length > 0) { for (File file : files) { Map<String, Object> fileInfo = new HashMap<>(); fileInfo.put("is_dir", file.isDirectory()); fileInfo.put("has_file", file.isFile()); fileInfo.put("filesize", file.length()); fileInfo.put("filename", file.getName()); fileInfo.put("datetime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified()))); fileList.add(fileInfo); } } result.put("error", 0); result.put("file_list", fileList); } catch (Exception e) { result.put("error", 1); result.put("message", "文件列表获取失败"); } return result; } } ``` 其中,`upload` 方法用于处理 kindeditor 的上传请求,`filemanager` 方法用于获取文件列表请求。在 `upload` 方法中,我们通过 `MultipartFile` 接口获取上传的文件信息,然后将文件保存至指定目录,并返回文件访问 URL。在 `filemanager` 方法中,我们遍历指定目录下的所有文件,并将文件信息封装成列表返回。 最后,在前端页面中引入 kindeditor 的相关资源文件,并在页面中添加文本编辑器元素。示例代码如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>KindEditor富文编辑器</title> <link rel="stylesheet" href="http://cdn.staticfile.org/kindeditor/4.1.11/themes/default/default.css" /> <script src="http://cdn.staticfile.org/kindeditor/4.1.11/kindeditor.js"></script> <script src="http://cdn.staticfile.org/kindeditor/4.1.11/lang/zh-CN.js"></script> </head> <body> <textarea id="editor"></textarea> <script> KindEditor.ready(function(K) { K.create('#editor', { uploadJson: '/kindeditor/upload', fileManagerJson: '/kindeditor/filemanager' }); }); </script> </body> </html> ``` 在以上代码中,我们引入了 kindeditor 的相关资源文件,并在页面中添加了一个 ID 为 `editor` 的 textarea 元素,然后通过 JavaScript 代码初始化了 kindeditor,并设置了上传文件和获取文件列表的 URL。 至此,我们就可以在 Spring Boot 项目中轻松实现 kindeditor富文编辑器功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来自梧州的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值