首页 > 解决方案 > 使用 Node JS 更改 Markdown 文本中的图像源

问题描述

我有一些包含图像引用的降价文本,但这些是相对路径,我需要使用 NodeJS 脚本将它们修改为绝对路径。有没有办法以简单的方式实现相同的目标?

例子:

资源

![](myImage.png?raw=true)

结果

![](www.example.com/myImage.png?raw=true)

我需要修改的 markdwon 内容中有多个图像。

标签: node.jsmarkdown

解决方案


检查这个工作示例:https ://repl.it/repls/BlackJuicyCommands

首先,您需要读取文件fs.readFile()并将其解析Bufferstring.

现在您可以访问文件的文本,您需要用新的图像路径替换每个图像路径。捕获它的一种方法是使用正则表达式。例如,您可以寻找 ](ANY_IMAGE_PATH.ANY_IMAGE_EXTENSION. 我们只对更换ANY_IMAGE_PATH零件感兴趣。

一个示例正则表达式可能是(这可以改进!)(在这里查看它的实际效果:https ://regex101.com/r/xRioBq/1 ):

const regex = /\]\((.+)(?=(\.(svg|gif|png|jpe?g)))/g

这将查找一个字面量],后跟一个字面量(,然后是任何序列(即.+),直到找到一个字面量.后跟svg, gif,pngjpeg/ jpg。正则g表达式之后必须匹配所有出现,而不仅仅是第一个。

Javascript/node (< version 9)不支持lookbehind。我使用了一个包含](图像路径之前的正则表达式,然后稍后将其过滤掉(或者您可以使用更复杂的正则表达式)。

(.+)图像路径捕获为一个组。然后就可以使用字符串的替换功能了。replace 函数接受正则表达式作为第一个参数。第二个参数可以是一个函数,它接收完整匹配作为第一个参数(在这种情况下](image_path_without_extension,任何捕获的组作为以下参数)。

在此处输入图像描述

使用节点模块更改 urlpathurl返回捕获的组(在下面我调用了该参数imagePath)。因为我们也在替换](, 应该包含在返回值中。

const url = require('url');
const replacedText = data.toString().replace(regex, (fullResult, imagePath) => {
    const newImagePath = url.resolve('http://www.example.org', imagePath)
    return `](${newImagePath}`;
})

请参阅 repl 示例以查看它的实际效果。注意:在 repl 示例中,它被写入不同的文件。如果要覆盖,请使用相同的文件名。


推荐阅读