前言

16 年在 SF 中发布了文章 "探究SegumentFault Markdown编辑器",目的是仿 SF 线上书写 Markdown 文档的体验:高亮定位修改节点

在上述文章中的工具已经不再维护(?代码写太乱),而且是在浏览器中书写 markdown 文本。

于是现在使用全新的思路实现了一个:在本地任意编辑器书写 markdown,同时同步定位修改节点 工具 live-markd

预览效果如图:

如何使用

  1. 安装 nodejs 环境,如已经有则跳过此步
  2. 全局安装 live-markd

    npm install live-markd -g
  3. 进入到 markdown 文件目录

    live-markd path/to/markdown

如何实现

如何实现修改节点的检测

使用 remark 解析 markdown,得到 markdown 抽象语法树

如下例子,现在有两个 markdown 文件 old.mdnew.md

  • old.md

    # hi
    world
  • new.md

    # hi
    world!

可以看到 new.md 相比于 old.md 最后多了 !

进一步的,对比两个 markdown 文本的语法树

// old.md
{type: 'root',children: [{type: 'heading',depth: 1,children: [{type: 'paragraph',children: [{ type: 'text', value: 'world' }]}]}]
}// new.md
{type: 'root',children: [{type: 'heading',depth: 1,children: [{type: 'paragraph',children: [{ type: 'text', value: 'world!' }]}]}]
}

然后分别对两个树结构进行 DFS,依次对比节点,判断出第一个不同的节点即可,最后对修改的节点注入 class,最后转换成带 class 的 html

{hProperties: {className: ['detected-updated']},type: 'paragraph',children: [{ type: 'text', value: 'world!' }]
}
<h1>hi</h1>
<p class="detected-updated">world!</p>

当然,以上 markdown 比对工作由 detect-one-changed 完成

如何实现数据推送

live-markd 使用 服务器推送(EventStream)来实现客户端和服务端的长连接,就如 webpack-hot-middleware 实现,只有单向的服务端向客户端的数据推送。同时为了让服务器知晓客户端是否还存在,还具有每隔 30s 的心跳检测,用于及时回收服务端资源。

客户端

在客户端只需要接受服务器推送数据即可

// 建立连接
const source = new EventSource(location.pathname + '?sse=on')
source.addEventListener('message', function(ev) {let data = {}try {data = JSON.parse(ev.data)} catch (e) {}if (data.type === 'change') {document.querySelector('.markdown-body').innerHTML = data.valueconst node = document.querySelector('.markdown-body .detected-updated')if (node) {// 定位node.scrollIntoView({ behavior: 'smooth' })}}
})

同时注入高亮样式:

@keyframes bling {from {background-color: #d9edf7;}to {background-color: #d9edf7;}
}
.markdown-body .detected-updated {animation: bling 2.5s 1;
}

最后

在 mdx 生态中,该功能也能够被使用,详见 detect-one-changed

在 mdx-go 和 docz 中都已经提供 PR 以引入该书写体验!等待作者的回复。

欢迎大家 Star :+1:!

  • live-markd - GitHub markdown 风格本地实时书写 markdown + 同步定位修改节点
  • detect-one-changed - Markdown / Html 修改检测

全新的同步渲染 markdown 文章 + 高亮更新 书写体验相关推荐

  1. Django搭建个人博客:渲染Markdown文章目录

    对会读书的人来说,读一本书要做的第一件事,就是仔细阅读这本书的目录.阅读目录可以对整体内容有所了解,并清楚地知道感兴趣的部分在哪里,提高阅读质量. 博文也是同样的,好的目录对博主和读者都很有帮助.更进 ...

  2. HelloDjango 第 10 篇:小细节 Markdown 文章自动生成目录,提升阅读体验

    目录 在文中插入目录 在页面的任何地方插入目录 处理空目录 美化标题的锚点 URL 作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 上 ...

  3. 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!

    开篇先致歉 其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊.再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了. 不 ...

  4. Vue渲染Markdown数据

    零,最简单方法 今天在找基于Vue的markdown编辑器时,找到了mavonEditor模块,本来想着通过抽离抽出展示Markdown数据相关的代码,结果忙活了一阵,突然看见文档有提示怎么只展示Ma ...

  5. markdown mysql高亮_修改博客园markdown编辑器代码高亮风格的方法

    作为一个工程师,追求极致与艺术也应当成为我们生活中的一部分,作为自己的心爱之物--博客,当然也得装扮一下,我对代码高亮有自己所喜欢的风格~还好程序员的世界总是共通的,已经有前辈开发了一些代码高亮的样式 ...

  6. Diango博客--6.Markdown 文章自动生成目录

    文章目录 0.思路引导 1.在文中插入目录 2.在页面的任何地方插入目录 3.美化标题的锚点 URL 0.思路引导 Markdown 在解析内容的同时还可以自动提取整个内容的目录结构,本文内容将从以下 ...

  7. layui进度条:调用、参数设置、动态渲染、数据热更新 (含案例、代码)

    文章目录 layui进度条:调用.参数设置.动态渲染.数据热更新 (含案例.代码) 一.demo案例 1.1. 应用 · 截图: 1.2. 案例 · 全部代码: 二.自定义案例 2.1. 部分代码: ...

  8. 如何将Markdown文章轻松地搬运到微信公众号并完美地呈现代码内容

    相信有很多童鞋跟我一样,热衷于用Markdown来编写文章.由于其简单的语法和清晰的渲染效果,受到广大码农朋友们的推崇.但是,当我们想维护起自己的公众号时,公众号编辑器往往让我们费劲了脑汁.本人尝试了 ...

  9. react引入渲染markdown文件

    因为需要在项目中添加更新日志,而一般更新日志都是markdown文件,所以需要实现在react中引入并渲染markdown文件. 1. 安装依赖 npm install react-markdown ...

最新文章

  1. 特斯拉员工自曝:为应付产能不惜偷工减料,出厂测试得过且过
  2. 001_JavaScript简介
  3. C# 打开word 语法拼写错误太多 解决方案
  4. android 设置folder类型,正确配置你的 Android 项目
  5. Hbase问题汇总与解答
  6. 2017.3.21 树网的核 思考记录
  7. 枚举算法:求解不等式
  8. 封装Apache http client工具类
  9. Boost电路原理分析及其元件参数设计
  10. cuda compute capability
  11. STM32 解析 JSON 之 cJSON
  12. c#通配符匹配符合条件文件名
  13. 《鹧鸪天》——厉以宁
  14. Android S关闭定位开关后,定位权限被AppOps限制。
  15. vue前端使用jsencrypt RSA 加解密插件
  16. python爬虫—Requests
  17. CyberLink PowerDVD Ultra v19.0.2005.62极致中文破解版
  18. Linux配置nginx缓存(expires)功能
  19. 8周年,驰骋时空瀚境
  20. oracle高效设计阅读心得体会_Oracle高效设计

热门文章

  1. Android将内容复制到剪切板
  2. SQLiteStudio
  3. CSS_腾讯QQ官网,新浪官网,网易官网,淘宝官网之css初始化代码
  4. 新的起点,心的征程 | 掘金年度征文
  5. Oracle imp导入dmp文件时 IMP-00038:无法转换为环境字符集句柄
  6. HCL Server的基本使用
  7. C++冒泡排序代码实现
  8. 设计一个以51单片机为控制器的2位的LED数码管“计时器”,实现倒计时功能。利用Keil软件编写程序,Proteus软件搭建系统仿真模型,
  9. 关于vba代码运行时错误1004 应用程序定义或对象定义错误问题
  10. Vj程序设计作业H6