# encoding: UTF-8 unless defined? ASCIIDOCTOR_PROJECT_DIR $: << File.dirname(__FILE__); $:.uniq! require 'test_helper' end context 'Paragraphs' do context 'Normal' do test 'should treat plain text separated by blank lines as paragraphs' do input = <<-EOS Plain text for the win! Yep. Text. Plain and simple. EOS output = render_embedded_string input assert_css 'p', output, 2 assert_xpath '(//p)[1][text() = "Plain text for the win!"]', output, 1 assert_xpath '(//p)[2][text() = "Yep. Text. Plain and simple."]', output, 1 end test 'should associate block title with paragraph' do input = <<-EOS .Titled Paragraph. Winning. EOS output = render_embedded_string input assert_css 'p', output, 2 assert_xpath '(//p)[1]/preceding-sibling::*[@class = "title"]', output, 1 assert_xpath '(//p)[1]/preceding-sibling::*[@class = "title"][text() = "Titled"]', output, 1 assert_xpath '(//p)[2]/preceding-sibling::*[@class = "title"]', output, 0 end test 'no duplicate block before next section' do input = <<-EOS = Title Preamble == First Section Paragraph 1 Paragraph 2 == Second Section Last words EOS output = render_string input assert_xpath '//p[text() = "Paragraph 2"]', output, 1 end test 'does not treat wrapped line as a list item' do input = <<-EOS paragraph . wrapped line EOS output = render_embedded_string input assert_css 'p', output, 1 assert_xpath %(//p[text()="paragraph\n. wrapped line"]), output, 1 end test 'does not treat wrapped line as a block title' do input = <<-EOS paragraph .wrapped line EOS output = render_embedded_string input assert_css 'p', output, 1 assert_xpath %(//p[text()="paragraph\n.wrapped line"]), output, 1 end test 'interprets normal paragraph style as normal paragraph' do input = <<-EOS [normal] Normal paragraph. Nothing special. EOS output = render_embedded_string input assert_css 'p', output, 1 end test 'removes indentation from literal paragraph marked as normal' do input = <<-EOS [normal] Normal paragraph. Nothing special. Last line. EOS output = render_embedded_string input assert_css 'p', output, 1 assert_xpath %(//p[text()="Normal paragraph.\n Nothing special.\nLast line."]), output, 1 end test 'normal paragraph terminates at block attribute list' do input = <<-EOS normal text [literal] literal text EOS output = render_embedded_string input assert_css '.paragraph:root', output, 1 assert_css '.literalblock:root', output, 1 end test 'normal paragraph terminates at block delimiter' do input = <<-EOS normal text -- text in open block -- EOS output = render_embedded_string input assert_css '.paragraph:root', output, 1 assert_css '.openblock:root', output, 1 end test 'normal paragraph terminates at list continuation' do input = <<-EOS normal text + EOS output = render_embedded_string input assert_css '.paragraph:root', output, 2 assert_xpath %((/*[@class="paragraph"])[1]/p[text() = "normal text"]), output, 1 assert_xpath %((/*[@class="paragraph"])[2]/p[text() = "+"]), output, 1 end test 'normal style turns literal paragraph into normal paragraph' do input = <<-EOS [normal] normal paragraph, despite the leading indent EOS output = render_embedded_string input assert_css '.paragraph:root > p', output, 1 end test 'expands index term macros in DocBook backend' do input = <<-EOS Here is an index entry for ((tigers)). indexterm:[Big cats,Tigers,Siberian Tiger] Here is an index entry for indexterm2:[Linux]. (((Operating Systems,Linux,Fedora))) Note that multi-entry terms generate separate index entries. EOS output = render_embedded_string input, :attributes => {'backend' => 'docbook45'} assert_xpath '/simpara', output, 1 term1 = (xmlnodes_at_xpath '(//indexterm)[1]', output, 1).first assert_equal 'tigers', term1.to_s assert term1.next.content.start_with?('tigers') term2 = (xmlnodes_at_xpath '(//indexterm)[2]', output, 1).first term2_elements = term2.elements assert_equal 3, term2_elements.size assert_equal 'Big cats', term2_elements[0].to_s assert_equal 'Tigers', term2_elements[1].to_s assert_equal 'Siberian Tiger', term2_elements[2].to_s term3 = (xmlnodes_at_xpath '(//indexterm)[3]', output, 1).first term3_elements = term3.elements assert_equal 2, term3_elements.size assert_equal 'Tigers', term3_elements[0].to_s assert_equal 'Siberian Tiger', term3_elements[1].to_s term4 = (xmlnodes_at_xpath '(//indexterm)[4]', output, 1).first term4_elements = term4.elements assert_equal 1, term4_elements.size assert_equal 'Siberian Tiger', term4_elements[0].to_s term5 = (xmlnodes_at_xpath '(//indexterm)[5]', output, 1).first assert_equal 'Linux', term5.to_s assert term5.next.content.start_with?('Linux') assert_xpath '(//indexterm)[6]/*', output, 3 assert_xpath '(//indexterm)[7]/*', output, 2 assert_xpath '(//indexterm)[8]/*', output, 1 end test 'normal paragraph should honor explicit subs list' do input = <<-EOS [subs="specialcharacters"] ** EOS output = render_embedded_string input assert output.include?('*<Hey Jude>*') end test 'normal paragraph should honor specialchars shorthand' do input = <<-EOS [subs="specialchars"] ** EOS output = render_embedded_string input assert output.include?('*<Hey Jude>*') end test 'should add a hardbreak at end of each line when hardbreaks option is set' do input = <<-EOS [%hardbreaks] read my lips EOS output = render_embedded_string input assert_css 'br', output, 2 assert_xpath '//p', output, 1 assert output.include?("

