Решение на Пета задача от Недислав Стойчев

Обратно към всички решения

Към профила на Недислав Стойчев

Резултати

  • 3 точки от тестове
  • 0 бонус точки
  • 3 точки общо
  • 20 успешни тест(а)
  • 37 неуспешни тест(а)

Код

class Formatter
attr_accessor :input_text
attr_accessor :raw_text
attr_accessor :html
attr_reader :major_split
attr_reader :symbols
def initialize(text)
@major_split = MajorSplit.new
@symbols = Symbols.new
@input_text = text
@raw_text = text.strip.split("\n\n")
@html = []
end
def to_html
raw_text.each do |x|
if x.include? "#"
major_split.headers_split x, html
else
major_split.blockquotes x.strip, html
major_split.paragraph x.strip,html
end
end
return to_html_concat(html)
end
def to_s
to_html
end
def inspect
input_text
end
def to_html_concat(html)
output = ""
html.each_index do |x|
if x >= 1
output << "\n\n"+ html[x]
else
output << html[x]
end
end
output
end
end
class MajorSplit
attr_reader :symbols
def initialize
@symbols = Symbols.new
end
def paragraph(line, html)
if match = /^.?.?(([A-Z](.)+.+)\n?)+/.match(line)
s = symbols.special_sym match
html << "<p>#{s.strip}</p>"
elsif match = /^\#{1,4}\s{1,4}.+[A-Za-z].+/.match(line)
headers line, html
else
html << "<p>#{line.strip!}</p>"
end
end
def headers(line, html)
if match = /^\#{,4}\s{1,4}.+[A-Za-z].+/.match(line)
count = match.to_s.count "#"
s = symbols.special_sym match
html << "<h#{count}>#{s.delete("#").lstrip}</h#{count}>"
else
html << "<p>#{line.strip!}</p>"
end
end
def headers_split(line, html)
line.split("\n").each do |y|
paragraph y,html
end
end
def precode(line, html)
p line
if match = /(^\s{4}(.+)).?/m.match(line)
html << "<pre><code>#{match.to_s.delete(/^\s{4}/)}</pre></code>"
end
end
def blockquotes(line, html)
if match = /^> (\w+.+)\n?/m.match(line)
html << "<blockquote>#{match}</blockquote>"
end
end
def lists(line, html)
end
end
class Symbols
def links(line)
if /\[(.+)\]\((\w+.+)\)/.match(line.to_s)
p line.gsub!(/\[\w+.+\]\(\w+.+\)/, "<a href=\"#{$2}\">#{$1}</a>")
end
return line
end
def fonts(line)
if /\*\*(.+)\*\*/.match(line.to_s)
line.gsub!(/\*\*.+\*\*/, "<strong>#{$1}</strong>")
end
if /_(.+)_/.match(line.to_s) then line.gsub!(/_.+_/, "<em>#{$1}</em>") end
links line
end
def special_sym(line)
match = line.to_s
if match.include? "&" then match.gsub!("&", "&amp;") end
if match.include? "<" then match.gsub!("<", "&lt;") end
if match.include? ">" then match.gsub!(">", "&gt;") end
if match.include? "\"" then match.gsub!("\"", "&quot;") end
fonts match
end
def to_symbols(line)
special_sym line
end
end

Лог от изпълнението

....F.FFF.FFFFFFFFFFF"<a href=\"http://fmi.ruby.bg/\">Programming in Ruby</a>"
.F"We have <a href=\"another-url\">a first](some-url) and [Second</a>."
F."This one <a href=\"in-a-code-block\">is a link</a> - keep as-is."
F"Also testing <a href=\"here\">special &amp; &quot;entities&quot; &lt;b&gt;</a>."
."Or <a href=\"special &amp; &quot;entities&quot; &lt;b&gt;\">what if</a> are in the URL, eh?"
.FFFFFF.F.FFnil
FFnil
FFF...FF...FF.."## <em>\u0424\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F</em> \u043D\u0430 <a href=\"http://daringfireball.net/projects/markdown/syntax#philosophy\">Markdown</a>"
F

