我有一些包含图像引用的markdown文本,但它们是相对路径,我需要使用NodeJS脚本将其修改为绝对路径。有什么方法可以通过简单的方式实现相同目的吗?
例:
资源
![](myImage.png?raw=true)
结果
![](www.example.com/myImage.png?raw=true)
我需要修改markdwon内容中的多个图像。
最佳答案
检查以下工作示例:https://repl.it/repls/BlackJuicyCommands
首先,您需要使用fs.readFile()
读取文件并将Buffer
解析为string
。
现在您可以访问文件的文本,需要用新的图像路径替换每个图像路径。捕获它的一种方法是使用regular expression。例如,您可以查找](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 /节点(does not support lookbehind。我在图像路径之前使用了正则表达式,其中包括
](
,然后稍后将其过滤掉(或者您可以使用更复杂的正则表达式)。(.+)
将图像路径捕获为一组。然后,您可以使用字符串的替换功能。 replace函数接受正则表达式作为第一个参数。第二个参数可以是一个函数,它将完全匹配(在这种情况下为](image_path_without_extension
,然后是所有捕获的组作为以下参数)作为第一个参数。使用节点模块
path
或url
更改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}`;
})
See the repl example to see it live in action.注意:在repl示例中,它被写入另一个文件。如果要覆盖,请使用相同的文件名。
关于node.js - 使用Node JS更改Markdown文本中的图像源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52852425/