read
\nmy
\nlips

") end end context 'Literal' do test 'single-line literal paragraphs' do input = <<-EOS LITERALS ARE LITERALLY AWESOME! EOS output = render_embedded_string input assert_xpath '//pre', output, 3 end test 'multi-line literal paragraph' do input = <<-EOS Install instructions: yum install ruby rubygems gem install asciidoctor You're good to go! EOS output = render_embedded_string input assert_xpath '//pre', output, 1 # indentation should be trimmed from literal block assert_xpath %(//pre[text() = "yum install ruby rubygems\ngem install asciidoctor"]), output, 1 end test 'literal paragraph' do input = <<-EOS [literal] this text is literally literal EOS output = render_embedded_string input assert_xpath %(/*[@class="literalblock"]//pre[text()="this text is literally literal"]), output, 1 end test 'should read content below literal style verbatim' do input = <<-EOS [literal] image::not-an-image-block[] EOS output = render_embedded_string input assert_xpath %(/*[@class="literalblock"]//pre[text()="image::not-an-image-block[]"]), output, 1 assert_css 'img', output, 0 end test 'listing paragraph' do input = <<-EOS [listing] this text is a listing EOS output = render_embedded_string input assert_xpath %(/*[@class="listingblock"]//pre[text()="this text is a listing"]), output, 1 end test 'source paragraph' do input = <<-EOS [source] use the source, luke! EOS output = render_embedded_string input assert_xpath %(/*[@class="listingblock"]//pre[@class="highlight"]/code[text()="use the source, luke!"]), output, 1 end test 'source code paragraph with language' do input = <<-EOS [source, perl] die 'zomg perl sucks'; EOS output = render_embedded_string input assert_xpath %(/*[@class="listingblock"]//pre[@class="highlight"]/code[@class="language-perl"][@data-lang="perl"][text()="die 'zomg perl sucks';"]), output, 1 end test 'literal paragraph terminates at block attribute list' do input = <<-EOS literal text [normal] normal text EOS output = render_embedded_string input assert_xpath %(/*[@class="literalblock"]), output, 1 assert_xpath %(/*[@class="paragraph"]), output, 1 end test 'literal paragraph terminates at block delimiter' do input = <<-EOS literal text -- normal text -- EOS output = render_embedded_string input assert_xpath %(/*[@class="literalblock"]), output, 1 assert_xpath %(/*[@class="openblock"]), output, 1 end test 'literal paragraph terminates at list continuation' do input = <<-EOS literal text + EOS output = render_embedded_string input assert_xpath %(/*[@class="literalblock"]), output, 1 assert_xpath %(/*[@class="literalblock"]//pre[text() = "literal text"]), output, 1 assert_xpath %(/*[@class="paragraph"]), output, 1 assert_xpath %(/*[@class="paragraph"]/p[text() = "+"]), output, 1 end end context 'Quote' do test "single-line quote paragraph" do input = <<-EOS [quote] Famous quote. EOS output = render_string input assert_xpath '//*[@class = "quoteblock"]', output, 1 assert_xpath '//*[@class = "quoteblock"]//p', output, 0 assert_xpath '//*[@class = "quoteblock"]//*[contains(text(), "Famous quote.")]', output, 1 end test 'quote paragraph terminates at list continuation' do input = <<-EOS [quote] A famouse quote. + EOS output = render_embedded_string input assert_css '.quoteblock:root', output, 1 assert_css '.paragraph:root', output, 1 assert_xpath %(/*[@class="paragraph"]/p[text() = "+"]), output, 1 end test "verse paragraph" do output = render_string("[verse]\nFamous verse.") assert_xpath '//*[@class = "verseblock"]', output, 1 assert_xpath '//*[@class = "verseblock"]/pre', output, 1 assert_xpath '//*[@class = "verseblock"]//p', output, 0 assert_xpath '//*[@class = "verseblock"]/pre[normalize-space(text()) = "Famous verse."]', output, 1 end test 'should perform normal subs on a verse paragraph' do input = <<-EOS [verse] _GET /groups/link:#group-id[\{group-id\}]_ EOS output = render_embedded_string input assert output.include?('
GET /groups/{group-id}
') end test 'quote paragraph should honor explicit subs list' do input = <<-EOS [subs="specialcharacters"] [quote] *Hey Jude* EOS output = render_embedded_string input assert output.include?('*Hey Jude*') end end context "special" do test "note multiline syntax" do Asciidoctor::ADMONITION_STYLES.each do |style| assert_xpath "//div[@class='admonitionblock #{style.downcase}']", render_string("[#{style}]\nThis is a winner.") end end test "note block syntax" do Asciidoctor::ADMONITION_STYLES.each do |style| assert_xpath "//div[@class='admonitionblock #{style.downcase}']", render_string("[#{style}]\n====\nThis is a winner.\n====") end end test "note inline syntax" do Asciidoctor::ADMONITION_STYLES.each do |style| assert_xpath "//div[@class='admonitionblock #{style.downcase}']", render_string("#{style}: This is important, fool!") end end test "sidebar block" do input = <<-EOS == Section .Sidebar **** Content goes here **** EOS result = render_string(input) assert_xpath "//*[@class='sidebarblock']//p", result, 1 end context 'Styled Paragraphs' do test 'should wrap text in simpara for styled paragraphs when rendered to DocBook' do input = <<-EOS = Book :doctype: book [preface] = About this book [abstract] An abstract for the book. = Part 1 [partintro] An intro to this part. == Chapter 1 [sidebar] Just a side note. [example] As you can see here. [quote] Wise words from a wise person. EOS output = render_string input, :backend => 'docbook' assert_css 'abstract > simpara', output, 1 assert_css 'partintro > simpara', output, 1 assert_css 'sidebar > simpara', output, 1 assert_css 'informalexample > simpara', output, 1 assert_css 'blockquote > simpara', output, 1 end test 'should wrap text in simpara for styled paragraphs with title when rendered to DocBook' do input = <<-EOS = Book :doctype: book [preface] = About this book [abstract] .Abstract title An abstract for the book. = Part 1 [partintro] .Part intro title An intro to this part. == Chapter 1 [sidebar] .Sidebar title Just a side note. [example] .Example title As you can see here. [quote] .Quote title Wise words from a wise person. EOS output = render_string input, :backend => 'docbook' assert_css 'abstract > title', output, 1 assert_xpath '//abstract/title[text() = "Abstract title"]', output, 1 assert_css 'abstract > title + simpara', output, 1 assert_css 'partintro > title', output, 1 assert_xpath '//partintro/title[text() = "Part intro title"]', output, 1 assert_css 'partintro > title + simpara', output, 1 assert_css 'sidebar > title', output, 1 assert_xpath '//sidebar/title[text() = "Sidebar title"]', output, 1 assert_css 'sidebar > title + simpara', output, 1 assert_css 'example > title', output, 1 assert_xpath '//example/title[text() = "Example title"]', output, 1 assert_css 'example > title + simpara', output, 1 assert_css 'blockquote > title', output, 1 assert_xpath '//blockquote/title[text() = "Quote title"]', output, 1 assert_css 'blockquote > title + simpara', output, 1 end end context 'Inline doctype' do test 'should only format and output text in first paragraph when doctype is inline' do input = "http://asciidoc.org[AsciiDoc] is a _lightweight_ markup language...\n\nignored" output = render_string input, :doctype => 'inline' assert_equal 'AsciiDoc is a lightweight markup language…​', output end test 'should output empty string if first block is not a paragraph' do input = '* bullet' output = render_string input, :doctype => 'inline' assert output.empty? end end end end