Failures:

  1) Formatter paragraphs breaks paragraphs with block-level elements
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>First line.</p>\n<h1>Header...</h1>\n<p>Third line.</p>\n\n<p>Separate line</p>"
            got: "<p>First line.</p>\n\n<p># Header...</p>\n\n<p>Third line.</p>\n\n<p>Separate line</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,5 +1,7 @@
        <p>First line.</p>
       -<h1>Header...</h1>
       +
       +<p># Header...</p>
       +
        <p>Third line.</p>
        
        <p>Separate line</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:69:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) Formatter headers renders properly with the #, ##, ### and #### syntax
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<h1>This one is an H1</h1>"
            got: "<p># This one is an H1</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `each'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:96:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) Formatter headers renders tricky ones
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<h3>This one is an H3 ###</h3>"
            got: "<h6>This one is an H3 </h6>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `each'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:106:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) Formatter headers skips the malformed ones
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>##### Header TOO small</p>"
            got: "<p></p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `each'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:114:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) Formatter code blocks renders simple blocks
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<pre><code>This one is a simple code block</code></pre>"
            got: "<p>This one is a simple code block</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:124:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  6) Formatter code blocks renders multiline blocks with empty lines
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<pre><code>require 'gravity'\n\n# I'm flying! Just like in Python!</code></pre>"
            got: "<p></p>\n\n<p></p>\n\n<p># I'm flying! Just like in Python!</p>"
       
       (compared using ==)
       
       Diff:
       
       @@ -1,4 +1,6 @@
       -<pre><code>require 'gravity'
       +<p></p>
        
       -# I'm flying! Just like in Python!</code></pre>
       +<p></p>
       +
       +<p># I'm flying! Just like in Python!</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:140:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  7) Formatter code blocks renders multiple ones
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<pre><code>First code-block</code></pre>\n\n<pre><code>Second block of code</code></pre>"
            got: "<p>First code-block</p>\n\n<p>Second block of code</p>"
       
       (compared using ==)
       
       Diff:
       
       @@ -1,4 +1,4 @@
       -<pre><code>First code-block</code></pre>
       +<p>First code-block</p>
        
       -<pre><code>Second block of code</code></pre>
       +<p>Second block of code</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:156:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  8) Formatter code blocks escapes special entities
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<pre><code>quote = &quot;Simple &amp; efficient&quot;;</code></pre>"
            got: "<p></p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:160:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  9) Formatter code blocks renders properly a longer example with tabs and Unicode
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<pre><code>// \u041F\u0440\u0438\u043C\u0435\u0440 \u0437\u0430 \u0431\u043B\u043E\u043A \u0441 \u043A\u043E\u0434.\n// \u0412 \u043D\u0435\u0433\u043E \u0432\u0441\u0435\u043A\u0438 \u0440\u0435\u0434, \u0434\u043E\u0440\u0438 \u043F\u0440\u0430\u0437\u043D\u0438\u0442\u0435, \u0435 \u043F\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0430\u043D \u043E\u0442 \u0442\u043E\u0447\u043D\u043E \u0447\u0435\u0442\u0438\u0440\u0438 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0430.\ninclude &lt;stdio.h&gt;\n\nint main(int, char**) {\n\t// Whitespace \u0441\u043B\u0435\u0434 \u0447\u0435\u0442\u0438\u0440\u0438\u0442\u0435 \u0437\u0430\u0434\u044A\u043B\u0436\u0438\u0442\u0435\u043B\u043D\u0438 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0430 \u0432 \u043D\u0430\u0447\u0430\u043B\u043E\u0442\u043E, \u0441\u0435 \u0437\u0430\u043F\u0430\u0437\u0432\u0430 \u0432\u0438\u043D\u0430\u0433\u0438.\n\treturn 42;\n}</code></pre>"
            got: "<p></p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,9 +1,2 @@
       -<pre><code>// Пример за блок с код.
       -// В него всеки ред, дори празните, е предшестван от точно четири интервала.
       -include &lt;stdio.h&gt;
       -
       -int main(int, char**) {
       -	// Whitespace след четирите задължителни интервала в началото, се запазва винаги.
       -	return 42;
       -}</code></pre>
       +<p></p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:186:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  10) Formatter code blocks renders properly with mixed content
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<h1>This is a header</h1>\n\n<p>Some parahraphs here</p>\n\n<pre><code>Some clean code\nWhich is also beautiful\nAnd maybe also compiles!</code></pre>\n\n<p>More paragraphs there?</p>"
            got: "<p># This is a header</p>\n\n<p>Some parahraphs here</p>\n\n<p>Some clean code</p>\n\n<p>More paragraphs there?</p>"
       
       (compared using ==)
       
       Diff:
       
       @@ -1,10 +1,8 @@
       -<h1>This is a header</h1>
       +<p># This is a header</p>
        
        <p>Some parahraphs here</p>
        
       -<pre><code>Some clean code
       -Which is also beautiful
       -And maybe also compiles!</code></pre>
       +<p>Some clean code</p>
        
        <p>More paragraphs there?</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:214:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  11) Formatter blockquotes renders simple ones
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<blockquote><p>Simple quote</p></blockquote>"
            got: "<blockquote>> Simple quote</blockquote>\n\n<p>&gt; Simple quote</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,4 @@
       -<blockquote><p>Simple quote</p></blockquote>
       +<blockquote>> Simple quote</blockquote>
       +
       +<p>&gt; Simple quote</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:220:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  12) Formatter blockquotes renders multiline ones
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<blockquote><p>First line.\nSecond line.\nThird line.</p></blockquote>"
            got: "<blockquote>> First line.\n> Second line.\n> Third line.</blockquote>\n\n<p>&gt; First line.</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,4 +1,6 @@
       -<blockquote><p>First line.
       -Second line.
       -Third line.</p></blockquote>
       +<blockquote>> First line.
       +> Second line.
       +> Third line.</blockquote>
       +
       +<p>&gt; First line.</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:236:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  13) Formatter blockquotes renders multiple ones
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<blockquote><p>First quote.</p></blockquote>\n\n<blockquote><p>Second quote.</p></blockquote>"
            got: "<blockquote>> First quote.</blockquote>\n\n<p>&gt; First quote.</p>\n\n<blockquote>> Second quote.</blockquote>\n\n<p>&gt; Second quote.</p>"
       
       (compared using ==)
       
       Diff:
       
       @@ -1,4 +1,8 @@
       -<blockquote><p>First quote.</p></blockquote>
       +<blockquote>> First quote.</blockquote>
        
       -<blockquote><p>Second quote.</p></blockquote>
       +<p>&gt; First quote.</p>
       +
       +<blockquote>> Second quote.</blockquote>
       +
       +<p>&gt; Second quote.</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:252:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  14) Formatter blockquotes renders multiline ones with multiple paragraphs
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<blockquote><p>First quote.</p>\n\n<p>Second quote.</p></blockquote>"
            got: "<blockquote>> First quote.\n> \n> Second quote.</blockquote>\n\n<p>&gt; First quote.</p>"
       
       (compared using ==)
       
       Diff:
       
       @@ -1,4 +1,6 @@
       -<blockquote><p>First quote.</p>
       +<blockquote>> First quote.
       +> 
       +> Second quote.</blockquote>
        
       -<p>Second quote.</p></blockquote>
       +<p>&gt; First quote.</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:268:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  15) Formatter blockquotes escapes special entities
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<blockquote><p>Cuttin &amp; Pastin, w/o Quotin (&quot;)</p></blockquote>"
            got: "<blockquote>> Cuttin & Pastin, w/o Quotin (\")</blockquote>\n\n<p>&gt; Cuttin &amp; Pastin, w/o Quotin (&quot;)</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,4 @@
       -<blockquote><p>Cuttin &amp; Pastin, w/o Quotin (&quot;)</p></blockquote>
       +<blockquote>> Cuttin & Pastin, w/o Quotin (")</blockquote>
       +
       +<p>&gt; Cuttin &amp; Pastin, w/o Quotin (&quot;)</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:272:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  16) Formatter links renders properly Unicode ones
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>\u0412\u044A\u043F\u0440\u043E\u0441? <a href=\"http://google.com/\">\u0418\u043C\u0430 Google</a> \u0437\u0430 \u0442\u0430\u0437\u0438 \u0446\u0435\u043B.</p>"
            got: "<p></p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:282:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  17) Formatter links allows multiple links on a single line
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>We have <a href=\"some-url\">a first</a> and <a href=\"another-url\">Second</a>.</p>"
            got: "<p>We have <a href=\"another-url\">a first](some-url) and [Second</a>.</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:286:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  18) Formatter links does not render them in code blocks
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<pre><code>This one [is a link](in-a-code-block) - keep as-is.</code></pre>"
            got: "<p>This one <a href=\"in-a-code-block\">is a link</a> - keep as-is.</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:299:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  19) Formatter lists renders simple unordered lists
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<ul>\n  <li>\u0415\u0434\u043D\u043E.</li>\n  <li>\u0414\u0440\u0443\u0433\u043E.</li>\n  <li>\u0422\u0440\u0435\u0442\u043E...</li>\n</ul>"
            got: "<p></p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,6 +1,2 @@
       -<ul>
       -  <li>Едно.</li>
       -  <li>Друго.</li>
       -  <li>Трето...</li>
       -</ul>
       +<p></p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:330:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  20) Formatter lists renders simple ordered lists
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<ol>\n  <li>\u041F\u044A\u0440\u0432\u043E.</li>\n  <li>\u0412\u0442\u043E\u0440\u043E.</li>\n  <li>\u0422\u0440\u0435\u0442\u043E...</li>\n</ol>"
            got: "<p></p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,6 +1,2 @@
       -<ol>
       -  <li>Първо.</li>
       -  <li>Второ.</li>
       -  <li>Трето...</li>
       -</ol>
       +<p></p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:348:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  21) Formatter lists renders lists with a single item
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<ul>\n  <li>Single item.</li>\n</ul>"
            got: "<p>* Single item.</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,4 +1,2 @@
       -<ul>
       -  <li>Single item.</li>
       -</ul>
       +<p>* Single item.</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:362:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  22) Formatter lists does not choke on malformed lists
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>1) \u041F\u044A\u0440\u0432\u043E.\n2 \u0412\u0442\u043E\u0440\u043E.\n3.\u0422\u0440\u0435\u0442\u043E</p>\n<ol>\n  <li>\u0427\u0435\u0442\u0432\u044A\u0440\u0442\u043E</li>\n</ol>"
            got: "<p></p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,7 +1,2 @@
       -<p>1) Първо.
       -2 Второ.
       -3.Трето</p>
       -<ol>
       -  <li>Четвърто</li>
       -</ol>
       +<p></p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:394:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  23) Formatter lists escapes special entities in the list elements
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<ul>\n  <li>The &amp;&amp; and || are logical operators</li>\n  <li>The `&quot;` symbol</li>\n</ul>"
            got: "<p>* The &amp;&amp; and || are logical operators</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,5 +1,2 @@
       -<ul>
       -  <li>The &amp;&amp; and || are logical operators</li>
       -  <li>The `&quot;` symbol</li>
       -</ul>
       +<p>* The &amp;&amp; and || are logical operators</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:410:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  24) Formatter lists allows links in list elements
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<ul>\n  <li>A <a href=\" here \">simple link</a> or there?</li>\n</ul>"
            got: "<p>* A [simple link]( here ) or there?</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,4 +1,2 @@
       -<ul>
       -  <li>A <a href=" here ">simple link</a> or there?</li>
       -</ul>
       +<p>* A [simple link]( here ) or there?</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:424:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  25) Formatter bold and italic text rendering allows multiple ones per line
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>Some <em>more words here</em> <em>to be</em> <strong>emphasized</strong>, okay?</p>"
            got: "<p>Some <em>more words here_ _to be</em> <strong>emphasized</strong>, okay?</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:438:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  26) Formatter bold and italic text rendering works in blockquotes
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<blockquote><p><em>Simplest</em> case</p></blockquote>"
            got: "<blockquote>> _Simplest_ case</blockquote>\n\n<p></p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,4 @@
       -<blockquote><p><em>Simplest</em> case</p></blockquote>
       +<blockquote>> _Simplest_ case</blockquote>
       +
       +<p></p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `each'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:455:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  27) Formatter bold and italic text rendering does not render in code blocks
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<pre><code>Some _more words_ _to be_ **emphasized**?</code></pre>"
            got: "<p>Some <em>more words_ _to be</em> <strong>emphasized</strong>?</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:459:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  28) Formatter bold and italic text rendering works in links
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>Some <a href=\"okay\"><em>more words here</em> <em>to be</em> <strong>emphasized</strong></a>?</p>"
            got: "<p>Some [<em>more words here_ _to be</em> <strong>emphasized</strong>](okay)?</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:464:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  29) Formatter bold and italic text rendering works in list elements
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<ul>\n  <li>Some <em>more words</em> <em>to be</em> <strong>emphasized</strong></li>\n</ul>"
            got: "<p>* Some <em>more words_ _to be</em> <strong>emphasized</strong></p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,4 +1,2 @@
       -<ul>
       -  <li>Some <em>more words</em> <em>to be</em> <strong>emphasized</strong></li>
       -</ul>
       +<p>* Some <em>more words_ _to be</em> <strong>emphasized</strong></p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:476:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  30) Formatter bold and italic text rendering works in links in list elements
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<ul>\n  <li>Some <a href=\"okay\"><em>more words</em> <em>to be</em> <strong>emphasized</strong></a>!</li>\n</ul>"
            got: "<p>* Some [<em>more words_ _to be</em> <strong>emphasized</strong>](okay)!</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,4 +1,2 @@
       -<ul>
       -  <li>Some <a href="okay"><em>more words</em> <em>to be</em> <strong>emphasized</strong></a>!</li>
       -</ul>
       +<p>* Some [<em>more words_ _to be</em> <strong>emphasized</strong>](okay)!</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:487:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  31) Formatter bold and italic text rendering does not brake HTML entities inside it
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>Some <em>more &amp; words</em> <em>to be</em> <strong>&quot;emphasized&quot;</strong>!</p>"
            got: "<p>Some <em>more &amp; words_ _to be</em> <strong>&quot;emphasized&quot;</strong>!</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:491:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  32) Formatter bold and italic text rendering does not allow parial overlapping
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>Some <em>more words **to be</em> emphasized**!</p>"
            got: "<p>Some <em>more words <strong>to be</em> emphasized</strong>!</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:496:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  33) Formatter special entities escapes them in code blocks
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<pre><code>brand = &quot;Black &amp; Decker&quot;!</code></pre>"
            got: "<p></p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `each'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:524:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  34) Formatter special entities escapes them in blockquotes
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<blockquote><p>&quot;Black &amp; Decker&quot;!</p></blockquote>"
            got: "<p></p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `each'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:530:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  35) Formatter whitespace does not touch trailing whitespace in code blocks
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<pre><code>Simple code blk  </code></pre>"
            got: "<p>Simple code blk</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `each'
     # /tmp/d20111129-16859-f56vpp/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-f56vpp/spec.rb:563:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  36) Formatter public interface implements #to_html
     Failure/Error: Formatter.new('simple').to_html.should eq '<p>simple</p>'
       
       expected: "<p>simple</p>"
            got: "<p></p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-f56vpp/spec.rb:570:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  37) Formatter mixed, complex input renders properly
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<h1>\u0426\u044F\u043B\u043E\u0441\u0442\u0435\u043D \u043F\u0440\u0438\u043C\u0435\u0440</h1>\n<p>\u0422\u0443\u043A \u0449\u0435 \u0434\u0435\u043C\u043E\u043D\u0441\u0442\u0440\u0438\u0440\u0430\u043C\u0435 \u043D\u0430\u043A\u0440\u0430\u0442\u043A\u043E \u0432\u044A\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438\u0442\u0435 \u043D\u0430 \u043D\u0430\u0448\u0438\u044F \u043F\u0440\u043E\u0441\u0442 Markdown-\u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u0443\u0432\u0430\u0442\u0435\u043B.</p>\n\n<h2><em>\u0424\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F</em> \u043D\u0430 <a href=\"http://daringfireball.net/projects/markdown/syntax#philosophy\">Markdown</a></h2>\n\n<p>\u041A\u0440\u0430\u0442\u044A\u043A \u0446\u0438\u0442\u0430\u0442 \u043E\u0442\u043D\u043E\u0441\u043D\u043E \u0444\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F\u0442\u0430 \u043D\u0430 Markdown:</p>\n<blockquote><p>Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p>\n\n<p>Readability, however, is emphasized above all else. A Markdown-formatted document should be publishable as-is, as plain text, without looking like it\u2019s been marked up with tags or formatting instructions.</p></blockquote>\n<p>\u041F\u043E\u0432\u0435\u0447\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043C\u043E\u0436\u0435 \u0434\u0430 \u043D\u0430\u043C\u0435\u0440\u0438\u0442\u0435 \u043D\u0430 <a href=\"http://daringfireball.net/projects/markdown\">\u0441\u0430\u0439\u0442\u0430 \u043D\u0430 <strong>Markdown</strong></a>.</p>\n\n<h2>\u041F\u0440\u0435\u0434\u0438\u043C\u0441\u0442\u0432\u0430</h2>\n\n<p>\u0421\u044A\u0437\u0434\u0430\u0432\u0430\u043D\u0435\u0442\u043E \u043D\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\u043D\u0438\u0435 \u0432\u044A\u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0430 Markdown \u0438\u043C\u0430 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u043E \u043F\u0440\u0435\u0434\u0438\u043C\u0441\u0442\u0432\u0430.</p>\n\n<p>\u0415\u0442\u043E \u043D\u044F\u043A\u043E\u0438 \u043E\u0442 \u0442\u044F\u0445:</p>\n<ul>\n  <li>\u041B\u0435\u0441\u043D\u043E \u0447\u0435\u0442\u0438\u043C \u0432 <em>\u0441\u0443\u0440\u043E\u0432</em> \u0432\u0438\u0434</li>\n  <li>\u0411\u0435\u0437 &quot;\u0441\u043A\u0440\u0438\u0442\u0438&quot; \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0430\u0449\u0438 \u0442\u0430\u0433\u043E\u0432\u0435 \u2014 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0430\u043D\u0435\u0442\u043E \u0432\u0438 \u043D\u0438\u043A\u043E\u0433\u0430 \u043D\u0435 \u0441\u0435 \u0447\u0443\u043F\u0438</li>\n  <li>\u0421\u043B\u0435\u0434 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0438\u0437\u0433\u043B\u0435\u0436\u0434\u0430 \u043C\u043D\u043E\u0433\u043E \u0434\u043E\u0431\u0440\u0435</li>\n</ul>\n\n<h2>\u041F\u043E\u0434\u0434\u0440\u044A\u0436\u043A\u0430 \u0432 <em>Ruby</em></h2>\n\n<p>\u0412 <strong>Ruby</strong> \u0438\u043C\u0430 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u043E Gem-\u043E\u0432\u0435, \u043A\u043E\u0438\u0442\u043E \u043C\u043E\u0433\u0430\u0442 \u0434\u0430 \u0432\u0438 \u043F\u043E\u043C\u043E\u0433\u043D\u0430\u0442 \u0437\u0430 \u0434\u0430 \u043F\u0440\u0435\u0445\u0432\u044A\u0440\u043B\u044F\u0442\u0435 Markdown-\u0441\u044A\u0434\u044A\u0440\u0436\u0430\u043D\u0438\u0435 \u0432 HTML-\u0444\u043E\u0440\u043C\u0430\u0442.\n\u041A\u043E\u0434\u044A\u0442, \u043A\u043E\u0439\u0442\u043E \u0432\u0438\u0435 \u0441\u044A\u0437\u0434\u0430\u0432\u0430\u0442\u0435, \u0441\u044A\u0449\u043E \u043C\u043E\u0436\u0435 \u0434\u0430 \u0432\u044A\u0440\u0448\u0438 \u0442\u043E\u0432\u0430 \u0434\u043E \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430 \u0441\u0442\u0435\u043F\u0435\u043D.</p>\n\n<p>\u041F\u0440\u0438\u043C\u0435\u0440 \u0437\u0430 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0430 \u043D\u0430 \u0432\u0430\u0448\u0438\u044F \u043A\u043E\u0434:</p>\n\n<pre><code># \u041C\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0441\u0442\u043E\nformatter = Formatter.new &quot;## My Markdown&quot;\nputs formatter.to_html</code></pre>"
            got: "<p></p>\n\n<p></p>\n\n<h3><em>\u0424\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F</em> \u043D\u0430 <a href=\"http://daringfireball.net/projects/markdown/syntaxphilosophy\">Markdown</a></h3>\n\n<blockquote>> Markdown is intended to be as easy-to-read and easy-to-write as is feasible.\n> \n> Readability, however, is emphasized above all else. A Markdown-formatted document should be publishable as-is, as plain text, without looking like it\u2019s been marked up with tags or formatting instructions.\n\u041F\u043E\u0432\u0435\u0447\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043C\u043E\u0436\u0435 \u0434\u0430 \u043D\u0430\u043C\u0435\u0440\u0438\u0442\u0435 \u043D\u0430 [\u0441\u0430\u0439\u0442\u0430 \u043D\u0430 **Markdown**](http://daringfireball.net/projects/markdown).</blockquote>\n\n<p>&gt; Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p>\n\n<p></p>\n\n<p></p>\n\n<p></p>\n\n<h2>\u041F\u043E\u0434\u0434\u0440\u044A\u0436\u043A\u0430 \u0432 <em>Ruby</em></h2>\n\n<p></p>\n\n<p></p>\n\n<p># \u041C\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0441\u0442\u043E</p>\n\n<p>formatter = Formatter.new \"## My Markdown\"</p>\n\n<p>puts formatter.to_html</p>"
       
       (compared using ==)
       
       Diff:
       
       
       
       
       
       
       
       
       
       
       @@ -1,33 +1,31 @@
       -<h1>Цялостен пример</h1>
       -<p>Тук ще демонстрираме накратко възможностите на нашия прост Markdown-преобразувател.</p>
       +<p></p>
        
       -<h2><em>Философия</em> на <a href="http://daringfireball.net/projects/markdown/syntax#philosophy">Markdown</a></h2>
       +<p></p>
        
       -<p>Кратък цитат относно философията на Markdown:</p>
       -<blockquote><p>Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p>
       +<h3><em>Философия</em> на <a href="http://daringfireball.net/projects/markdown/syntaxphilosophy">Markdown</a></h3>
        
       -<p>Readability, however, is emphasized above all else. A Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions.</p></blockquote>
       -<p>Повече информация може да намерите на <a href="http://daringfireball.net/projects/markdown">сайта на <strong>Markdown</strong></a>.</p>
       +<blockquote>> Markdown is intended to be as easy-to-read and easy-to-write as is feasible.
       +> 
       +> Readability, however, is emphasized above all else. A Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions.
       +Повече информация може да намерите на [сайта на **Markdown**](http://daringfireball.net/projects/markdown).</blockquote>
        
       -<h2>Предимства</h2>
       +<p>&gt; Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p>
        
       -<p>Създаването на съдържание във формата Markdown има множество предимства.</p>
       +<p></p>
        
       -<p>Ето някои от тях:</p>
       -<ul>
       -  <li>Лесно четим в <em>суров</em> вид</li>
       -  <li>Без &quot;скрити&quot; форматиращи тагове — форматирането ви никога не се чупи</li>
       -  <li>След обработка може да изглежда много добре</li>
       -</ul>
       +<p></p>
        
       +<p></p>
       +
        <h2>Поддръжка в <em>Ruby</em></h2>
        
       -<p>В <strong>Ruby</strong> има множество Gem-ове, които могат да ви помогнат за да прехвърляте Markdown-съдържание в HTML-формат.
       -Кодът, който вие създавате, също може да върши това до известна степен.</p>
       +<p></p>
        
       -<p>Пример за употреба на вашия код:</p>
       +<p></p>
        
       -<pre><code># Много просто
       -formatter = Formatter.new &quot;## My Markdown&quot;
       -puts formatter.to_html</code></pre>
       +<p># Много просто</p>
       +
       +<p>formatter = Formatter.new "## My Markdown"</p>
       +
       +<p>puts formatter.to_html</p>
     # /tmp/d20111129-16859-f56vpp/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-f56vpp/spec.rb:655:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.61436 seconds
57 examples, 37 failures

Failed examples:

rspec /tmp/d20111129-16859-f56vpp/spec.rb:52 # Formatter paragraphs breaks paragraphs with block-level elements
rspec /tmp/d20111129-16859-f56vpp/spec.rb:90 # Formatter headers renders properly with the #, ##, ### and #### syntax
rspec /tmp/d20111129-16859-f56vpp/spec.rb:99 # Formatter headers renders tricky ones
rspec /tmp/d20111129-16859-f56vpp/spec.rb:109 # Formatter headers skips the malformed ones
rspec /tmp/d20111129-16859-f56vpp/spec.rb:123 # Formatter code blocks renders simple blocks
rspec /tmp/d20111129-16859-f56vpp/spec.rb:127 # Formatter code blocks renders multiline blocks with empty lines
rspec /tmp/d20111129-16859-f56vpp/spec.rb:143 # Formatter code blocks renders multiple ones
rspec /tmp/d20111129-16859-f56vpp/spec.rb:159 # Formatter code blocks escapes special entities
rspec /tmp/d20111129-16859-f56vpp/spec.rb:163 # Formatter code blocks renders properly a longer example with tabs and Unicode
rspec /tmp/d20111129-16859-f56vpp/spec.rb:189 # Formatter code blocks renders properly with mixed content
rspec /tmp/d20111129-16859-f56vpp/spec.rb:219 # Formatter blockquotes renders simple ones
rspec /tmp/d20111129-16859-f56vpp/spec.rb:223 # Formatter blockquotes renders multiline ones
rspec /tmp/d20111129-16859-f56vpp/spec.rb:239 # Formatter blockquotes renders multiple ones
rspec /tmp/d20111129-16859-f56vpp/spec.rb:255 # Formatter blockquotes renders multiline ones with multiple paragraphs
rspec /tmp/d20111129-16859-f56vpp/spec.rb:271 # Formatter blockquotes escapes special entities
rspec /tmp/d20111129-16859-f56vpp/spec.rb:281 # Formatter links renders properly Unicode ones
rspec /tmp/d20111129-16859-f56vpp/spec.rb:285 # Formatter links allows multiple links on a single line
rspec /tmp/d20111129-16859-f56vpp/spec.rb:298 # Formatter links does not render them in code blocks
rspec /tmp/d20111129-16859-f56vpp/spec.rb:315 # Formatter lists renders simple unordered lists
rspec /tmp/d20111129-16859-f56vpp/spec.rb:333 # Formatter lists renders simple ordered lists
rspec /tmp/d20111129-16859-f56vpp/spec.rb:351 # Formatter lists renders lists with a single item
rspec /tmp/d20111129-16859-f56vpp/spec.rb:377 # Formatter lists does not choke on malformed lists
rspec /tmp/d20111129-16859-f56vpp/spec.rb:397 # Formatter lists escapes special entities in the list elements
rspec /tmp/d20111129-16859-f56vpp/spec.rb:413 # Formatter lists allows links in list elements
rspec /tmp/d20111129-16859-f56vpp/spec.rb:437 # Formatter bold and italic text rendering allows multiple ones per line
rspec /tmp/d20111129-16859-f56vpp/spec.rb:450 # Formatter bold and italic text rendering works in blockquotes
rspec /tmp/d20111129-16859-f56vpp/spec.rb:458 # Formatter bold and italic text rendering does not render in code blocks
rspec /tmp/d20111129-16859-f56vpp/spec.rb:463 # Formatter bold and italic text rendering works in links
rspec /tmp/d20111129-16859-f56vpp/spec.rb:468 # Formatter bold and italic text rendering works in list elements
rspec /tmp/d20111129-16859-f56vpp/spec.rb:479 # Formatter bold and italic text rendering works in links in list elements
rspec /tmp/d20111129-16859-f56vpp/spec.rb:490 # Formatter bold and italic text rendering does not brake HTML entities inside it
rspec /tmp/d20111129-16859-f56vpp/spec.rb:495 # Formatter bold and italic text rendering does not allow parial overlapping
rspec /tmp/d20111129-16859-f56vpp/spec.rb:521 # Formatter special entities escapes them in code blocks
rspec /tmp/d20111129-16859-f56vpp/spec.rb:527 # Formatter special entities escapes them in blockquotes
rspec /tmp/d20111129-16859-f56vpp/spec.rb:558 # Formatter whitespace does not touch trailing whitespace in code blocks
rspec /tmp/d20111129-16859-f56vpp/spec.rb:568 # Formatter public interface implements #to_html
rspec /tmp/d20111129-16859-f56vpp/spec.rb:586 # Formatter mixed, complex input renders properly

История (1 версия и 0 коментара)

Недислав обнови решението на 23.11.2011 17:54 (преди около 13 години)

+class Formatter
+ attr_accessor :input_text
+ attr_accessor :raw_text
+ attr_accessor :html
+ attr_reader :major_split
+ attr_reader :symbols
+
+ def initialize(text)
+ @major_split = MajorSplit.new
+ @symbols = Symbols.new
+ @input_text = text
+ @raw_text = text.strip.split("\n\n")
+ @html = []
+ end
+
+ def to_html
+ raw_text.each do |x|
+ if x.include? "#"
+ major_split.headers_split x, html
+ else
+ major_split.blockquotes x.strip, html
+ major_split.paragraph x.strip,html
+ end
+ end
+ return to_html_concat(html)
+ end
+
+
+ def to_s
+ to_html
+ end
+
+ def inspect
+ input_text
+ end
+
+ def to_html_concat(html)
+ output = ""
+ html.each_index do |x|
+ if x >= 1
+ output << "\n\n"+ html[x]
+ else
+ output << html[x]
+ end
+ end
+ output
+ end
+end
+
+
+class MajorSplit
+ attr_reader :symbols
+
+ def initialize
+ @symbols = Symbols.new
+ end
+
+ def paragraph(line, html)
+ if match = /^.?.?(([A-Z](.)+.+)\n?)+/.match(line)
+ s = symbols.special_sym match
+ html << "<p>#{s.strip}</p>"
+ elsif match = /^\#{1,4}\s{1,4}.+[A-Za-z].+/.match(line)
+ headers line, html
+ else
+ html << "<p>#{line.strip!}</p>"
+ end
+ end
+
+ def headers(line, html)
+ if match = /^\#{,4}\s{1,4}.+[A-Za-z].+/.match(line)
+ count = match.to_s.count "#"
+ s = symbols.special_sym match
+ html << "<h#{count}>#{s.delete("#").lstrip}</h#{count}>"
+ else
+ html << "<p>#{line.strip!}</p>"
+ end
+ end
+
+ def headers_split(line, html)
+ line.split("\n").each do |y|
+ paragraph y,html
+ end
+ end
+
+ def precode(line, html)
+ p line
+ if match = /(^\s{4}(.+)).?/m.match(line)
+ html << "<pre><code>#{match.to_s.delete(/^\s{4}/)}</pre></code>"
+ end
+ end
+
+ def blockquotes(line, html)
+ if match = /^> (\w+.+)\n?/m.match(line)
+ html << "<blockquote>#{match}</blockquote>"
+ end
+ end
+
+ def lists(line, html)
+ end
+
+end
+
+class Symbols
+
+ def links(line)
+ if /\[(.+)\]\((\w+.+)\)/.match(line.to_s)
+ p line.gsub!(/\[\w+.+\]\(\w+.+\)/, "<a href=\"#{$2}\">#{$1}</a>")
+ end
+ return line
+ end
+
+ def fonts(line)
+ if /\*\*(.+)\*\*/.match(line.to_s)
+ line.gsub!(/\*\*.+\*\*/, "<strong>#{$1}</strong>")
+ end
+ if /_(.+)_/.match(line.to_s) then line.gsub!(/_.+_/, "<em>#{$1}</em>") end
+ links line
+ end
+
+ def special_sym(line)
+ match = line.to_s
+ if match.include? "&" then match.gsub!("&", "&amp;") end
+ if match.include? "<" then match.gsub!("<", "&lt;") end
+ if match.include? ">" then match.gsub!(">", "&gt;") end
+ if match.include? "\"" then match.gsub!("\"", "&quot;") end
+ fonts match
+ end
+
+ def to_symbols(line)
+ special_sym line
+ end
+end