[BlogEngine.Net] 适配富文本编辑器到BE

一、需求分析

本博客的博客程序使用的是BlogEngine.Net 3.3.5.0(截至2017/1/20,以下简称BE),由于后台发布文章页面的富文本编辑器不能满足我的使用需求。我决定适配一个别的富文本编辑器到BE。

二、资料搜集

BE是有44万多行实际代码的项目,一开始我先从BE的项目目录结构着手。大致分析了一下各个一级、二级目录下文件的作用。然后就是从某一个功能点切入,上下梳理出实现该功能的业务流程。

因为对于体量那么大的项目,如果从程序入口开始一步步的分析,将会非常耗时。而且很有可能分析了很久都还在后台逻辑代码上,没有前端的表示,很难去理解一个个的变量和函数有何作用。所以我决定从各个可见的功能点入手来解剖整个项目,表现在这篇文章上就是为BE添加一个富文本编辑器。

光靠自己一时也很难找出实现这个功能的关键代码在哪里,所以最好的方法就是找一下官方有没用关于这个的wiki。

虽然官方的wiki涵盖的功能不多,所幸这个功能还是有写的。BlogEngine.net:adopting-ckeditor

这篇wiki的发布日期是2014/5/22日,当时的版本还是2.9,所以很多目录结构和代码已经和3.3不一样。

以下的步骤仅适用于3.3版本。

三、适配步骤

1.下载富文本编辑器包。

本文中使用的富文本编辑器是CKEditor,CKEditor:下载地址。该编辑器有多个含有不同功能的集合包可供选择,读者根据自己需求下载。我使用的是Full Package原则上任何集合包都适用于以下步骤。

2.解压编辑器包。

解压编辑器包后,可以发现该编辑器的实现语言使用的是Javascript,并有少量CSS和HTML文件作为实体和框架。

细想一下编辑器的特征:一、编辑器是嵌入到HTML页面中使用的。二、编辑器的功能实现是于后台无关的。可以明白使用JS的原因。

3.添加编辑器包到BE工程。

将 ..\ckeditor_4.6.2_full\ckeditor 放到 ..\BlogEngine\BlogEngine.NET\admin\editors 文件夹下。后者是BE工程中专门存放不同编辑器实现代码的目录。

构成 ..\BlogEngine\BlogEngine.NET\admin\editors\ckeditor 的目录结构。

然后用Visual studio打开解决方案,把编辑器包放进解决方案的对应位置。

4.适配编辑器到BE工程。

经过第3步后,编译环境已经可以调用到编辑器包中的资源了。但是BE工程实际上还感知不到编辑器的存在。

编辑器并非仅为BE工程设计的,它也可用于其他Web项目。为了达到这种目的,有两种解决方法:一,编辑器的设计者根据使用它的项目编写上层的API,这样把编辑器包复制进不同的项目后就可以直接使用。二,编辑器在中层预留个接口,由使用它的项目的设计者根据自身项目的不同来实现这个接口。

显然,第二种方法更符合现实。这就需要一个适配的过程。

BE的开发者规定了编辑器的适配方法,并在Wiki中进行了说明。

4.1构建实体元素文件

在 ..\BlogEngine\BlogEngine.NET\admin\editors\ckeditor 目录下新建一个editor.cshtml文件。文件中输入以下代码。
<textarea cols="100" id="editor1" name="editor1" rows="10" data-sample="1"></textarea>

实际上,任何使用到编辑器的页面都会从配置文件中找到cshtml文件,然后把该行代码嵌入到自己的代码中。

因此,该代码是作用是让编辑器作为一个HTML元素表现在页面中。

4.2实现读写接口

在 ..\BlogEngine\BlogEngine.NET\admin\editors\ckeditor 目录下新建一个editor.js文件。文件中输入以下代码。

var editorGetHtml = function () {
 return editor.getData();
}
 
var editorSetHtml = function (html) {
 editor.setData(html);
}
 
 
var editor = CKEDITOR.replace('editor1', {
 height: 400
});

编辑器的主要作用是以所见即所得的模式代替手写HTML标签的方式展现和编辑各种图文元素。而实际上,要在网页上显示图文,其本质还是HTML标签。

读接口的作用是让编辑器把所见即所得的图文转换为HTML标签代码传递给BE。反而言之,写接口的作用是BE把已有的HTML标签代码传递给编辑器,以所见即所得的方式展现和编辑。

因此,不论使用何种编辑器,都需要去实现读写接口。这里还多了一步是把编辑器实体元素转换为JS变量。以供读写函数去访问实体元素中存储的HTML标签代码。这一步根据编辑器实现方式的不同,可能不是必须的。

这部分JS代码的编写应该参照编辑器给出的API解释。

5.更改配置文件

经过上面的步骤,CKEditor已经可以被BE使用。但是BE同时带着几个不同的编辑器,因此还需要指定CKEditor为默认使用的编辑器。

在 ..\BlogEngine\BlogEngine.NET\web.config 中的<appSettings>子节点下,添加新的键值对代码。

<add key="BlogEngine.DefaultEditor" value="~/admin/editors/ckeditor/editor.cshtml"/>

指明包含了默认编辑器实体元素文件的位置。

6.嵌入JS代码

由我们实现的读写接口的代码可知,JS代码是紧跟着HTML元素的。从cshtml文件中可以发现没有把JS嵌入到页面的操作。因此还需要一个嵌入JS代码的步骤。

打开 ..\BlogEngine\BlogEngine.NET\AppCode\App_Start\BlogEngineConfig.cs 文件。可以发现有一段代码是用于根据配置的默认编辑器的不同,嵌入不同编辑器JS代码的。但是原来的该段代码逻辑上是并不能实现这个功能的,应该改成下面的样子。

if (BlogConfig.DefaultEditor == "~/admin/editors/bootstrap-wysiwyg/editor.cshtml")
{
 bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/bootstrap-wysiwyg/jquery.hotkeys.js");
 bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/bootstrap-wysiwyg/bootstrap-wysiwyg.js");
 bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/bootstrap-wysiwyg/editor.js");
}
else if(BlogConfig.DefaultEditor == "~/admin/editors/ckeditor/editor.cshtml")
{
 bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/ckeditor/ckeditor.js");
 bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/ckeditor/editor.js");
}
else if (BlogConfig.DefaultEditor == "~/admin/editors/tinymce/editor.cshtml")
{
 // tinymce plugings won't load when compressed. added in post/page editors instead.
 //bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/tinymce/tinymce.min.js");
 //bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/tinymce/editor.js");
}
else
{
 bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/summernote/summernote.js");
 // change language here if needed
 //bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/summernote/lang/summernote-ru-RU.js");
 bundles.GetBundleFor("~/scripts/wysiwyg").Include("~/admin/editors/summernote/editor.js");
}

四、总结

完成适配步骤后,编译整个工程,进入文章编写页面后,可以发现富文本编辑器已经从TinyMCE变成了CKEditor。


已发布

分类

作者:

评论

《“[BlogEngine.Net] 适配富文本编辑器到BE”》 有 3 条评论

  1. Saad Shamsaee 的头像

    Hi. i did all. but now my editor is a simple text editor! why?

  2. Saad Shamsaee 的头像

    sorry, is a simple textbox.

    1. 暂置元帅 的头像

      Sorry bro. I just see your comment right now. I highly recommended you use WordPress rather than BE. But if you wanna a copy of my BE project base on this article, I’ll be happy to send it to your e-mail.

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注