Возможно, не из коробки, но, используя redcarpet , вы можете написать собственный рендер для построения вашего дерева и затем манипулировать им.
Хотя остерегайтесь в этом случае вы не можете использовать повторноэкземпляр Markdown и Renderer и все методы в пользовательском подклассе Renderer должны возвращать строку.Примерно так может быть отправной точкой:
class StackRenderer < Redcarpet::Render::Base
attr_reader :items
def initialize
super
@items = []
end
def header(title, level)
items << { :text => title, :level => level, :type => :header }
"#{'#' * level} #{title}\n\n"
end
def paragraph(text)
items << { :text => text, :type => :paragraph }
"#{text}\n\n"
end
end
# example...
sr = StackRenderer.new
md = Redcarpet::Markdown.new(sr)
text = <<-EOF
# This is a title
And a short paragraph...
EOF
md.render(text) # => "# This is a title\n\nAnd a short paragraph...\n\n"
sr.items # => [{:type=>:header, :level=>1, :text=>"This is a title"},
# {:type=>:paragraph, :text=>"And a short paragraph..."}]