Решение на Пета задача от Христо Банчев

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

Към профила на Христо Банчев

Резултати

  • 5 точки от тестове
  • 0 бонус точки
  • 5 точки общо
  • 38 успешни тест(а)
  • 19 неуспешни тест(а)

Код

class ParagraphFormatter
REGEXP = /(^.+$)/
def format text
text.gsub(REGEXP) { |match| '<p>' + match + '</p>' }
end
end
class HeaderFormatter
REGEXP = /^\<p\>(#|##|###|####) (.+)\<\/p\>$/
def format text
text.gsub(REGEXP) { |match| "<h#{$1.size.to_s}>" + $2.strip + "</h#{$1.size.to_s}>" }
end
end
class LesserThanFormatter
REGEXP = /\</
def format text
text.gsub(REGEXP) { |match| "&lt;" }
end
end
class GreaterThanFormatter
REGEXP = /\>/
def format text
text.gsub(REGEXP) { |match| "&gt;" }
end
end
class AmpersandFormatter
REGEXP = /\&/
def format text
text.gsub(REGEXP) { |match| "&amp;" }
end
end
class QuoteFormatter
REGEXP = /"/
def format text
text.gsub(REGEXP) { |match| "&quot;" }
end
end
class CodeFormatter
REG_BLOCK = /(?<row>^\<p\> .*\<\/p\>$)/
REG_ROW = /^\<p\> (.*)\<\/p\>$/
REG_CLEAR = /\<\/code\>\<\/pre\>\s\<pre\>\<code\>/
def format text
with_blocks = text.gsub(REG_BLOCK) do |block|
row_content = block.dup.gsub(REG_ROW) { |row| $1 }
"<pre><code>#{row_content}</code></pre>"
end
clear_tags with_blocks
end
def clear_tags text
text.gsub(REG_CLEAR) { |excess| "\n" }
end
end
class BlockquoteFormatter
REG_BLOCK = /(?<row>^\<p\>&gt; .*\<\/p\>$)/
REG_ROW = /^\<p\>&gt; (.*)\<\/p\>$/
REG_CLEAR = /\<\/p\>\<\/blockquote\>\s\<blockquote\>\<p\>/
def format text
with_blocks = text.gsub(REG_BLOCK) do |block|
row_content = block.dup.gsub(REG_ROW) { |row| $1 }
"<blockquote><p>#{row_content}</p></blockquote>"
end
clear_tags with_blocks
end
def clear_tags text
text.gsub(REG_CLEAR) { |excess| "\n" }
end
end
class AnchorFormatter
#TODO excluded some symbols from the text and the href
REGEXP = /\[(.*)\]\((.+)\)/
def format text
text.gsub(REGEXP) { |block| "<a href=\"#{$2}\">#{$1}</a>" }
end
end
class StrongFormatter
REGEXP = /\*\*([^*]+)\*\*/
def format text
text.gsub(REGEXP) { |match| "<strong>#{$1}</strong>" }
end
end
class EmFormatter
REGEXP = /_([^_]+)_/
def format text
text.gsub(REGEXP) { |match| "<em>#{$1}</em>" }
end
end
class Formatter
HTML_FORMATTERS = [
AmpersandFormatter.new,
LesserThanFormatter.new,
GreaterThanFormatter.new,
QuoteFormatter.new,
ParagraphFormatter.new,
HeaderFormatter.new,
CodeFormatter.new,
BlockquoteFormatter.new,
AnchorFormatter.new,
StrongFormatter.new,
EmFormatter.new,
]
def initialize(text)
@original_text = text.dup
@text = text.dup.rstrip
end
def to_html
HTML_FORMATTERS.each { |formatter| @text = formatter.format @text }
@text
end
def to_s
to_html
end
def inspect
@original_text
end
end
#a = " h2-asdf"
#f = Formatter.new(a)
#p f.to_s

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

..F....F...........F...F.F..FFFFFF....F.FF.F......FFF...F

Failures:

  1) Formatter paragraphs renders multiline paragraps
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>First line.\nSecond line.\nThird line.</p>\n\n<p>Last line, of course.</p>"
            got: "<p>First line.</p>\n<p>Second line.</p>\n<p>Third line.</p>\n\n<p>Last line, of course.</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,6 +1,6 @@
       -<p>First line.
       -Second line.
       -Third line.</p>
       +<p>First line.</p>
       +<p>Second line.</p>
       +<p>Third line.</p>
        
        <p>Last line, of course.</p>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:45: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 tricky ones
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<h2>Leading wsp</h2>"
            got: "<p>   ## Leading wsp</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:664:in `each'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  3) 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><p>First quote.\n\nSecond quote.</p></blockquote>"
       
       (compared using ==)
       
       Diff:
       
       @@ -1,4 +1,4 @@
       -<blockquote><p>First quote.</p>
       +<blockquote><p>First quote.
        
       -<p>Second quote.</p></blockquote>
       +Second quote.</p></blockquote>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  4) 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-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  5) 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: "<pre><code>This one <a href=\"in-a-code-block\">is a link</a> - keep as-is.</code></pre>"
       
       (compared using ==)
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  6) 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>* \u0415\u0434\u043D\u043E.</p>\n<p>* \u0414\u0440\u0443\u0433\u043E.</p>\n<p>* \u0422\u0440\u0435\u0442\u043E...</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,6 +1,4 @@
       -<ul>
       -  <li>Едно.</li>
       -  <li>Друго.</li>
       -  <li>Трето...</li>
       -</ul>
       +<p>* Едно.</p>
       +<p>* Друго.</p>
       +<p>* Трето...</p>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  7) 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>1. \u041F\u044A\u0440\u0432\u043E.</p>\n<p>2. \u0412\u0442\u043E\u0440\u043E.</p>\n<p>3. \u0422\u0440\u0435\u0442\u043E...</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,6 +1,4 @@
       -<ol>
       -  <li>Първо.</li>
       -  <li>Второ.</li>
       -  <li>Трето...</li>
       -</ol>
       +<p>1. Първо.</p>
       +<p>2. Второ.</p>
       +<p>3. Трето...</p>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  8) 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-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  9) 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>1) \u041F\u044A\u0440\u0432\u043E.</p>\n<p>2 \u0412\u0442\u043E\u0440\u043E.</p>\n<p>3.\u0422\u0440\u0435\u0442\u043E</p>\n<p>4. \u0427\u0435\u0442\u0432\u044A\u0440\u0442\u043E</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,7 +1,5 @@
       -<p>1) Първо.
       -2 Второ.
       -3.Трето</p>
       -<ol>
       -  <li>Четвърто</li>
       -</ol>
       +<p>1) Първо.</p>
       +<p>2 Второ.</p>
       +<p>3.Трето</p>
       +<p>4. Четвърто</p>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  10) 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>\n<p>* The `&quot;` symbol</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,5 +1,3 @@
       -<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>
       +<p>* The `&quot;` symbol</p>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  11) 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 <a href=\" here \">simple link</a> 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 <a href=" here ">simple link</a> or there?</p>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  12) 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: "<pre><code>Some <em>more words</em> <em>to be</em> <strong>emphasized</strong>?</code></pre>"
       
       (compared using ==)
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  13) 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</em> <em>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</em> <em>to be</em> <strong>emphasized</strong></p>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  14) 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 <a href=\"okay\"><em>more words</em> <em>to be</em> <strong>emphasized</strong></a>!</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 <a href="okay"><em>more words</em> <em>to be</em> <strong>emphasized</strong></a>!</p>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  15) 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-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  16) Formatter whitespace removes excess leading and trailing whitespace
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>Some txt</p>"
            got: "\n\n<p>Some txt</p>"
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,4 @@
       +
       +
        <p>Some txt</p>
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:664:in `each'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:547: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 whitespace ignores leading and trailing whitespace of lines whenever possible
     Failure/Error: Formatter.new(plain).to_html.should eq formatted.strip
       
       expected: "<p>A line here</p>"
            got: "<p>   A line here</p>"
       
       (compared using ==)
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:664:in `each'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:555: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 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: "<pre><code>Simple code blk</code></pre>"
       
       (compared using ==)
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:665:in `block in expect_transformations'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:664:in `each'
     # /tmp/d20111129-16859-1c1aq47/spec.rb:664:in `expect_transformations'
     # /tmp/d20111129-16859-1c1aq47/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)>'

  19) 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: "<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.\n\nReadability, 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<p>* \u041B\u0435\u0441\u043D\u043E \u0447\u0435\u0442\u0438\u043C \u0432 <em>\u0441\u0443\u0440\u043E\u0432</em> \u0432\u0438\u0434</p>\n<p>* \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</p>\n<p>* \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</p>\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.</p>\n<p>\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>"
       
       (compared using ==)
       
       Diff:
       
       @@ -4,9 +4,9 @@
        <h2><em>Философия</em> на <a href="http://daringfireball.net/projects/markdown/syntax#philosophy">Markdown</a></h2>
        
        <p>Кратък цитат относно философията на Markdown:</p>
       -<blockquote><p>Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p>
       +<blockquote><p>Markdown is intended to be as easy-to-read and easy-to-write as is feasible.
        
       -<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>
       +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>
        
        <h2>Предимства</h2>
       
       @@ -14,16 +14,14 @@
        <p>Създаването на съдържание във формата Markdown има множество предимства.</p>
        
        <p>Ето някои от тях:</p>
       -<ul>
       -  <li>Лесно четим в <em>суров</em> вид</li>
       -  <li>Без &quot;скрити&quot; форматиращи тагове — форматирането ви никога не се чупи</li>
       -  <li>След обработка може да изглежда много добре</li>
       -</ul>
       +<p>* Лесно четим в <em>суров</em> вид</p>
       +<p>* Без &quot;скрити&quot; форматиращи тагове — форматирането ви никога не се чупи</p>
       +<p>* След обработка може да изглежда много добре</p>
        
        <h2>Поддръжка в <em>Ruby</em></h2>
        
       -<p>В <strong>Ruby</strong> има множество Gem-ове, които могат да ви помогнат за да прехвърляте Markdown-съдържание в HTML-формат.
       -Кодът, който вие създавате, също може да върши това до известна степен.</p>
       +<p>В <strong>Ruby</strong> има множество Gem-ове, които могат да ви помогнат за да прехвърляте Markdown-съдържание в HTML-формат.</p>
       +<p>Кодът, който вие създавате, също може да върши това до известна степен.</p>
        
        <p>Пример за употреба на вашия код:</p>
        
     # /tmp/d20111129-16859-1c1aq47/spec.rb:660:in `expect_transformation'
     # /tmp/d20111129-16859-1c1aq47/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.6136 seconds
