17. Markdown
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
>
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
> id sem consectetuer libero luctus adipiscing.
=> <blockquote><p>This is a blockquote with two paragraphs. Lorem ipsum
dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi
posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet
vitae, risus.</p></blockquote>
29. Block elements
Unordered list: Blockquotes:
* Item “To be, or not to
* Item be.”
Ordered list:
1. Item
2. Item
Or
1) Item
2) Item
30. Block elements
def block_element_markup(text)
blocks = text.split(quot;nnquot;)
new_text = Array.new
blocks.each do |block|
# Work out what type of block element it is.
end
return new_text.join(quot;nnquot;)
end
31. Block elements
if block.match(/((^*s.*$n?)+)/)
lines = Array.new
block.each_line do |line|
lines << line.gsub(/*s(.*)$/, '<li>1</li>')
end
new_text << content_tag(quot;ulquot;, quot;nquot; + lines.join(quot;quot;) + quot;nquot;)
elsif block.match(/((^d+[.)]s.*$n?)+)/)
lines = Array.new
block.each_line do |line|
lines << line.gsub(/d+.s(.*)$/, '<li>1</li>')
end
new_text << content_tag(quot;olquot;, quot;nquot; + lines.join(quot;quot;) + quot;nquot;)
...
end
33. Dealing with links...
def auto_link_urls(text, href_options = {})
extra_options = tag_options(href_options.stringify_keys) || quot;quot;
auto_link_re = %r{
( # leading text
<w+.*?>| # leading HTML tag, or
[^=!:'quot;/]| # leading punctuation, or
^ # beginning of line
)
(https?://|ftp://) # protocol spec
(
[-w]+ # subdomain or domain
(?:.[-w]+)* # remaining subdomains or domain
(?::d+)? # port
(?:/(?:(?:[~w+@%-]|(?:[,.;:][^s$]))+)?)* # path
(?:?[w+@%&=.;-]+)? # query string
(?:#[w-/]*)? # trailing anchor
)(([[:punct:]]|s|<|$)) # trailing text
}x
text.gsub(auto_link_re) do
all, a, b, c, d = $&, $1, $2, $3, $5
text = a + quot;<a href=quot;quot; + b + c + quot;quot;>quot; + truncate_in_middle(c, 40) + quot;</a>quot; + $5
end
end
34. Truncate URLS in the
middle...
def truncate_in_middle(text, length = 30, truncate_string = quot;...quot;)
if text
l = ((length - truncate_string.chars.length) / 2).to_int
chars = text.chars
return (chars.length > length ? chars[0...l] + truncate_string
+ chars[chars.length-l...chars.length] : text).to_s
end
end
35. Detecting code snippets
def mark_code(text)
h(text).
gsub(/(^<[a-zA-Z]+.*$|<[a-zA-Z]+.*>)/) do
text = quot;<code>quot; + ($1) + quot;</code>quot;
end
end
<html> => <code><html></code>
36. Detecting phone
numbers
07736111111
=> <a tel=quot;07736111111quot;> 07736111111</a>
def auto_link_phone_numbers(text)
text.gsub(/(s|^)((0|+44)d{10,10})b/) do
text = $1 + quot;<a href=quot;tel:quot; + $2 + quot;quot;>quot; + $2
+ quot;</a>quot;
end
end
44. What next?
• Test on some real user input!
• Make it configurable
45. What next?
• Test on some real user input!
• Make it configurable
• Port to PHP (for Wordpress)?
46. What next?
• Test on some real user input!
• Make it configurable
• Port to PHP (for Wordpress)?
• gem vs plugin?
47. What next?
• Test on some real user input!
• Make it configurable
• Port to PHP (for Wordpress)?
• gem vs plugin?
• Get feedback from other developers.