basic support for Redcarpet Markdown

This commit is contained in:
Brian Wisti 2011-08-16 10:28:00 -07:00
parent 97ab077e04
commit 03127cd592
7 changed files with 257 additions and 152 deletions

View file

@ -50,6 +50,7 @@ gem 'json', '1.4.6'
gem 'http_accept_language', :git => 'git://github.com/iain/http_accept_language.git', :ref => '0b78aa7849fc90cf9e12' gem 'http_accept_language', :git => 'git://github.com/iain/http_accept_language.git', :ref => '0b78aa7849fc90cf9e12'
gem 'thin', '1.2.11', :require => false gem 'thin', '1.2.11', :require => false
gem 'redcarpet', :git => 'git://github.com/tanoku/redcarpet'
#Websocket #Websocket
gem 'em-websocket', :git => 'git://github.com/igrigorik/em-websocket', :ref => 'e278f5a1c4db60be7485' gem 'em-websocket', :git => 'git://github.com/igrigorik/em-websocket', :ref => 'e278f5a1c4db60be7485'

View file

@ -56,6 +56,12 @@ GIT
addressable (>= 2.1.1) addressable (>= 2.1.1)
eventmachine (>= 0.12.9) eventmachine (>= 0.12.9)
GIT
remote: git://github.com/tanoku/redcarpet
revision: 6b43f042305eb63620e3771a977f45e24ea7b576
specs:
redcarpet (2.0.0b3)
GIT GIT
remote: git://github.com/zhitomirskiyi/ruby-jwt.git remote: git://github.com/zhitomirskiyi/ruby-jwt.git
revision: fa7f46b5ac3653e30cf60abc78de9ffb3319dc0c revision: fa7f46b5ac3653e30cf60abc78de9ffb3319dc0c
@ -500,6 +506,7 @@ DEPENDENCIES
rails (= 3.0.9) rails (= 3.0.9)
rails-i18n rails-i18n
rcov rcov
redcarpet!
resque (= 1.10.0) resque (= 1.10.0)
resque-ensure-connected resque-ensure-connected
rest-client (= 1.6.1) rest-client (= 1.6.1)

View file

