Javascript 获取 Markdown 所有图片节点

804 阅读1分钟

本文作者:李俊冬

场景

需要对 Markdown 中所有 img src 进行服务端加签名。

思路

因为 Markdown 有语法,首先放弃正则的方案,搜一下是否有现有方案,

Google javascript get all image in markdown 搜到 get-md-image 这个方案,本地试了一下,发现只取到了 Markdown 中第一个 image 节点。看了下源码实现,原来是基于 commonmark.js 实现,除了获取图片,作者还封装了一系列基于 commonmark.js 的库,并且这些库的 npm 下载量都很大。

再看下 commonmark.js,这个库是基于 markdown 标准的 JavaScript 实现,其中提供的

Parser方法可以将 markdown string 解析为一棵节点树,节点数包含基础数据和一些方法,我们会用到 typedestinationwalker() 来获取所有的图片节点,代码如下

const commonMark = require("commonmark")

const getAllImg = markdown => {
  if(!markdown) return
  let parsed = new commonMark.Parser().parse(markdown)
  let walker = parsed.walker()
  let event
  let srcList = []
  let nodeList = []
  while (event = walker.next()) {
    let node = event.node;
    if (
      node.type === "image" &&
      node.destination
    ) {
      nodeList.push(node)
    }
  }
  const srcList = nodeList.map(node => node.destination)
  const uniqueSrcList = [...new Set(srcList)]

  return {
    srcList,
    uniqueSrcList,
    nodeList
  };
}

Javascript 获取 Markdown 所有图片节点