57 examples, 19 failures

Failed examples:

rspec /tmp/d20111129-16859-1c1aq47/spec.rb:28 # Formatter paragraphs renders multiline paragraps
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:99 # Formatter headers renders tricky ones
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:255 # Formatter blockquotes renders multiline ones with multiple paragraphs
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:285 # Formatter links allows multiple links on a single line
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:298 # Formatter links does not render them in code blocks
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:315 # Formatter lists renders simple unordered lists
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:333 # Formatter lists renders simple ordered lists
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:351 # Formatter lists renders lists with a single item
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:377 # Formatter lists does not choke on malformed lists
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:397 # Formatter lists escapes special entities in the list elements
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:413 # Formatter lists allows links in list elements
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:458 # Formatter bold and italic text rendering does not render in code blocks
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:468 # Formatter bold and italic text rendering works in list elements
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:479 # Formatter bold and italic text rendering works in links in list elements
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:495 # Formatter bold and italic text rendering does not allow parial overlapping
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:541 # Formatter whitespace removes excess leading and trailing whitespace
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:550 # Formatter whitespace ignores leading and trailing whitespace of lines whenever possible
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:558 # Formatter whitespace does not touch trailing whitespace in code blocks
rspec /tmp/d20111129-16859-1c1aq47/spec.rb:586 # Formatter mixed, complex input renders properly

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

