Using Redcarpet, when I include something like the following in my markdown, it does not respect any line breaks or indention. I've tried two spaces at the end of lines. Extra lines between code. Nothing seems to work.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<hash>
<money>3</money>
</hash>
```
I see:
<?xml version="1.0" encoding="UTF-8"?> <hash> <money>3</money> </hash>
Here are the Redcarpet settings:
Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true, :fenced_code_blocks => true, :no_intra_emphasis => true, :lax_html_blocks => true)
What do I need to do to make the lines break properly and preserve indention, just like here or on GitHub?
Update - And the source looks like:
<pre><code><?xml version="1.0" encoding="UTF-8"?>
<hash>
<money>3</money>
</hash>
</code></pre>
Try wrapping the markdown result in the find_and_preserve
Haml helper
# Assuming a setup like this:
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)
code_snippet = " <xml>\n <tag/>\n </xml>"
# This should prevent undesirable spaces within code blocks:
find_and_preserve(markdown.render(code_snippet)).html_safe
When you wrap the render call with the find_and_preserve
Haml helper, all newlines within <pre>
tags in the markdown output are escaped with equivalent HTML entities, and the Haml auto-indention will then ignore them.
The result of parsing has newlines inside a <pre>
block for me:
require 'redcarpet'
md = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks:true)
puts md.render("```xml\n<foo>\n</foo>\n```")
#=> <pre><code class="xml"><foo>
#=> </foo>
#=> </code></pre>
- Confirm that you are seeing a similar wrapper in your output HTML
Set your CSS to use preformatting in <pre>
blocks:
pre { white-space:pre }
On Github, all I needed to do was wrap my indented/formatted text with <pre>
and </pre>
tags.
Try this script to isolate whether it's something in your app or redcarpet.
I'm not able to reproduce the issue you're having (With the redcarpet-2.1.1 gem). Put this into a file, then run it (ruby redcarpet_test.rb
):
require 'rubygems'
require 'redcarpet'
md = %Q{...
```xml
<?xml version="1.0" encoding="UTF-8"?>
<hash>
<money>3</money>
</hash>
```
...}
r = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true, :fenced_code_blocks => true, :no_intra_emphasis => true, :lax_html_blocks => true)
puts r.render md
That results appropriately with:
<p>...
<code>xml
<?xml version="1.0" encoding="UTF-8"?>
<hash>
<money>3</money>
</hash>
</code>
...</p>