node.js - 使用 Node JS 更改 Markdown 文本中的图像源
问题描述
我有一些包含图像引用的降价文本,但这些是相对路径,我需要使用 NodeJS 脚本将它们修改为绝对路径。有没有办法以简单的方式实现相同的目标?
例子:
资源
![](myImage.png?raw=true)
结果
![](www.example.com/myImage.png?raw=true)
我需要修改的 markdwon 内容中有多个图像。
解决方案
检查这个工作示例:https ://repl.it/repls/BlackJuicyCommands
首先,您需要读取文件fs.readFile()
并将其解析Buffer
为string
.
现在您可以访问文件的文本,您需要用新的图像路径替换每个图像路径。捕获它的一种方法是使用正则表达式。例如,您可以寻找 ](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
,png
或jpeg
/ jpg
。正则g
表达式之后必须匹配所有出现,而不仅仅是第一个。
Javascript/node (< version 9)不支持lookbehind。我使用了一个包含](
图像路径之前的正则表达式,然后稍后将其过滤掉(或者您可以使用更复杂的正则表达式)。
将(.+)
图像路径捕获为一个组。然后就可以使用字符串的替换功能了。replace 函数接受正则表达式作为第一个参数。第二个参数可以是一个函数,它接收完整匹配作为第一个参数(在这种情况下](image_path_without_extension
,任何捕获的组作为以下参数)。
使用节点模块更改 urlpath
或url
返回捕获的组(在下面我调用了该参数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 示例中,它被写入不同的文件。如果要覆盖,请使用相同的文件名。
推荐阅读
- mongodb - Mongo:管道中的 $exists $lookup 未按预期工作
- reactjs - 如何在reactjs中使用map从api中获取数据?
- ios - 在 UITextField 中使用数字键盘的 mm:ss 格式的持续时间
- python - Pyspark 使用空条目计算行加权平均值
- swift5 - iOS SCNScene 如何使材质均匀照明而没有阴影?
- angular - 如何使用角度组件调用 Apexcharts 事件中的函数?
- pdf - 在 KB50001330 之后将 html 打印为 pdf 时文件名错误
- textures - 如何使用 meshroom 将语义分割掩码组合成 3D 纹理?
- amazon-web-services - 使用 AWS LEX 捕获任何用户输入
- python - 将图像的某些部分排除在 CNN 训练之外