使用Codemirror打造Markdown编辑器前几天突然想给自己的在线编译器加一个Markdown编辑和预览功能,于

在阐述我是如何实现这些功能前,我先将实现时用到的API列出来。

cm.somethingSelected()

是否选中编辑器内的任何文本。

cm.listSelections()

选中的文本信息。

cm.getRange(from:{line,ch},to:{line,ch},separator:string)

在编辑器中的给定点之间获取文本。

cm.replaceRange(replacement:string,from:{line,ch},to:{line,ch},origin:string)

用replacement替换给定点之间的文本。

cm.setCursor(pos:{line,ch}|number,ch:number,options:object)

设置光标位置。

cm.getCursor(start:string)

获取光标位置。

cm.setSelection(anchor:{line,ch},head:{line,ch},options:object)

设置一个选择范围。

cm.getLine(n:integer)

获取某行文本内容。

上面的API中,cm为Codemirror实例,也就是编辑器实例。line为行数,ch为列数(该行第几个字符)。

首先是粗体,斜体,中划线和代码,这四个功能实现的方法是相同的。

当用户触发添加粗体、斜体、中划线或代码事件时,流程如下:

如上图所示,先来说说光标没选中文本时的处理:

具体代码和注释如下:

在光标选中文本的情况下,处理过程相对来说要复杂一些:

接下来我说说如何实现引用,无序列表和有序列表。

我是按照VSCode的markdown插件的机制来处理这三种格式。当用户操作引用,无序列表和有序列表时的处理流程如下:

具体代码和注释如下:

至于有序列表,需要先去除当前行前面的空格和制表符,再判断是否以数字.开头,如果有,便取出数字,下一行的数字逐步递增。其他的地方和无序列表差不多。

说完了编辑,再说说预览功能,一个支持markdown的编辑器怎么能没有同步滚动呢?

想要实现同步滚动有两种方案:

均匀滚动就是计算编辑窗口和预览窗口的滚动条高度以及这两个高度的比例,比方说编辑窗口的滚动条高度为2000px,预览窗口滚动条高度为4000px。

那么每当编辑窗口的滚动条滚动1px,那么预览窗口就滚动2px。

这样写的好处是方便且性能好,但缺陷很明显:

如果我在文档中加入了图片,并且图片很大,那么就会导致编辑窗口中显示的代码和预览窗口中的元素是不对应的,在代码很多,滚动条拉的越下的时候效果越明显。我这里拿Editor.md这个工具来举个例子:

我把滚动条拉的很下,我们可以发现编辑窗口显示的是Emoji的内容,但预览窗口显示的却是与之无关的公式和流程图。而公式和流程图所对应的代码实际上在Emoji的下面,这就比较影响编辑体验了。

考虑到这个弊端,我决定使用元素顶部定位方法。

元素顶部定位的原理是这样的:

Codemirror可以利用编辑器滚动条的位置来获取当前显示在最顶部的行的行号:

constscrollInfo=cm.getScrollInfo()constlineNumber=cm.lineAtHeight(scrollInfo.top,'local')获取了行号,就可以获取该行及以上的所有代码。

然后我们使用marked工具将代码编译成HTML字符串,并使用DOMParser将其转换成真正的DOM元素:

constrange=cm.getRange({line:0,ch:null},{line:lineNumber,ch:null})constmarked=require('marked')constdoc=newDOMParser().parseFromString(marked(range),'text/html')为了考虑性能,我们不能匹配所有标签,因此需要制定一个匹配标签的集合:

matchTagsStr='p,h1,h2,h3,h4,h5,h6,li,pre,blockquote,hr,table,code>span'上面的这些就是我们必须要匹配的标签和选择器,我们将doc中符合匹配条件的元素选出来:

constmatchEleList=doc.body.querySelectorAll(matchTagsStr)那么matchEleList中最后的元素就是我们在预览视口中看到的第一个元素。

接下来的过程非常简单:

constcm=this.cm//监听codemirror编辑器滑动事件cm.on('scroll',()=>{//获取之前代码解析出来的匹配列表长度constlength=matchEleList.lengthif(length){//如果length不为0,获取iframe中符合matchTagsStr选择器的元素列表constmatchIframeEleList=window.document.body.querySelectorAll(matchTagsStr)if(length===1)length--//获取matchIframeEleList中第length个元素并将视口滑动到该元素的位置if(matchIframeEleList.length){consttarget=matchIframeEleList[length]target.scrollIntoView()}}else{window.scrollTo(0,0)}})上述代码只是为了帮助理解,实际代码比上面的要复杂。

