Ну, вы можете экранировать символы в Markdown:
# header 1
\# header 1
## header 2
\## header 2
... дает:
заголовок 1
# заголовок 1
заголовок 2
## header 2
Если вы не хотите этого делать, или вы анализируете уценку других людей и у вас нет выбора, я бы порекомендовал предварительно обработать входящую уценку, чтобы выполнить вышеуказанное для вас:
def pound_filter text
text.gsub /^#/, '\#'
end
Используя Redcarpet, вы можете убедиться, что он работает:
text = <<-END
# Hello
## World
END
Markdown.new(text.to_html)
# => <h1>Hello</h1>
#
# <h2>World</h2>
Markdown.new(pound_filter text).to_html
# => <p># Hello
# ## World</p>
Конечно, поскольку разрыв строки в HTML фактически не отображается как таковой - он будет выглядеть как одна строка:
# Hello ## World "
... вы можете увеличить это:
def pound_filter text
text.gsub( /((\A^)|([^\A]^))#/ ) {|match| "\n" == match[0] ? "\n\n\\#" : '\#' }
end
pound_filter text
# => \# Hello
#
# \## World
Markdown.new(pound_filter text).to_html
# => <p>\# Hello</p>
#
# <p>\## World</p>
Этот последний будет выглядеть как:
# Привет
## World
К сожалению, вы в конечном итоге попадаете в странную территорию, подобную этой, где заголовок находится внутри цитаты:
> ## Heading
... но я оставляю это как упражнение для читателя.