【问题标题】:custom markdown in user input用户输入中的自定义降价
【发布时间】:2013-02-06 23:56:33
【问题描述】:

我想为用户 cmets 添加一个简单的降价。

当用户提交此评论时:

我刚拿到[卡片:黑莲花]的人。战俘!

我希望它是这样显示的:

我刚拿到黑莲花人。战俘!

但带有额外的 html 标记:

I just got <span class="preview" data-card="/cards/card.id">Black Lotus</span> man. POW!

1) 我查看了Redcarpet,但不知道如何添加[card:...] markdown。

2) 还是我应该在将内容保存到数据库之前运行正则表达式并替换内容,然后在显示评论之前使用sanitize(ActionView::Helpers::SanitizeHelper) span 标签?

【问题讨论】:

    标签: ruby-on-rails ruby markdown redcarpet


    【解决方案1】:

    回答我自己的问题:

    定义自定义渲染器并覆盖 normal_text 方法就可以了。

    class HTMLwithCards < Redcarpet::Render::HTML
      def preprocess(full_document)
        full_document.gsub(/\[card:(.*)\]/) do
          card = Card.find_by_name($1)
          if card
            "<span class='preview' data-card='/cards/#{card.id}'>#{$1}</span>"
          else
            $1
          end 
        end
      end
    end
    

    然后你可以这样称呼它:

    def markdown(text)
      renderer = HTMLwithCards.new(hard_wrap: true, filter_html: true)
      Redcarpet::Markdown.new(renderer).render(text).html_safe
    end
    

    【讨论】:

    • AFAIK 你需要使用preprocess 而不是normal_text,所以我正在编辑这个。如果您知道我遗漏了什么,请更正我的更正。
    • @iconoclast 不会以这种方式使用preprocess 要求您关闭filter_html?我认为使用normal_textpostprocess 的解决方案将是这里的方法,这取决于你是否关心你的语法是否会弄乱代码块
    猜你喜欢
    • 2021-06-09
    • 2014-03-11
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多