到此我们就实现了滚动编辑窗口,预览窗口也滚动到对应位置的效果了:

这样,一个简单但好用的markdown编辑器就完成啦!

Codemirror是一个扩展性很强的代码编辑工具,通过Codemirror提供的api我们可以实现很多功能。

这是我的在线编辑器地址和github仓库地址:

我还是个前端小白,如果觉得那些地方需要优化和改进,望指教!

THE END
1.编译器不必手动优化代码,您应考虑设计方面,如使用更快的算法、合并线程级并行性和使用特定于框架的功能(如使用移动构造函数)。 本文介绍了 Visual C++ 编译器优化。下面我要讨论最重要的优化技术,以及为了应用这些技术编译器必须做出的决策。目的并不是告诉您如何手动优化代码,而是向您说明https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2015/february/compilers-what-every-programmer-should-know-about-compiler-optimizations
2.C++项目从零实现一个在线编译器cplus在线身为一名程序员,想必大家都有接触过像leetcode这样的刷题网站,不知你们在刷题的过程中是否思考过一个问题:它们是如何实现在线编译运行的功能。如果你对此感到好奇,那么本文将一步步带你来实现一个简易在线编译器。 项目概述 项目的基本逻辑:前端用户在网页上输入代码与参数,后端通过多进程的方式来编译运行代码,然后将https://blog.csdn.net/m0_74825172/article/details/144396891
3.c在线编译器腾讯云开发者社区c编译器-c语言的编译器是干什么用的本人不才,仅就个人意见谈谈: 1。c语言编译器哪个好?g++,icc. 小问题二:在类中对友元函数和重载的支持不是很好,虽然打了补丁,还是有点问题,最经典的一次就是我写了一个类的https://cloud.tencent.com/developer/information/c%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%AF%91%E5%99%A8
4.如何使用在线编译器进行C语言编程和调试?使用场景:C语言在线编译器广泛应用于教育领域,使学生能够无需配置复杂的本地开发环境即可学习和实践C语言,它也常被软件开发人员用于快速验证代码片段或进行小型项目的初步开发。 2、主要特点与优势 易用性:用户只需通过网络浏览器访问相应的网站,就能开始编码,操作简单便捷,许多在线编译器还提供代码高亮、错误提示等辅助https://www.kdun.com/ask/928724.html
5.在线GO语言编译器mob649e8155b018的技术博客如何实现一个在线GO语言编译器 创建一个在线GO语言编译器是一个非常有趣的项目。这个项目不仅可以帮助你了解GO语言的特点,还可以让你掌握一些常见的Web开发技能。在本文中,我将指导你如何实现这个项目,分步骤讲解每一部分,包括所需的代码和解释。 流程概述 https://blog.51cto.com/u_16175439/12367389
6.GCC在线编译器的使用教程是什么问答GCC是一种广泛使用的开源编译器,可以用于编译C、C++等编程语言。GCC在线编译器是指可以通过网页访问并使用GCC编译器的服务。以下是使用GCC在线编译器的一般步骤:1. 打开GCC在线编译器的https://www.yisu.com/ask/61671196.html
7.C语言在线编译器怎么用LightlyC语言在线编译器好不好Lightly C语言在线编译器让写代码变得更简单,安装即可使用,无需任何配置,使用云端资源,不占用本地空间,秒级启动。用户可以选择下载使用桌面客户端或直接在浏览器中打开使用。 Lightly C语言在线编译器软件特性 Lightly C语言在线编译器让写代码变得更简单,安装即可使用,无需任何配置,使用云端资源,不占用本地空间,秒级https://xiazai.zol.com.cn/baike/501442.shtml
8.在线代码编译器:使用HTML,CSS和原始JavaScript和API实现的在线使用HTML,CSS和原始JavaScript和API实现的在线代码编译器。 它支持C,C ++,Java,Python和JavaScript代码编译。 在下面的链接上尝试 :backhand_index_pointing_down: (0)踩踩(0) 所需:1积分 JSP-车辆管理系统(struts+hibernate+spring+oracle) 2024-12-12 19:26:14 https://www.coder100.com/index/index/content/id/1759880
9.LightlyC语言在线编译器官方下载LightlyC语言在线编译器最新版Lightly C语言在线编译器让写代码变得更简单,安装即可使用,无需任何配置,使用云端资源,不占用本地空间,秒级启动。用户可以选择下载使用桌面客户端或直接在浏览器中打开使用。不仅仅只是一个编译器,本C语言在线编译器提供优秀的IDE编程体验,用户可以直接打包分享代码,也可以邀请朋友实时协同编码。除了C语言,还支持C++、http://www.onlinedown.net/soft/10081465.htm
10.C语言在线编译器(编辑器/解释器)C教程语言在线编译器 C 编译器(编辑器) 使用我们的在线 C 编译器,您可以编辑 C 代码,并在浏览器中查看结果。 Run ? #include<stdio.h> int main() { printf("Hello World!"); return 0; } Hello, World! 亲自试一试 ? 点击"亲自试一试" 按钮查看运行结果。https://w3schools.cn/c/c_compiler.html
11.基于webpack打造前端在线编译器当编译的资源返回前端之后,也会有运行时的错误,通常这些错误只会在Console(Chrome中的调试工具)中显示。但是作为一个前端代码的编译器,我们应当提供能够展示运行时错误的能力,否则出现runtime error时,展示区仍处于loading 的状态而无任何显示,会使人疑惑是否是源码尚未编译完成。 https://www.jianshu.com/p/8eb175be0774
12.如何免安装使用Python?推荐17个在线的Python解释器!Replit 需要注册一个帐户才能使用。用户界面有点复杂,因为它们有好几块功能,包括导航网站的帮助系统。该站点还有用于 C、C++、Java、Javascript 和其他几种语言的在线编译器。 Replit 还有一个 APP,可以在智能手机和平板电脑上使用。 4、Brython brython.info/tests/conso… https://developer.aliyun.com/article/1447215
13.在线Markdown编辑器,markdown线上编译器在线工具最近使用: 工具说明 本工具提供在线 Markdown 编辑功能,编辑器提供了深色和浅色 2 种主题,主要功能包括:支持标准 Markdown 和 Github 风格(GFM)的语法;支持自动识别 HTML 标签以及自动识别链接(包括 @link 这种形式)、Email 地址;支持基于 KaTeX 的 TeX 科学公式等等。同时,本编辑器还支持实时预览。 相关工具https://www.wetools.com/markdown/
14.最全盘点:18款在线C/C++/Py/Java编译器,一个比一个强大(附地址)这款在线编译器支持C,C ++,PHP和Java编译器。 OnlineGDB的独特功能是可以逐步调试您的代码,一旦代码被写入,它可以很容易地格式化,让它看起来非常酷。 网站地址:https://www.onlinegdb.com/online_c_compiler 12、cpp.sh/C++ shell 一款在线C++编译器,系统使用GCC 4.9.2,并带有Boost 1.55。支持C++标准选择、警https://picture.iczhiku.com/weixin/message1570869616830.html
15.Dotcpp编程(C语言网)编程入门学习训练题库在线运行,黏贴代码 - 码曰 各大编译器下载安装及图文教程汇总 如何创建自己的编程比赛? 如何创建自己的私有题库? 如何利用Dotcpp教学? 平台近期兼职需求列表 黄老师32集零基础C语言在线免费视频 C/C++项目教程 最近更新 / Recent updates 教学功能常见使用问题汇总 https://www.dotcpp.com/
16.GitHub提供打印,定时器两个上下文供测试使用,可fork分支添加上下文实现更有趣的功能 该项目为第一版本初始版本,目的是通过实现中文解释器,且扩展出一些有意思的功能,加深对编译原理的学习理解。对该项目有兴趣的同学,可以提交issue反馈意见建议,也可邮件1104238614@qq.com。https://github.com/gamedilong/ccc
17.在线Markdown编译器在线Markdown编译器Feedback 1 2 3 4 5 6 7 8 9 10 # OSCHINA.NET社区 ### Header 3 > This is a blockquote. > > This is the second paragraph in the blockquote. > > ## This is an H2 in a blockquote HTML 实时预览 实时预览:https://tool.oschina.net/markdown/
18.AppStore上的“C语言代码编译器C语言代码编译器是一款专门为零基础C语言编程爱好者打造的一款入门编译工具App,致力于帮助初学者入门C语言,轻松迈入编程世界。学C语言,从这里开始! 【零基础也能学】初学者从0到1,轻松入门; 【强大的编译器】在线运行,极速编译; 【免费教程】内容、知识点丰富,完全免费; https://itunes.apple.com/cn/app/id1595765605