稀土掘金 稀土掘金

remark和unified学习与使用

remark

remark不单单是一个markdown的编译工具,更准确地说,它是一个围绕markdown的生态。通过插件化的方式,对mdast进行修改,使其转化成我们想要的样子。remarkParse就是将markdown编译为mdast的插件。

import {unified} from 'unified'
import remarkParse from 'remark-parse'
import remarkRehype from 'remark-rehype'
import rehypeSanitize from 'rehype-sanitize'
import rehypeStringify from 'rehype-stringify'

main()

async function main() {
  const file = await unified()
    .use(remarkParse) // markdown -> mdast
    .use(remarkRehype) // mdast -> hast
    .use(rehypeSanitize) // sanitize HTML
    .use(rehypeStringify) // hast -> string
    .process('# Hello, Neptune!')

  console.log(String(file))
}

unified

unified相当于一种管道传输的思想,我们把内容放到管道里,先对其解析,解析为 ast,再使用一个一个插件处理ast,管道中的内容是以ast的形式传输的,最终将ast编译,并在管道的另一头获取到被处理后的内容。

image-20220708230927329

| ........................ process ........................... |
| .......... parse ... | ... run ... | ... stringify ..........|

          +--------+                     +----------+
Input ->- | Parser | ->- Syntax Tree ->- | Compiler | ->- Output
          +--------+          |          +----------+
                              X
                              |
                       +--------------+
                       | Transformers |
                       +--------------+

unified其实际上只是一个配置processor的过程,unified()返回值是一个processor,processor.use()返回是一个被配置过的processor,在配置一个插件后,我们可以使用processor.process()processor.processSync()处理。

processor.processSync(file:VFile|undefined):VFile

如果我们传入的值不是VFile,则会自动的使用new VFile(x) 将其转化为VFile

输出的VFile我们可以使用String(VFile)VFile.toString()获取到其中的内容

Plugin

插件是用于配置processor的,那么我们该如何写一个自己的插件呢

function attacher(options?)

parameters

options -- configuration

Return

transformer

Plugin应该是一个可以接收options,并且返回transformer的函数

function transformer(tree,file[,next])

transformer是用来处理syntax treeVFile的函数。

以下是官方的例子

move.js

export function move(options) {
  if (!options || !options.extname) {
    throw new Error('Missing `options.extname`')
  }

  return function (tree, file) {
    if (file.extname && file.extname !== options.extname) {
      file.extname = options.extname
    }
  }
}

index.js

import {read, write} from 'to-vfile'
import {reporter} from 'vfile-reporter'
import {unified} from 'unified'
import remarkParse from 'remark-parse'
import remarkRehype from 'remark-rehype'
import rehypeStringify from 'rehype-stringify'
import {move} from './move.js'

const file = await unified()
  .use(remarkParse)
  .use(remarkRehype)
  .use(move, {extname: '.html'})
  .use(rehypeStringify)
  .process(await read('index.md'))

console.error(reporter(file))
await write(file) // written VFile to ‘index.html’

index.html

<h1>Hello, world!</h1>

实际应用

这是在我写一个vscode的插件时碰到的问题,这个vscode插件是用于预览markdown的,虽然插件市场已经有很多预览markdown的插件了,但是由于一些原因,这个插件需要使用remark来实现,所以需要重新做一个。

在需要实现滚动锁定功能的时候,其他插件的实现方法是,对每一个HTML Element添加一个属性:data-line(指的是该html在编辑器的位置),这样我在滚动预览页面的时候就只需要找到能看到的最上面的HTML Element 再找到与之对应的data-line 接着滚动编辑器即可。

因此思路也非常清晰了,我们需要在对hast的处理过程中加上一步(添加data-line属性),接着,我们开始编写此插件

rehype-source-line.ts

import {visit} from 'unist-util-visit';// 用于访问语法树的节点

export default function rehypeSourceLine() {
  return (tree:any) => {
    visit(tree, (node) => {
        if(node.position && node.properties){
          node.properties.dataLine = node.position.start.line;
        }
    });
  };
}

让我们来看看效果

image-20220710150532940

ok,那么这样一个简单的插件就完成了。

玻璃钢生产厂家革命主题玻璃钢人物雕塑销售厂家大型主题商场美陈市场品正 玻璃钢花盆河北常用商场美陈价钱惠州玻璃钢花盆图片河南玻璃钢浮雕学校抽象雕塑圣诞商场现代美陈玻璃钢雕塑哪家质量好人物雕像玻璃钢雕塑有哪些徐州湛江玻璃钢动物雕塑襄阳玻璃钢熊猫雕塑多少钱山西多彩玻璃钢雕塑批发定制玻璃钢仿铜雕塑人物价格新密标识玻璃钢仿铜雕塑厂家天津景观玻璃钢雕塑设计镂空玻璃钢人物雕塑生产厂家雕塑用玻璃钢好还是不锈钢好河南玻璃钢人物动物雕塑厂家郑州关公玻璃钢雕塑价格江苏特色玻璃钢雕塑销售电话知名玻璃钢仿铜雕塑加工杭州玻璃钢雕塑价位汕尾玻璃钢雕塑电镀加工厂宿迁玻璃钢人物雕塑玻璃钢和水泥雕塑价格南京园林景观玻璃钢雕塑哪家好新乡玻璃钢浮雕不锈钢动物雕塑玻璃钢和泡沫雕塑成品玻璃钢雕塑摆件价钱304不锈钢玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化