Alhagi实现记录
参考资料https://spec.commonmark.org/0.31.2/
CommonMark解析策略
先将文档分解为块结构,但不解析文本,链接引用定义可以先收集起来
将标题和段落中的纯文本解析为行内元素,此时可使用之前收集好的链接引用定义
强调和链接的解析策略使用分隔符栈来解析,每个栈元素需要包含如下信息:
分隔符类型[, ![, *, _
分隔符数量?
分隔符是否激活状态
分隔符是否为潜在的开启符号,或者潜在的关闭符号,或者都是
当碰到符号]的时候,调用look for link or image
当碰到输入结束时,调用强调语法处理流程,此时直到碰到栈底元素为NULL
look for link or image 从分隔符栈顶倒找[或者![
如果没找到,则返回纯文本的]
如果找到一个,但没激活,则从栈里移除那个没激活的分隔符,接着返回纯文本的]
如果找到一个并且是激活的,则查看是否为行内/引用/压缩/short cut的链接或者图像
如果不是,则从栈中移除开始标签,并且返回纯文本的]
如果是,则
返回链接或者图像节点,添加到开启符号的文本 ...
md编辑器相关技术记录
参考资料从零开始写一个富文本编辑器(一) - 掘金 (juejin.cn)
十分钟实现自己的Typora - 掘金 (juejin.cn)
Selection - Web API | MDN (mozilla.org)
Vditor 实现 Markdown 所见即所得 - 链滴 (ld246.com)
关于所见即所得 Markdown 编辑器的讨论 - 链滴 (ld246.com)
剪贴板操作 Clipboard API 教程 - 阮一峰的网络日志 (ruanyifeng.com)
https://spec.commonmark.org/0.31.2
SelectionSelection中存储用户选择的文本范围或者插入符号的位置,获取方式:window.getSelection()
在不可编辑元素中,插入点位置和选区范围必须通过鼠标的点击或者拖拽产生,在可编辑元素中,插入点位置和选取范围也可以通过键盘方向键变化。
可通过window.getSelection().toString()获取被选中的文字
Range可通过selection.getRangeAt获取
Range.commo ...
编辑器LSP服务
参考资料理解 Language Server Protocol 的工作原理 - 掘金 (juejin.cn)
概述LSP为为编辑器提供的工作区内容索引服务,一般具有代码补全,纠错等功能。
基本作用原理在编辑器启动时会同时启动一个进程叫做语言服务,编辑器会将当前用户编辑的位置及相关消息通过进程间通信发送给语言服务进程,语言服务会根据用户当前编辑位置的上下文进行代码补全等处理,并将结果响应给编辑器
优点该协议使得语法补全等功能无需每个语言都要为每个编辑器适配一套,大家都遵循这一协议,每种语言只需要在该协议上提供服务,而每种编辑器只需要实现LSP的客户端与服务端即可。