如何为RDiscount的Markdown转换添加自定义基础目录?
给RDiscount的相对链接/图片添加自定义前缀路径
很遗憾,RDiscount本身并没有内置的方法来自动给相对链接或图片添加自定义前缀路径——我之前查过它的文档,确实没这个功能。不过我们可以用两种简单的方式来实现你想要的效果:
方法一:预处理Markdown文本(无需额外依赖)
我们可以在把Markdown传给RDiscount之前,用正则表达式替换掉所有相对路径的图片和链接,给它们加上指定的前缀。这种方法不需要额外安装gem,适合简单场景。
示例代码:
require 'rdiscount' base_path = 'SOMEFOLDER' markdown = "\n\n[link](somewhere.html)\n\n[external link](https://example.com)" # 替换相对路径的图片(排除http/https开头的绝对路径) processed_markdown = markdown.gsub(/!\[(.*?)\]\((?!https?:\/\/)(.*?)\)/, "") # 替换相对路径的链接(同样排除绝对路径) processed_markdown = processed_markdown.gsub(/\[(.*?)\]\((?!https?:\/\/)(.*?)\)/, "[\\1](#{base_path}/\\2)") doc = RDiscount.new(processed_markdown) html = doc.to_html puts html
这个正则会跳过已经是绝对路径(以http/https开头)的链接和图片,只处理相对路径的内容。
方法二:后处理生成的HTML(更可靠)
如果你的Markdown里有复杂的链接格式(比如带锚点、特殊字符的路径),正则可能会出现遗漏。这时用HTML解析库来处理会更稳妥,比如用Nokogiri。
首先需要安装Nokogiri:
gem install nokogiri
然后用下面的代码实现:
require 'rdiscount' require 'nokogiri' base_path = 'SOMEFOLDER' markdown = "\n\n[link](somewhere.html)\n\n[external link](https://example.com)" # 先正常转换Markdown到HTML doc = RDiscount.new(markdown) html = doc.to_html # 用Nokogiri解析HTML parsed_html = Nokogiri::HTML(html) # 修改所有相对路径的图片src parsed_html.css('img').each do |img| src = img['src'] # 跳过绝对路径和根路径开头的内容 unless src.start_with?('http://', 'https://', '/') img['src'] = "#{base_path}/#{src}" end end # 修改所有相对路径的链接href parsed_html.css('a').each do |a| href = a['href'] unless href.start_with?('http://', 'https://', '/') a['href'] = "#{base_path}/#{href}" end end # 输出处理后的HTML puts parsed_html.to_html
这种方法能精准识别所有<img>和<a>标签,不管路径里有什么特殊字符,处理起来都更可靠。
内容的提问来源于stack exchange,提问作者DannyB
相关产品推荐
相关产品推荐

