我需要将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 = /<source={(?<source>[^}]+)} date={(?<date>[^}]+)}( link={(?<link>[^}]+)?})?>(<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。但这并不包括输出中的元数据。
还有更好的办法吗
1条答案
按热度按时间ux6nzvsh1#
我从found开始就认为Kramdown宝石似乎提供了我所需要的。
它们支持块级元素的自定义属性。使用它们的语法,我大概可以这样做:
这将产生:
我将无法使用这个gem,因为我有不兼容的预先存在的markdown语法。此外,我认为让用户设置任意自定义属性(XSS)是危险的,因此需要一个白名单。不过,我把这个留在这里以防对别人有帮助。