@ -2,134 +2,27 @@
# licensed under the Affero General Public License version 3 or later. See # licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file. # the COPYRIGHT file.
require 'lib/diaspora/markdownify'
module MarkdownifyHelper module MarkdownifyHelper
def markdownify(message, options={}) def markdownify(message, render_options={})
message = h(message).to_str markdown_options = {
:autolink => true,
}
options[:newlines] = true if !options.has_key?(:newlines) render_options[:filter_html] = true
options[:specialchars] = true if !options.has_key?(:specialchars)
message = process_links(message) renderer = Diaspora::Markdownify::HTML.new(render_options)
message = process_autolinks(message) markdown = Redcarpet::Markdown.new(renderer, markdown_options)
message = process_emphasis(message) message = markdown.render(message)
message = process_youtube(message, options[:youtube_maps]) return message.html_safe
message = process_vimeo(message, options[:vimeo_maps])
message = process_specialchars(message) if options[:specialchars]
message = process_newlines(message) if options[:newlines]
message.html_safe
end end
def process_newlines(message) def process_newlines(message)
message.gsub!(/\n+/, '<br />') # in very clear cases, let newlines become <br /> tags
message # Grabbed from Github flavored Markdown
end message.gsub(/^[\w\<][^\n]*\n+/) do |x|
x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
def process_links(message)
message.gsub!(/\[\s*([^\[]+?)\s*\]\(\s*([^ ]+\s*) \&quot;(([^&]|(&[^q])|(&q[^u])|(&qu[^o])|(&quo[^t])|(&quot[^;]))+)\&quot;\s*\)/) do |m|
escape = "\\"
link = $1
url = $2
title = $3
url.gsub!("_", "\\_")
url.gsub!("*", "\\*")
protocol = (url =~ /^\w+:\/\//) ? '' :'http://'
res = "<a target=\"#{escape}_blank\" href=\"#{protocol}#{url}\" title=\"#{title}\">#{link}</a>"
res
end
message.gsub!(/\[\s*([^\[]+?)\s*\]\(\s*([^ ]+)\s*\)/) do |m|
escape = "\\"
link = $1
url = $2
url.gsub!("_", "\\_")
url.gsub!("*", "\\*")
protocol = (url =~ /^\w+:\/\//) ? '' :'http://'
res = "<a target=\"#{escape}_blank\" href=\"#{protocol}#{url}\">#{link}</a>"
res
end
message
end
def process_youtube(message, youtube_maps)
processed_message = message.gsub(YoutubeTitles::YOUTUBE_ID_REGEX) do |matched_string|
match_data = matched_string.match(YoutubeTitles::YOUTUBE_ID_REGEX)
video_id = match_data[1]
anchor = match_data[2]
anchor ||= ''
if youtube_maps && youtube_maps[video_id]
title = h(CGI::unescape(youtube_maps[video_id]))
else
title = I18n.t 'application.helper.video_title.unknown'
end
' <a class="video-link" data-host="youtube.com" data-video-id="' + video_id + '" data-anchor="' + anchor + '" href="'+ match_data[0].strip + '" target="_blank">Youtube: ' + title + '</a>'
end
processed_message
end
def process_autolinks(message)
message.gsub!(/( |^)(www\.[^\s]+\.[^\s])/, '\1http://\2')
message.gsub!(/(<a target="\\?_blank" href=")?(https|http|ftp):\/\/([^\s]+)/) do |m|
captures = [$1,$2,$3]
if !captures[0].nil?
m
elsif m.match(/(youtu.?be|vimeo)/)
m.gsub(/(\*|_)/) { |m| "\\#{$1}" } #remove markers on markdown chars to not markdown inside links
else
res = %{<a target="_blank" href="#{captures[1]}://#{captures[2]}">#{captures[2]}</a>}
res.gsub!(/(\*|_)/) { |m| "\\#{$1}" }
res
end end
end end
message
end
def process_emphasis(message)
message.gsub!("\\**", "-^doublestar^-")
message.gsub!("\\__", "-^doublescore^-")
message.gsub!("\\*", "-^star^-")
message.gsub!("\\_", "-^score^-")
message.gsub!(/(\*\*\*|___)(.+?)\1/m, '<em><strong>\2</strong></em>')
message.gsub!(/(\*\*|__)(.+?)\1/m, '<strong>\2</strong>')
message.gsub!(/(\*|_)(.+?)\1/m, '<em>\2</em>')
message.gsub!("-^doublestar^-", "**")
message.gsub!("-^doublescore^-", "__")
message.gsub!("-^star^-", "*")
message.gsub!("-^score^-", "_")
message
end
def process_vimeo(message, vimeo_maps)
regex = /https?:\/\/(?:w{3}\.)?vimeo.com\/(\d{6,})\/?/
processed_message = message.gsub(regex) do |matched_string|
match_data = message.match(regex)
video_id = match_data[1]
if vimeo_maps && vimeo_maps[video_id]
title = h(CGI::unescape(vimeo_maps[video_id]))
else
title = I18n.t 'application.helper.video_title.unknown'
end
' <a class="video-link" data-host="vimeo.com" data-video-id="' + video_id + '" href="' + match_data[0] + '" target="_blank">Vimeo: ' + title + '</a>'
end
processed_message
end
def process_specialchars(message)
map = [
["&lt;3", "&hearts;"],
["&lt;-&gt;", "&#8596;"],
["-&gt;", "&rarr;"],
["&lt;-", "&larr;"],
["...", "&hellip;"],
["(tm)", "&trade;"],
["(r)", "&reg;"],
["(c)", "&copy;"]
]
map.each do |mapping|
message.gsub!(mapping[0], mapping[1])
end
message
end
end end

View file

@ -25,7 +25,7 @@ Feature: posting
Scenario: see a tag that I am following Scenario: see a tag that I am following
When I go to the home page When I go to the home page
And I follow "#boss" And I follow "#boss"
Then I should see "I am da #boss" Then I should see "I am da #boss" within "body"
Scenario: can stop following a particular tag Scenario: can stop following a particular tag
When I hover over the ".button.tag_following" When I hover over the ".button.tag_following"

169
lib/diaspora/markdownify.rb Normal file
View file

@ -0,0 +1,169 @@
require 'uri'
module Diaspora
module Markdownify
class HTML < Redcarpet::Render::HTML
attr_accessor :newlines, :specialchars, :youtube_maps, :vimeo_maps
def initialize(options={})
super
@expand_tags = options.fetch(:expand_tabs, true)
@newlines = options.fetch(:newlines, true)
@specialchars = options.fetch(:specialchars, true)
@youtube_maps = options.fetch(:youtube_maps, {})
@vimeo_maps = options.fetch(:vimeo_maps, {})
end
def autolink(link, type)
autolink_youtube(link) || autolink_vimeo(link) || autolink_simple(link)
end
def autolink_simple(link)
# If there isn't *some* protocol, assume http
if link !~ %r{^\w+://}
link = "http://#{link}"
end
content = link.gsub(%r{^\w+://}, '')
%Q{<a target="_blank" href="#{link}">#{content}</a>}
end
def autolink_vimeo(link)
regex = %r{https?://(?:w{3}\.)?vimeo.com/(\d{6,})/?}
if link =~ regex
video_id = $1
if @vimeo_maps[video_id]
title = h(CGI::unescape(@vimeo_maps[video_id]))
else
title = I18n.t 'application.helper.video_title.unknown'
end
return ' <a class="video-link" data-host="vimeo.com" data-video-id="' +
video_id + '" href="' + link + '" target="_blank">Vimeo: ' + title + '</a>'
end
end
def autolink_youtube(link)
if link =~ YoutubeTitles::YOUTUBE_ID_REGEX
video_id = $1
anchor = $2 || ''
if @youtube_maps[video_id]
title = h(CGI::unescape(@youtube_maps[video_id]))
else
title = I18n.t 'application.helper.video_title.unknown'
end
return ' <a class="video-link" data-host="youtube.com" data-video-id="' +
video_id + '" data-anchor="' + anchor +
'" href="'+ link + '" target="_blank">Youtube: ' + title + '</a>'
end
end
def double_emphasis(text)
"<strong>#{text}</strong>"
end
def linebreak()
"<br />"
end
def link(link, title, content)
return autolink(link, 'url') if link == content
if link =~ Regexp.new(Regexp.escape(content))
return autolink(link, 'url')
end
if link !~ %r{^\w+://}
link = "http://#{link}"
end
tag = if title and content
%Q{<a target="_blank" href="#{link}" title="#{title}">#{content}</a>}
elsif content
%Q{<a target="_blank" href="#{link}">#{content}</a>}
else
autolink(link, 'url')
end
return tag
end
def paragraph(text)
if @expand_tags
text = Diaspora::Taggable.format_tags(text, :no_escape => true)
end
return "<p>#{text}</p>"
end
def preprocess(full_document)
if @specialchars
full_document = specialchars(full_document)
end
our_unsafe_chars = '()'
full_document = full_document.gsub(%r{
\[ \s*? ( [^ \] ]+ ) \s*? \]
(?:
\( \s*? (\S+) \s*? (?: "([^"]+)" )? \) \s*?
)
}xm) do |m|
content = $1
link = URI.escape($2, our_unsafe_chars)
title = $3
title_chunk = if title
%W{" #{title}"}
else
''
end
%Q{[#{content}](#{link}#{title_chunk})}
end
if @newlines
# in very clear cases, let newlines become <br /> tags
# Grabbed from Github flavored Markdown
full_document = full_document.gsub(/^[\w\<][^\n]*\n+/) do |x|
x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
end
end
return full_document
end
def single_emphasis(text)
"<em>#{text}</em>"
end
def specialchars(text)
if @specialchars
map = [
["<3", "&hearts;"],
["<->", "&#8596;"],
["->", "&rarr;"],
["<-", "&larr;"],
["\.\.\.", "&hellip;"],
["(tm)", "&trade;"],
["(r)", "&reg;"],
["(c)", "&copy;"]
]
end
map.each do |mapping|
text = text.gsub(mapping[0], mapping[1])
end
return text
end
def triple_emphasis(text)
single_emphasis(double_emphasis(text))
end
end
end
end

View file

@ -38,6 +38,9 @@ h1
ul > li ul > li
:list-style none :list-style none
.content ul li
:list-style disc
form form
:position relative :position relative
input, input,

View file

@ -8,31 +8,35 @@ describe MarkdownifyHelper do
describe "#markdownify" do describe "#markdownify" do
describe "autolinks" do describe "autolinks" do
it "should not allow basic XSS/HTML" do it "should not allow basic XSS/HTML" do
markdownify("<script>alert('XSS is evil')</script>").should == "&lt;script&gt;alert('XSS is evil')&lt;/script&gt;" markdownify("<script>alert('XSS is evil')</script>").should == "<p>alert('XSS is evil')</p>"
end end
it "should recognize basic http links (1/3)" do it "should recognize basic http links (1/3)" do
proto="http" proto="http"
url="bugs.joindiaspora.com/issues/332" url="bugs.joindiaspora.com/issues/332"
markdownify(proto+"://"+url).should == "<a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a>" full_url = "#{proto}://#{url}"
markdownify(full_url).should == %Q{<p><a target="_blank" href="#{full_url}">#{url}</a></p>}
end end
it "should recognize basic http links (2/3)" do it "should recognize basic http links (2/3)" do
proto="http" proto="http"
url="webmail.example.com?~()!*/" url="webmail.example.com?~()!*/"
markdownify(proto+"://"+url).should == "<a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a>" full_url = "#{proto}://#{url}"
markdownify(full_url).should == %Q{<p><a target="_blank" href="#{full_url}">#{url}</a></p>}
end end
it "should recognize basic http links (3/3)" do it "should recognize basic http links (3/3)" do
proto="http" proto="http"
url="127.0.0.1:3000/users/sign_in" url="127.0.0.1:3000/users/sign_in"
markdownify(proto+"://"+url).should == "<a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a>" full_url = "#{proto}://#{url}"
markdownify(full_url).should == %Q{<p><a target="_blank" href="#{full_url}">#{url}</a></p>}
end end
it "should recognize secure https links" do it "should recognize secure https links" do
proto="https" proto="https"
url="127.0.0.1:3000/users/sign_in" url="127.0.0.1:3000/users/sign_in"
markdownify(proto+"://"+url).should == "<a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a>" full_url = "#{proto}://#{url}"
markdownify(full_url).should == %Q{<p><a target="_blank" href="#{full_url}">#{url}</a></p>}
end end
it "doesn't double parse video links" do it "doesn't double parse video links" do
@ -40,8 +44,8 @@ describe MarkdownifyHelper do
http://www.youtube.com/watch?v=0x__dDWdf23&a=GxdCwVVULXdvEBKmx_f5ywvZ0zZHHHDU&list=ML&playnext=1 http://www.youtube.com/watch?v=0x__dDWdf23&a=GxdCwVVULXdvEBKmx_f5ywvZ0zZHHHDU&list=ML&playnext=1
http://youtu.be/x_CzD0GBD-4" http://youtu.be/x_CzD0GBD-4"
res = markdownify(message) res = markdownify(message)
res.should =~ /href.+href.+href/ res.should =~ /href.+href.+href/m
res.should_not =~ /href.+href.+href.+href/ res.should_not =~ /href.+href.+href.+href/m
end end
describe "video links" do describe "video links" do
@ -69,6 +73,12 @@ describe MarkdownifyHelper do
res.should =~ /Youtube:/ res.should =~ /Youtube:/
res.should =~ /data-host="youtube.com"/ res.should =~ /data-host="youtube.com"/
res.should =~ /data-video-id="#{video_id}"/ res.should =~ /data-video-id="#{video_id}"/
url = "www.youtube.com/watch?foo=bar&v=BARFOO-----&whatever=related"
res = markdownify(url)
res.should =~ /Youtube:/
res.should =~ /data-host="youtube.com"/
res.should =~ /data-video-id="BARFOO-----"/
end end
it "recognizes youtu.be links" do it "recognizes youtu.be links" do
@ -141,113 +151,135 @@ describe MarkdownifyHelper do
proto="ftp" proto="ftp"
url="ftp.uni-kl.de/CCC/26C3/mp4/26c3-3540-en-a_hackers_utopia.mp4" url="ftp.uni-kl.de/CCC/26C3/mp4/26c3-3540-en-a_hackers_utopia.mp4"
# I did not watch that one, but the title sounds nice :P # I did not watch that one, but the title sounds nice :P
markdownify(proto+"://"+url).should == "<a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a>" markdownify(proto+"://"+url).should == "<p><a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a></p>"
end end
it "should recognize www links" do it "should recognize www links" do
url="www.joindiaspora.com" url="www.joindiaspora.com"
markdownify(url).should == "<a target=\"_blank\" href=\"http://"+url+"\">"+url+"</a>" markdownify(url).should == %Q{<p><a target="_blank" href="http://#{url}">#{url}</a></p>}
end end
end end
describe "specialchars" do describe "specialchars" do
it "replaces &lt;3 with &hearts;" do it "replaces &lt;3 with &hearts;" do
message = "i <3 you" message = "i <3 you"
markdownify(message).should == "i &hearts; you" markdownify(message).should == "<p>i &hearts; you</p>"
end end
it "replaces various things with (their) HTML entities" do it "replaces various things with (their) HTML entities" do
message = "... <-> -> <- (tm) (r) (c)" message = "... <-> -> <- (tm) (r) (c)"
markdownify(message).should == "&hellip; &#8596; &rarr; &larr; &trade; &reg; &copy;" markdownify(message).should == "<p>&hellip; &#8596; &rarr; &larr; &trade; &reg; &copy;</p>"
end end
it "skips doing it if you say so" do it "skips doing it if you say so" do
message = "... -> <-" message = "... -> <-"
markdownify(message, :specialchars => false).should == "... -&gt; &lt;-" markdownify(message, :specialchars => false).should == "<p>... -&gt; &lt;-</p>"
end end
end end
describe "weak emphasis" do describe "weak emphasis" do
it "should be recognized (1/2)" do it "should be recognized (1/2)" do
message = "*some text* some text *some text* some text" message = "*some text* some text *some text* some text"
markdownify(message).should == "<em>some text</em> some text <em>some text</em> some text" markdownify(message).should == "<p><em>some text</em> some text <em>some text</em> some text</p>"
end end
it "should be recognized (2/2)" do it "should be recognized (2/2)" do
message = "_some text_ some text _some text_ some text" message = "_some text_ some text _some text_ some text"
markdownify(message).should == "<em>some text</em> some text <em>some text</em> some text" markdownify(message).should == "<p><em>some text</em> some text <em>some text</em> some text</p>"
end end
end end
describe "strong emphasis" do describe "strong emphasis" do
it "should be recognized (1/2)" do it "should be recognized (1/2)" do
message = "**some text** some text **some text** some text" message = "**some text** some text **some text** some text"
markdownify(message).should == "<strong>some text</strong> some text <strong>some text</strong> some text" markdownify(message).should == "<p><strong>some text</strong> some text <strong>some text</strong> some text</p>"
end end
it "should be recognized (2/2)" do it "should be recognized (2/2)" do
message = "__some text__ some text __some text__ some text" message = "__some text__ some text __some text__ some text"
markdownify(message).should == "<strong>some text</strong> some text <strong>some text</strong> some text" markdownify(message).should == "<p><strong>some text</strong> some text <strong>some text</strong> some text</p>"
end end
end end
describe "nested weak and strong emphasis" do describe "nested weak and strong emphasis" do
it "should be rendered correctly" do it "should be rendered correctly" do
message = "__this is _some_ text__" message = "__this is _some_ text__"
markdownify(message).should == "<strong>this is <em>some</em> text</strong>" markdownify(message).should == "<p><strong>this is <em>some</em> text</strong></p>"
message = "*this is **some** text*" message = "*this is **some** text*"
markdownify(message).should == "<em>this is <strong>some</strong> text</em>" markdownify(message).should == "<p><em>this is <strong>some</strong> text</em></p>"
message = "___some text___" message = "___some text___"
markdownify(message).should == "<em><strong>some text</strong></em>" markdownify(message).should == "<p><em><strong>some text</strong></em></p>"
end end
end end
describe "links" do describe "links" do
it "should be recognized without title attribute" do it "should be recognized without title attribute" do
message = "[link text](http://someurl.com) [link text](http://someurl.com)" message = "[link text](http://someurl.com) [link text](http://someurl.com)"
markdownify(message).should == '<a target="_blank" href="http://someurl.com">link text</a> <a target="_blank" href="http://someurl.com">link text</a>' markdownify(message).should == '<p><a target="_blank" href="http://someurl.com">link text</a> <a target="_blank" href="http://someurl.com">link text</a></p>'
end end
it "should be recognized with title attribute" do it "should be recognized with title attribute" do
message = '[link text](http://someurl.com "some title") [link text](http://someurl.com "some title")' message = '[link text](http://someurl.com "some title") [link text](http://someurl.com "some title")'
markdownify(message).should == '<a target="_blank" href="http://someurl.com" title="some title">link text</a> <a target="_blank" href="http://someurl.com" title="some title">link text</a>' markdownify(message).should == '<p><a target="_blank" href="http://someurl.com" title="some title">link text</a> <a target="_blank" href="http://someurl.com" title="some title">link text</a></p>'
end end
it "should have a robust link parsing" do it "should have a robust link parsing" do
message = "[wikipedia](http://en.wikipedia.org/wiki/Text_(literary_theory))"
link = markdownify(message)
link.should =~ %r{href="http://en.wikipedia.org/wiki/Text_%28literary_theory%29"}
message = "[ links]( google.com)"
markdownify(message).should == %Q{<p><a target="_blank" href="http://google.com">links</a></p>}
message = "[_http_](http://google.com/search?q=with_multiple__underscores*and**asterisks )"
markdownify(message).should == %Q{<p><a target="_blank" href="http://google.com/search?q=with_multiple__underscores*and**asterisks"><em>http</em></a></p>}
message = %{[___FTP___]( ftp://ftp.uni-kl.de/CCC/26C3/mp4/26c3-3540-en-a_hackers_utopia.mp4 \"File Transfer Protocol\")}
markdownify(message).should == %{<p><a target="_blank" href="ftp://ftp.uni-kl.de/CCC/26C3/mp4/26c3-3540-en-a_hackers_utopia.mp4" title="File Transfer Protocol"><em><strong>FTP</strong></em></a></p>}
message = %{[**any protocol**](foo://bar.example.org/yes_it*makes*no_sense)}
markdownify(message).should == %{<p><a target="_blank" href="foo://bar.example.org/yes_it*makes*no_sense"><strong>any protocol</strong></a></p>}
message = "This [ *text* ]( http://en.wikipedia.org/wiki/Text_(literary_theory) ) with many [ links]( google.com) tests [_http_](http://google.com/search?q=with_multiple__underscores*and**asterisks ), [___FTP___]( ftp://ftp.uni-kl.de/CCC/26C3/mp4/26c3-3540-en-a_hackers_utopia.mp4 \"File Transfer Protocol\"), [**any protocol**](foo://bar.example.org/yes_it*makes*no_sense)" message = "This [ *text* ]( http://en.wikipedia.org/wiki/Text_(literary_theory) ) with many [ links]( google.com) tests [_http_](http://google.com/search?q=with_multiple__underscores*and**asterisks ), [___FTP___]( ftp://ftp.uni-kl.de/CCC/26C3/mp4/26c3-3540-en-a_hackers_utopia.mp4 \"File Transfer Protocol\"), [**any protocol**](foo://bar.example.org/yes_it*makes*no_sense)"
markdownify(message).should == 'This <a target="_blank" href="http://en.wikipedia.org/wiki/Text_(literary_theory)"><em>text</em></a> with many <a target="_blank" href="http://google.com">links</a> tests <a target="_blank" href="http://google.com/search?q=with_multiple__underscores*and**asterisks"><em>http</em></a>, <a target="_blank" href="ftp://ftp.uni-kl.de/CCC/26C3/mp4/26c3-3540-en-a_hackers_utopia.mp4" title="File Transfer Protocol"><em><strong>FTP</strong></em></a>, <a target="_blank" href="foo://bar.example.org/yes_it*makes*no_sense"><strong>any protocol</strong></a>' markdownify(message).should == '<p>This <a target="_blank" href="http://en.wikipedia.org/wiki/Text_%28literary_theory%29"><em>text</em></a> with many <a target="_blank" href="http://google.com">links</a> tests <a target="_blank" href="http://google.com/search?q=with_multiple__underscores*and**asterisks"><em>http</em></a>, <a target="_blank" href="ftp://ftp.uni-kl.de/CCC/26C3/mp4/26c3-3540-en-a_hackers_utopia.mp4" title="File Transfer Protocol"><em><strong>FTP</strong></em></a>, <a target="_blank" href="foo://bar.example.org/yes_it*makes*no_sense"><strong>any protocol</strong></a></p>'
end
it "should leave #tag links intact" do
message = %{<a href="/tags/tagged" class="tag">#tagged</a>}
markdownify(message).should == "<p>#{message}</p>"
message = %{alice - 1 - <a href="/tags/tagged" class="tag">#tagged</a>}
markdownify(message).should == "<p>#{message}</p>"
end end
end end
describe "nested emphasis and links tags" do describe "nested emphasis and links tags" do
it "should be rendered correctly" do it "should be rendered correctly" do
message = '[**some *link* text**](someurl.com "some title")' message = '[**some *link* text**](someurl.com "some title")'
markdownify(message).should == '<a target="_blank" href="http://someurl.com" title="some title"><strong>some <em>link</em> text</strong></a>' markdownify(message).should == '<p><a target="_blank" href="http://someurl.com" title="some title"><strong>some <em>link</em> text</strong></a></p>'
end end
end end
it "should allow escaping" do it "should allow escaping" do
message = '*some text* \\*some text* \\**some text* _some text_ \\_some text_ \\__some text_' message = '*some text* \*some text* \**some text* _some text_ \_some text_ \__some text_'
markdownify(message).should == "<em>some text</em> *some text<em> **some text</em> <em>some text</em> _some text<em> __some text</em>" markdownify(message).should == "<p><em>some text</em> *some text* *<em>some text</em> <em>some text</em> _some text_ _<em>some text</em></p>"
end end
describe "newlines" do describe "newlines" do
it 'skips inserting newlines if you pass the newlines option' do it 'skips inserting newlines if you pass the newlines option' do
message = "These\nare\n\some\nnew\lines" message = "These\nare\n\some\nnew\lines"
res = markdownify(message, :newlines => false) res = markdownify(message, :newlines => false)
res.should == message res.should == "<p>#{message}</p>"
end end
it 'generates breaklines' do it 'generates breaklines' do
message = "These\nare\nsome\nnew\nlines" message = "These\nare\nsome\nnew\nlines"
res = markdownify(message) res = markdownify(message)
res.should == "These<br /\>are<br /\>some<br /\>new<br /\>lines" res.should == "<p>These<br /\>are<br /\>some<br /\>new<br /\>lines</p>"
end end
it 'should render newlines and basic http links correctly' do it 'should render newlines and basic http links correctly' do
message = "Some text, then a line break and a link\nhttp://joindiaspora.com\nsome more text" message = "Some text, then a line break and a link\nhttp://joindiaspora.com\nsome more text"
res = markdownify(message) res = markdownify(message)
res.should == 'Some text, then a line break and a link<br /><a target="_blank" href="http://joindiaspora.com">joindiaspora.com</a><br />some more text' res.should == '<p>Some text, then a line break and a link<br /><a target="_blank" href="http://joindiaspora.com">joindiaspora.com</a><br />some more text</p>'
end end
end end