Христо обнови решението на 23.11.2011 23:50 (преди около 13 години)

+class ParagraphFormatter
+ REGEXP = /(^.+$)/
+
+ def format text
+ text.gsub(REGEXP) { |match| '<p>' + match + '</p>' }
+ end
+end
+
+class HeaderFormatter
+ REGEXP = /^\<p\>(#|##|###|####) (.+)\<\/p\>$/
+
+ def format text
+ text.gsub(REGEXP) { |match| "<h#{$1.size.to_s}>" + $2.strip + "</h#{$1.size.to_s}>" }
+ end
+end
+
+class LesserThanFormatter
+ REGEXP = /\</
+
+ def format text
+ text.gsub(REGEXP) { |match| "&lt;" }
+ end
+end
+
+class GreaterThanFormatter
+ REGEXP = /\>/
+
+ def format text
+ text.gsub(REGEXP) { |match| "&gt;" }
+ end
+end
+
+class AmpersandFormatter
+ REGEXP = /\&/
+
+ def format text
+ text.gsub(REGEXP) { |match| "&amp;" }
+ end
+end
+
+class QuoteFormatter
+ REGEXP = /"/
+
+ def format text
+ text.gsub(REGEXP) { |match| "&quot;" }
+ end
+end
+
+class CodeFormatter
+ REG_BLOCK = /(?<row>^\<p\> .*\<\/p\>$)/
+ REG_ROW = /^\<p\> (.*)\<\/p\>$/
+ REG_CLEAR = /\<\/code\>\<\/pre\>\s\<pre\>\<code\>/
+
+ def format text
+ with_blocks = text.gsub(REG_BLOCK) do |block|
+ row_content = block.dup.gsub(REG_ROW) { |row| $1 }
+ "<pre><code>#{row_content}</code></pre>"
+ end
+
+ clear_tags with_blocks
+ end
+
+ def clear_tags text
+ text.gsub(REG_CLEAR) { |excess| "\n" }
+ end
+end
+
+class BlockquoteFormatter
+ REG_BLOCK = /(?<row>^\<p\>&gt; .*\<\/p\>$)/
+ REG_ROW = /^\<p\>&gt; (.*)\<\/p\>$/
+ REG_CLEAR = /\<\/p\>\<\/blockquote\>\s\<blockquote\>\<p\>/
+
+ def format text
+ with_blocks = text.gsub(REG_BLOCK) do |block|
+ row_content = block.dup.gsub(REG_ROW) { |row| $1 }
+ "<blockquote><p>#{row_content}</p></blockquote>"
+ end
+
+ clear_tags with_blocks
+ end
+
+ def clear_tags text
+ text.gsub(REG_CLEAR) { |excess| "\n" }
+ end
+end
+
+class AnchorFormatter
+ #TODO excluded some symbols from the text and the href
+ REGEXP = /\[(.*)\]\((.+)\)/
+
+ def format text
+ text.gsub(REGEXP) { |block| "<a href=\"#{$2}\">#{$1}</a>" }
+ end
+end
+
+class StrongFormatter
+ REGEXP = /\*\*([^*]+)\*\*/
+
+ def format text
+ text.gsub(REGEXP) { |match| "<strong>#{$1}</strong>" }
+ end
+end
+
+class EmFormatter
+ REGEXP = /_([^_]+)_/
+
+ def format text
+ text.gsub(REGEXP) { |match| "<em>#{$1}</em>" }
+ end
+end
+
+class Formatter
+ HTML_FORMATTERS = [
+ AmpersandFormatter.new,
+ LesserThanFormatter.new,
+ GreaterThanFormatter.new,
+ QuoteFormatter.new,
+ ParagraphFormatter.new,
+ HeaderFormatter.new,
+ CodeFormatter.new,
+ BlockquoteFormatter.new,
+ AnchorFormatter.new,
+ StrongFormatter.new,
+ EmFormatter.new,
+ ]
+
+ def initialize(text)
+ @original_text = text.dup
+ @text = text.dup.rstrip
+ end
+
+ def to_html
+ HTML_FORMATTERS.each { |formatter| @text = formatter.format @text }
+
+ @text
+ end
+
+ def to_s
+ to_html
+ end
+
+ def inspect
+ @original_text
+ end
+end
+
+#a = " h2-asdf"
+#f = Formatter.new(a)
+#p f.to_s