require "nokogiri" Jekyll::Hooks.register [:pages, :documents], :post_convert do |doc| next unless doc.output_ext == ".html" site = doc.site next unless site.data["plugins"] alert_type = site.data["plugins"]["auto_alert"] next unless alert_type fragment = Nokogiri::HTML::DocumentFragment.parse(doc.content) # 遍历 HTML 中的所有 blockquote 标签 fragment.css("blockquote").each do |item| # 找出第一个子节点,用于判断是否含有 [!type] 标记 first_child = item.at_css("*:first-child") next unless first_child next unless first_child.name == "p" text = first_child.text.downcase # 遍历所有 alert 类型 alert_type.each do |type, data| # 情况一:完整匹配 [!type] 形式
[!NOTE]
if text == "[!#{type}]" # 将 alert 类型对应的 class 加入 blockquote item['class'] = [item['class'], data["class_name"]].compact.join(" ") # 将替换为
[!NOTE]\n\n other content
elsif text.start_with? "[!#{type}]\n" # 将 alert 类型对应的 class 加入 blockquote item['class'] = [item['class'], data["class_name"]].compact.join(" ") # 在原段落前插入标题[!NOTE]\n\n other content
first_child.add_previous_sibling "\n other content
first_child.content = first_child.content.sub(/\A#{Regexp.escape("[!#{type}]\n")}/i, "") break end end end doc.content = fragment.to_html end