ruby 将元数据分配给Markdown中的块引号

ql3eal8s  于 2023-10-17  发布在  Ruby
关注(0)|答案(1)|浏览(135)

我需要将markdown blockquotes与某些Meta信息(作者/来源,日期和链接)相关联。
然后,这些信息包含在数据属性中,CSS使用这些属性中的信息显示页脚:

<blockquote data-source="some source" data-date="some date" data-link="some link">some quote...</blockquote>

问题是如何格式化我的markdown语法来填充这些数据属性。
我目前的解决方案是在常规的blockquote语法前面添加一行:

> <source={some source} date={some date} link={some link}>
> some quote...

然后,这个字符串被传递给markdown库Red Carpet(Ruby)的自定义渲染器,它将其识别为blockquote。我使用正则表达式提取元数据并呈现相应的<blockquote>标记。

class CustomRenderer < Redcarpet::Render::HTML
  include Rouge::Plugins::Redcarpet

  def block_quote(quote)
    pattern = /&lt;source={(?<source>[^}]+)} date={(?<date>[^}]+)}( link={(?<link>[^}]+)?})?&gt;(<br>)?(\n)?/m
    match = pattern.match(quote)

    if match
      quote.sub!(pattern, '')

      %{<blockquote data-source="#{match[:source]}" data-date="#{match[:date]}" data-link="#{match[:link]}">#{quote}</blockquote>}
    else
      %{<blockquote>#{quote}</blockquote>}
    end
  end
end

这种方法可以完成这项工作,但感觉很丑陋。具体来说,它是一个相当笨拙的正则表达式。更普遍的是,我不能动摇的感觉,必须有一个更简单的方法。
我已经考虑过在解析字符串之前对其进行预处理,但无论我如何预处理它,我认为最终都需要调用block_quote方法,并且需要在那里提取元数据 * 以某种方式 *。
我也知道有办法得到metadata for the entire markdown string。但这并不包括输出中的元数据。
还有更好的办法吗

ux6nzvsh

ux6nzvsh1#

我从found开始就认为Kramdown宝石似乎提供了我所需要的。
它们支持块级元素的自定义属性。使用它们的语法,我大概可以这样做:

> A nice blockquote
{: data-source="..." data-date="..." data-link="..."}

这将产生:

<blockquote data-source="..." data-date="..." data-link="...">
  A nice blockquote
</blockquote>

我将无法使用这个gem,因为我有不兼容的预先存在的markdown语法。此外,我认为让用户设置任意自定义属性(XSS)是危险的,因此需要一个白名单。不过,我把这个留在这里以防对别人有帮助。

相关问题