I have a Rails site, where the content is written in markdown. I wish to display a snippet of each, with a "Read more.." link.
How do I go about this? Simple truncating the raw text will not work, for example..
>> "This is an [example](http://example.com)"[0..25]
=> "This is an [example](http:"
Ideally I want to allow the author to (optionally) insert a marker to specify what to use as the "snippet", if not it would take 250 words, and append "..." - for example..
This article is an example of something or other.
This segment will be used as the snippet on the index page.
^^^^^^^^^^^^^^^
This text will be visible once clicking the "Read more.." link
The marker could be thought of like an EOF marker (which can be ignored when displaying the full document)
I am using maruku for the Markdown processing (RedCloth is very biased towards Textile, BlueCloth is extremely buggy, and I wanted a native-Ruby parser which ruled out peg-markdown and RDiscount)
Alternatively (since the Markdown is translated to HTML anyway) truncating the HTML correctly would be an option - although it would be preferable to not markdown()
the entire document, just to get the first few lines.
So, the options I can think of are (in order of preference)..
- Add a "truncate" option to the maruku parser, which will only parse the first x words, or till the "excerpt" marker.
- Write/find a parser-agnostic Markdown truncate'r
- Write/find an intelligent HTML truncating function
The following from http://mikeburnscoder.wordpress.com/2006/11/11/truncating-html-in-ruby/, with some modifications will correctly truncate HTML, and easily allow appending a string before the closing tags.
The modified code:
I will have to agree with the "two inputs" approach, and the content writer would need not to worry, since you can modify the background logic to mix the two inputs in one when showing the full content.
Here's a solution that works for me with Textile.
Remove any HTML tags that got cut in half with
Then, uses Hpricot to clean it up and close unclosed tags
I do this in a helper, and with caching there's no performance issue.
A simpler option that just works:
You could use a regular expression to find a line consisting of nothing but "^" characters:
Not sure if it applies to this case, but adding the solution below for the sake of completeness. You can use strip_tags method if you are truncating Markdown-rendered contents:
Sourced from: http://devblog.boonecommunitynetwork.com/rails-and-markdown/