nronn 0.10.1.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +8 -0
  3. data/CHANGES +230 -0
  4. data/Gemfile +2 -0
  5. data/Gemfile.lock +72 -0
  6. data/INSTALLING.md +92 -0
  7. data/LICENSE.txt +12 -0
  8. data/README.md +131 -0
  9. data/Rakefile +153 -0
  10. data/bin/ronn +253 -0
  11. data/completion/bash/ronn +32 -0
  12. data/completion/zsh/_ronn +24 -0
  13. data/config.ru +15 -0
  14. data/lib/ronn/document.rb +530 -0
  15. data/lib/ronn/index.rb +180 -0
  16. data/lib/ronn/roff.rb +393 -0
  17. data/lib/ronn/server.rb +67 -0
  18. data/lib/ronn/template/80c.css +6 -0
  19. data/lib/ronn/template/dark.css +18 -0
  20. data/lib/ronn/template/darktoc.css +17 -0
  21. data/lib/ronn/template/default.html +41 -0
  22. data/lib/ronn/template/man.css +100 -0
  23. data/lib/ronn/template/print.css +5 -0
  24. data/lib/ronn/template/screen.css +105 -0
  25. data/lib/ronn/template/toc.css +27 -0
  26. data/lib/ronn/template.rb +173 -0
  27. data/lib/ronn/utils.rb +57 -0
  28. data/lib/ronn.rb +47 -0
  29. data/man/index.html +78 -0
  30. data/man/index.txt +15 -0
  31. data/man/ronn-format.7 +145 -0
  32. data/man/ronn-format.7.ronn +157 -0
  33. data/man/ronn.1 +227 -0
  34. data/man/ronn.1.ronn +316 -0
  35. data/nronn.gemspec +136 -0
  36. data/test/angle_bracket_syntax.html +27 -0
  37. data/test/angle_bracket_syntax.roff +24 -0
  38. data/test/angle_bracket_syntax.ronn +22 -0
  39. data/test/backticks.html +14 -0
  40. data/test/backticks.ronn +10 -0
  41. data/test/basic_document.html +8 -0
  42. data/test/basic_document.ronn +4 -0
  43. data/test/circumflexes.ronn +1 -0
  44. data/test/code_blocks.html +38 -0
  45. data/test/code_blocks.roff +38 -0
  46. data/test/code_blocks.ronn +41 -0
  47. data/test/code_blocks_regression +19 -0
  48. data/test/code_blocks_regression.html +38 -0
  49. data/test/code_blocks_regression.ronn +40 -0
  50. data/test/contest.rb +70 -0
  51. data/test/custom_title_document.html +6 -0
  52. data/test/custom_title_document.ronn +5 -0
  53. data/test/definition_list_syntax.html +25 -0
  54. data/test/definition_list_syntax.roff +19 -0
  55. data/test/definition_list_syntax.ronn +18 -0
  56. data/test/dots_at_line_start_test.roff +19 -0
  57. data/test/dots_at_line_start_test.ronn +12 -0
  58. data/test/ellipses.roff +7 -0
  59. data/test/ellipses.ronn +7 -0
  60. data/test/entity_encoding_test.html +42 -0
  61. data/test/entity_encoding_test.roff +51 -0
  62. data/test/entity_encoding_test.ronn +34 -0
  63. data/test/index.txt +8 -0
  64. data/test/markdown_syntax.html +954 -0
  65. data/test/markdown_syntax.roff +907 -0
  66. data/test/markdown_syntax.ronn +881 -0
  67. data/test/middle_paragraph.html +14 -0
  68. data/test/middle_paragraph.roff +9 -0
  69. data/test/middle_paragraph.ronn +10 -0
  70. data/test/missing_spaces.roff +7 -0
  71. data/test/missing_spaces.ronn +2 -0
  72. data/test/nested_list.ronn +19 -0
  73. data/test/nested_list_with_code.html +14 -0
  74. data/test/nested_list_with_code.roff +11 -0
  75. data/test/nested_list_with_code.ronn +6 -0
  76. data/test/ordered_list.html +28 -0
  77. data/test/ordered_list.roff +25 -0
  78. data/test/ordered_list.ronn +21 -0
  79. data/test/page.with.periods.in.name.5.ronn +4 -0
  80. data/test/pre_block_with_quotes.roff +8 -0
  81. data/test/pre_block_with_quotes.ronn +6 -0
  82. data/test/section_reference_links.html +16 -0
  83. data/test/section_reference_links.roff +7 -0
  84. data/test/section_reference_links.ronn +12 -0
  85. data/test/single_quotes.html +11 -0
  86. data/test/single_quotes.roff +5 -0
  87. data/test/single_quotes.ronn +9 -0
  88. data/test/tables.ronn +24 -0
  89. data/test/test_ronn.rb +124 -0
  90. data/test/test_ronn_document.rb +186 -0
  91. data/test/test_ronn_index.rb +73 -0
  92. data/test/titleless_document.html +9 -0
  93. data/test/titleless_document.ronn +3 -0
  94. data/test/underline_spacing_test.roff +13 -0
  95. data/test/underline_spacing_test.ronn +11 -0
  96. metadata +309 -0
@@ -0,0 +1,14 @@
1
+ <div class='mp'>
2
+
3
+ <h2 id="NAME">NAME</h2>
4
+ <p class="man-name">
5
+ <code>test</code> - <span class="man-whatis">just a ronn test</span>
6
+ </p>
7
+ <h2 id="TEST">TEST</h2>
8
+
9
+ <p>Foo</p>
10
+
11
+ <p>Always use <code>attr_reader</code>, <code>attr_writer</code> or <code>attr_accessor</code>. Do not use <code>for...in</code>; use each instead. Do not use <code>and</code>/<code>or</code>; use <code>&amp;&amp;</code>/<code>||</code> instead.</p>
12
+
13
+ <p>Bar</p>
14
+ </div>
@@ -0,0 +1,9 @@
1
+ .TH "TEST" "1" "January 1979" ""
2
+ .SH "NAME"
3
+ \fBtest\fR \- just a ronn test
4
+ .SH "TEST"
5
+ Foo
6
+ .P
7
+ Always use \fBattr_reader\fR, \fBattr_writer\fR or \fBattr_accessor\fR\. Do not use \fBfor\|\.\|\.\|\.in\fR; use each instead\. Do not use \fBand\fR/\fBor\fR; use \fB&&\fR/\fB||\fR instead\.
8
+ .P
9
+ Bar
@@ -0,0 +1,10 @@
1
+ test(1) -- just a ronn test
2
+ ==========================
3
+
4
+ ## TEST
5
+
6
+ Foo
7
+
8
+ Always use `attr_reader`, `attr_writer` or `attr_accessor`. Do not use `for...in`; use each instead. Do not use `and`/`or`; use `&&`/`||` instead.
9
+
10
+ Bar
@@ -0,0 +1,7 @@
1
+ .TH "MISSING_SPACES" "" "January 1979" ""
2
+ .SH "NAME"
3
+ \fBmissing_spaces\fR
4
+ .TP
5
+ \fB\-S\fR \fItext\fR, \fBsearch\fR \fItext\fR
6
+ Performs a substring search of formula names for \fItext\fR\.
7
+
@@ -0,0 +1,2 @@
1
+ * `-S` <text>, `search` <text>:
2
+ Performs a substring search of formula names for <text>.
@@ -0,0 +1,19 @@
1
+ nested_list test
2
+ ================
3
+
4
+ ## TEST
5
+
6
+ * foo:
7
+ Blablabla.
8
+
9
+ * bar:
10
+ Blablabla.
11
+
12
+ - bar-foo:
13
+ Bububu.
14
+
15
+ - bar-baz:
16
+ Bububu.
17
+
18
+ * baz:
19
+ Blablabla.
@@ -0,0 +1,14 @@
1
+ <div class='mp'>
2
+
3
+ <h1 id="a-1-">a(1)</h1>
4
+ <ul>
5
+ <li>
6
+ <code>toggle_status</code>
7
+ <ul>
8
+ <li>Toggle the display of the status bar.</li>
9
+ </ul>
10
+ </li>
11
+ <li>
12
+ <code>spawn &lt;executable&gt; &lt;additional args&gt;</code> TODO explain path-alike expansion</li>
13
+ </ul>
14
+ </div>
@@ -0,0 +1,11 @@
1
+ .TH "NESTED_LIST_WITH_CODE" "" "January 1979" ""
2
+ .IP "\(bu" 4
3
+ \fBtoggle_status\fR
4
+ .IP "\(bu" 4
5
+ Toggle the display of the status bar\.
6
+ .IP "" 0
7
+
8
+ .IP "\(bu" 4
9
+ \fBspawn <executable> <additional args>\fR TODO explain path\-alike expansion
10
+ .IP "" 0
11
+
@@ -0,0 +1,6 @@
1
+ a(1)
2
+ ====
3
+
4
+ * `toggle_status`
5
+ - Toggle the display of the status bar.
6
+ * `spawn <executable> <additional args>` TODO explain path-alike expansion
@@ -0,0 +1,28 @@
1
+ <div class='mp'>
2
+
3
+ <h1 id="Ordered-Lists">Ordered Lists</h1>
4
+ <h2 id="Simple-ordered-lists">Simple ordered lists</h2>
5
+
6
+ <h3 id="One-item-list">One-item list</h3>
7
+
8
+ <ol>
9
+ <li>Hello, world!</li>
10
+ </ol>
11
+
12
+ <h3 id="Three-item-list">Three-item list</h3>
13
+
14
+ <ol>
15
+ <li>Hello, world!</li>
16
+ <li>Item 2</li>
17
+ <li>Item 3</li>
18
+ </ol>
19
+
20
+ <h3 id="Four-item-list-with-all-1s">Four-item list with all 1s</h3>
21
+
22
+ <ol>
23
+ <li>Item 1</li>
24
+ <li>Item 2</li>
25
+ <li>Item 3</li>
26
+ <li>Item 4</li>
27
+ </ol>
28
+ </div>
@@ -0,0 +1,25 @@
1
+ .TH "ORDERED_LIST" "" "January 1979" ""
2
+ .SH "Simple ordered lists"
3
+ .SS "One\-item list"
4
+ .IP "1." 4
5
+ Hello, world!
6
+ .IP "" 0
7
+ .SS "Three\-item list"
8
+ .IP "1." 4
9
+ Hello, world!
10
+ .IP "2." 4
11
+ Item 2
12
+ .IP "3." 4
13
+ Item 3
14
+ .IP "" 0
15
+ .SS "Four\-item list with all 1s"
16
+ .IP "1." 4
17
+ Item 1
18
+ .IP "2." 4
19
+ Item 2
20
+ .IP "3." 4
21
+ Item 3
22
+ .IP "4." 4
23
+ Item 4
24
+ .IP "" 0
25
+
@@ -0,0 +1,21 @@
1
+ Ordered Lists
2
+ =============
3
+
4
+ ## Simple ordered lists
5
+
6
+ ### One-item list
7
+
8
+ 1. Hello, world!
9
+
10
+ ### Three-item list
11
+
12
+ 1. Hello, world!
13
+ 2. Item 2
14
+ 3. Item 3
15
+
16
+ ### Four-item list with all 1s
17
+
18
+ 1. Item 1
19
+ 1. Item 2
20
+ 1. Item 3
21
+ 1. Item 4
@@ -0,0 +1,4 @@
1
+ Example
2
+ =======
3
+
4
+ Hello, world!
@@ -0,0 +1,8 @@
1
+ .TH "T" "1" "January 1979" ""
2
+ .SH "NAME"
3
+ \fBt\fR \- test
4
+ .SH "test"
5
+ .nf
6
+ [ "$11" ]
7
+ .fi
8
+
@@ -0,0 +1,6 @@
1
+ t(1) - test
2
+ ===========
3
+
4
+ ## test
5
+
6
+ [ "$11" ]
@@ -0,0 +1,16 @@
1
+ <div class='mp'>
2
+
3
+ <h2 id="NAME">NAME</h2>
4
+ <p class="man-name">
5
+ <code>section_reference_links</code> - <span class="man-whatis">linking to sections</span>
6
+ </p>
7
+ <h2 id="SECTION-1">SECTION 1</h2>
8
+
9
+ <p>See the following section.</p>
10
+
11
+ <h2 id="SECTION-2">SECTION 2</h2>
12
+
13
+ <p>See <a href="#SECTION-1" title="SECTION 1" data-bare-link="true">SECTION 1</a>
14
+ or <a href="#SECTION-1" title="SECTION 1" data-bare-link="true">to put it another way</a>
15
+ or even <a href="#SECTION-1" data-bare-link="true">like this</a></p>
16
+ </div>
@@ -0,0 +1,7 @@
1
+ .TH "SECTION_REFERENCE_LINKS" "1" "January 1979" ""
2
+ .SH "NAME"
3
+ \fBsection_reference_links\fR \- linking to sections
4
+ .SH "SECTION 1"
5
+ See the following section\.
6
+ .SH "SECTION 2"
7
+ See \fISECTION 1\fR or \fIto put it another way\fR or even \fIlike this\fR
@@ -0,0 +1,12 @@
1
+ section_reference_links(1) - linking to sections
2
+ ================================================
3
+
4
+ ## SECTION 1
5
+
6
+ See the following section.
7
+
8
+ ## SECTION 2
9
+
10
+ See [SECTION 1][]
11
+ or [to put it another way][SECTION 1]
12
+ or even [like this](#SECTION-1)
@@ -0,0 +1,11 @@
1
+ <div class='mp'>
2
+
3
+ <h1 id="Single-quotes">Single quotes</h1>
4
+ <h2 id="Single-quote-at-beginning-of-line">Single quote at beginning of line</h2>
5
+
6
+ <p>'This phrase should appear as normal, starting with a single quote.'</p>
7
+
8
+ <h2 id="Quotes-in-middle-of-line">Quotes in middle of line</h2>
9
+
10
+ <p>When you've got single quotes (') in a line, they're regular quotes.</p>
11
+ </div>
@@ -0,0 +1,5 @@
1
+ .TH "SINGLE_QUOTES" "" "January 1979" ""
2
+ .SH "Single quote at beginning of line"
3
+ \&'This phrase should appear as normal, starting with a single quote\.'
4
+ .SH "Quotes in middle of line"
5
+ When you've got single quotes (') in a line, they're regular quotes\.
@@ -0,0 +1,9 @@
1
+ # Single quotes
2
+
3
+ ## Single quote at beginning of line
4
+
5
+ 'This phrase should appear as normal, starting with a single quote.'
6
+
7
+ ## Quotes in middle of line
8
+
9
+ When you've got single quotes (') in a line, they're regular quotes.
data/test/tables.ronn ADDED
@@ -0,0 +1,24 @@
1
+ Hello, world with tables
2
+ ========================
3
+
4
+
5
+ ## Simple table
6
+
7
+ | Syntax | Description |
8
+ | ----------- | ----------- |
9
+ | Header | Title |
10
+ | Paragraph | Text |
11
+
12
+ ## Table with column alignment
13
+
14
+ | Syntax | Description | Test Text With A Long Header Name |
15
+ | :--- | :----: | ---: |
16
+ | Header | Title | Here's this |
17
+ | Paragraph | Text | And more |
18
+
19
+ ## Table with embedded markup
20
+
21
+ | Header |
22
+ | ------ |
23
+ | Code: `some code` |
24
+ | Emphasis: *foo* and *bar* |
data/test/test_ronn.rb ADDED
@@ -0,0 +1,124 @@
1
+ require 'contest'
2
+
3
+ class RonnTest < Test::Unit::TestCase
4
+ testdir = File.dirname(__FILE__)
5
+
6
+ # setup PATH so that we execute the right ronn command
7
+ bindir = File.dirname(testdir) + '/bin'
8
+ ENV['PATH'] = "#{bindir}:#{ENV['PATH']}"
9
+
10
+ # make sure the load path is setup correctly
11
+ libdir = File.expand_path("#{testdir}/../lib")
12
+ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.any? { |path| File.expand_path(path) == libdir }
13
+ ENV['RUBYLIB'] = $LOAD_PATH.join(':')
14
+
15
+ require 'ronn'
16
+
17
+ test 'takes ronn text on stdin and produces roff on stdout' do
18
+ output = `echo '# hello(1) -- hello world' | ronn --date=2009-11-23`
19
+ lines = output.split("\n")
20
+ assert_equal 5, lines.size
21
+ assert_equal %(.\\" generated with nRonn/v#{Ronn.version}), lines.shift
22
+ assert_equal %(.\\" https://github.com/n-ronn/nronn/tree/#{Ronn.revision}), lines.shift
23
+ assert_equal %(.TH "HELLO" "1" "November 2009" ""), lines.shift
24
+ assert_equal %(.SH "NAME"), lines.shift
25
+ assert_equal %(\\fBhello\\fR \\- hello world), lines.shift
26
+ assert_equal 0, lines.size
27
+ end
28
+
29
+ def canonicalize(text)
30
+ text
31
+ .gsub(/^ +/, '')
32
+ .gsub(/\n/m, '')
33
+ .gsub(/ +/, ' ')
34
+ .tr('"', "'")
35
+ end
36
+
37
+ def flunk_with_diff(dest, wrong, output)
38
+ File.open(wrong, 'wb') { |f| f.write(output) }
39
+ if ENV['RONN_QUIET_TEST'] == '1'
40
+ flunk 'Output did not match expected.'
41
+ else
42
+ diff = `diff -u #{dest} #{wrong} 2>/dev/null`
43
+ flunk diff
44
+ end
45
+ end
46
+
47
+ test 'produces html instead of roff with the --html argument' do
48
+ output = `echo '# hello(1) -- hello world' | ronn --html`
49
+ output = canonicalize(output)
50
+ assert_match(/<h2 id='NAME'>NAME<\/h2>/, output)
51
+ advertising = "<meta name='generator' content='nRonn/v" + Ronn.version +
52
+ ' (https://github.com/n-ronn/nronn/tree/' + Ronn.revision + ")'>"
53
+ assert_match(/#{Regexp.escape(advertising)}/, output)
54
+ end
55
+
56
+ test 'produces html fragment with the --fragment argument' do
57
+ output = `echo '# hello(1) -- hello world' | ronn --fragment`
58
+ assert_equal [
59
+ "<div class='mp'>",
60
+ "<h2 id='NAME'>NAME</h2>",
61
+ "<p class='man-name'><code>hello</code>",
62
+ " - <span class='man-whatis'>hello world</span>",
63
+ '</p></div>'
64
+ ].join, canonicalize(output)
65
+ end
66
+
67
+ test 'abides by the RONN_MANUAL environment variable' do
68
+ output = `echo '# hello(1) -- hello world' | RONN_MANUAL='Some Manual' ronn --html`
69
+ assert_match(/Some Manual/, output)
70
+ end
71
+
72
+ test 'abides by the RONN_DATE environment variable' do
73
+ output = `echo '# hello(1) -- hello world' | RONN_DATE=1979-01-01 ronn --html`
74
+ assert_match(/January 1979/, output)
75
+ end
76
+
77
+ test 'abides by the RONN_ORGANIZATION environment variable' do
78
+ output = `echo '# hello(1) -- hello world' | RONN_ORGANIZATION='GitHub' ronn --html`
79
+ assert_match(/GitHub/, output)
80
+ end
81
+
82
+ # ronn -> HTML file based tests
83
+ Dir[testdir + '/*.ronn'].each do |source|
84
+ dest = source.sub(/ronn$/, 'html')
85
+ next unless File.exist?(dest)
86
+
87
+ wrong = dest + '.wrong'
88
+ test File.basename(source, '.ronn') + ' HTML' do
89
+ output = `ronn --pipe --html --fragment #{source}`
90
+ expected = begin
91
+ File.read(dest)
92
+ rescue IOError
93
+ ''
94
+ end
95
+ if expected != output
96
+ flunk_with_diff(dest, wrong, output)
97
+ elsif File.exist?(wrong)
98
+ File.unlink(wrong)
99
+ end
100
+ end
101
+ end
102
+
103
+ # ronn -> roff file based tests
104
+ Dir[testdir + '/*.ronn'].each do |source|
105
+ dest = source.sub(/ronn$/, 'roff')
106
+ next unless File.exist?(dest)
107
+
108
+ wrong = dest + '.wrong'
109
+ test File.basename(source, '.ronn') + ' roff' do
110
+ output = `ronn --pipe --roff --date=1979-01-01 #{source}`
111
+ .split("\n", 3).last # remove ronn version comments
112
+ expected = begin
113
+ File.read(dest)
114
+ rescue IOError
115
+ ''
116
+ end
117
+ if expected != output
118
+ flunk_with_diff(dest, wrong, output)
119
+ elsif File.exist?(wrong)
120
+ File.unlink(wrong)
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,186 @@
1
+ require 'contest'
2
+ require 'ronn/document'
3
+
4
+ class DocumentTest < Test::Unit::TestCase
5
+ SIMPLE_FILE = "#{File.dirname(__FILE__)}/basic_document.ronn".freeze
6
+
7
+ def canonicalize(text)
8
+ text
9
+ .gsub(/^ +/, '')
10
+ .gsub(/\n/m, '')
11
+ .gsub(/ +/, ' ')
12
+ .tr('"', "'")
13
+ end
14
+
15
+ test 'new with path' do
16
+ doc = Ronn::Document.new(SIMPLE_FILE)
17
+ assert_equal File.read(SIMPLE_FILE), doc.data
18
+ end
19
+
20
+ test 'new with path and block' do
21
+ doc = Ronn::Document.new('hello.1.ronn') { '# hello(1) -- hello world' }
22
+ assert_equal '# hello(1) -- hello world', doc.data
23
+ end
24
+
25
+ test 'new with path and block but missing name section' do
26
+ doc = Ronn::Document.new('foo.7.ronn') { '' }
27
+ assert_equal 'foo', doc.name
28
+ assert_equal '7', doc.section
29
+ end
30
+
31
+ test 'new with non conventional path and missing name section' do
32
+ doc = Ronn::Document.new('bar.ronn') { '' }
33
+ assert_equal 'bar', doc.name
34
+ assert_equal nil, doc.section
35
+ assert_equal './bar.html', doc.path_for('html')
36
+ assert_equal './bar', doc.path_for('roff')
37
+ assert_equal './bar', doc.path_for('')
38
+ assert_equal './bar', doc.path_for(nil)
39
+ end
40
+
41
+ test 'new with path and name section mismatch' do
42
+ doc = Ronn::Document.new('foo/rick.7.ronn') { "# randy(3) -- I'm confused." }
43
+ assert_equal 'randy', doc.name
44
+ assert_equal 'rick', doc.path_name
45
+ assert_equal '3', doc.section
46
+ assert_equal '7', doc.path_section
47
+ assert_equal 'rick.7', doc.basename
48
+ assert_equal 'foo/rick.7.bar', doc.path_for(:bar)
49
+ end
50
+
51
+ test 'new with no path and a name section' do
52
+ doc = Ronn::Document.new { '# brandy(5) -- wootderitis' }
53
+ assert_equal nil, doc.path_name
54
+ assert_equal nil, doc.path_section
55
+ assert_equal 'brandy', doc.name
56
+ assert_equal '5', doc.section
57
+ assert_equal 'brandy.5', doc.basename
58
+ assert_equal 'brandy.5.foo', doc.path_for(:foo)
59
+ end
60
+
61
+ 1.upto(5) do |i|
62
+ dashes = '-' * i
63
+
64
+ test "new with no path and #{i} dashes in name" do
65
+ doc = Ronn::Document.new { "# brandy #{dashes} wootderitis" }
66
+ assert_equal 'brandy', doc.name
67
+ assert_equal nil, doc.section
68
+ assert_equal 'wootderitis', doc.tagline
69
+ end
70
+
71
+ test "new with no path and a name section and #{i} dashes in name" do
72
+ doc = Ronn::Document.new { "# brandy(5) #{dashes} wootderitis" }
73
+ assert_equal 'brandy', doc.name
74
+ assert_equal '5', doc.section
75
+ assert_equal 'wootderitis', doc.tagline
76
+ end
77
+ end
78
+
79
+ context 'simple conventionally named document' do
80
+ setup do
81
+ @now = Time.now
82
+ @doc = Ronn::Document.new('hello.1.ronn') { '# hello(1) -- hello world' }
83
+ @doc.date = @now
84
+ end
85
+
86
+ should 'load data' do
87
+ assert_equal '# hello(1) -- hello world', @doc.data
88
+ end
89
+
90
+ should 'extract the manual page name from the filename or document' do
91
+ assert_equal 'hello', @doc.name
92
+ end
93
+
94
+ should 'extract the manual page section from the filename or document' do
95
+ assert_equal '1', @doc.section
96
+ end
97
+
98
+ should 'convert to an HTML fragment with no wrap div' do
99
+ assert_equal %(<h2 id='NAME'>NAME</h2><p class='man-name'><code>hello</code> - <span class='man-whatis'>hello world</span></p>),
100
+ canonicalize(@doc.to_html_fragment(nil))
101
+ end
102
+
103
+ should 'convert to an HTML fragment with a wrap class' do
104
+ assert_equal %(<div class='pm'><h2 id='NAME'>NAME</h2><p class='man-name'><code>hello</code> - <span class='man-whatis'>hello world</span></p></div>),
105
+ canonicalize(@doc.to_html_fragment('pm'))
106
+ end
107
+
108
+ should 'convert to HTML with a layout' do
109
+ assert_match %r{^<!DOCTYPE html.*}m, @doc.to_html
110
+ assert_match %(<h2 id='NAME'>NAME</h2><p class='man-name'><code>hello</code> - <span class='man-whatis'>hello world</span></p>),
111
+ canonicalize(@doc.to_html)
112
+ end
113
+
114
+ should 'construct a path to related documents' do
115
+ assert_equal './hello.1.html', @doc.path_for(:html)
116
+ assert_equal './hello.1', @doc.path_for(:roff)
117
+ assert_equal './hello.1', @doc.path_for('')
118
+ assert_equal './hello.1', @doc.path_for(nil)
119
+ end
120
+
121
+ test 'uses default styles' do
122
+ assert_equal %w[man], @doc.styles
123
+ end
124
+
125
+ test 'converting to a hash' do
126
+ assert_equal({
127
+ 'section' => '1',
128
+ 'name' => 'hello',
129
+ 'date' => @now,
130
+ 'tagline' => 'hello world',
131
+ 'styles' => ['man'],
132
+ 'toc' => [['NAME', 'NAME']],
133
+ 'organization' => nil,
134
+ 'manual' => nil
135
+ }, @doc.to_h)
136
+ end
137
+
138
+ test 'converting to yaml' do
139
+ require 'yaml'
140
+ assert_equal({
141
+ 'section' => '1',
142
+ 'name' => 'hello',
143
+ 'date' => @now,
144
+ 'tagline' => 'hello world',
145
+ 'styles' => ['man'],
146
+ 'toc' => [['NAME', 'NAME']],
147
+ 'organization' => nil,
148
+ 'manual' => nil
149
+ }, YAML.load(@doc.to_yaml))
150
+ end
151
+
152
+ test 'converting to json' do
153
+ require 'json'
154
+ assert_equal({
155
+ 'section' => '1',
156
+ 'name' => 'hello',
157
+ 'date' => @now.iso8601,
158
+ 'tagline' => 'hello world',
159
+ 'styles' => ['man'],
160
+ 'toc' => [['NAME', 'NAME']],
161
+ 'organization' => nil,
162
+ 'manual' => nil
163
+ }, JSON.parse(@doc.to_json))
164
+ end
165
+ end
166
+
167
+ test 'extracting toc' do
168
+ @doc = Ronn::Document.new(File.expand_path('markdown_syntax.ronn', __dir__))
169
+ expected = [
170
+ ['NAME', 'NAME'],
171
+ ['SYNOPSIS', 'SYNOPSIS'],
172
+ ['DESCRIPTION', 'DESCRIPTION'],
173
+ ['BLOCK-ELEMENTS', 'BLOCK ELEMENTS'],
174
+ ['SPAN-ELEMENTS', 'SPAN ELEMENTS'],
175
+ ['MISCELLANEOUS', 'MISCELLANEOUS'],
176
+ ['AUTHOR', 'AUTHOR'],
177
+ ['SEE-ALSO', 'SEE ALSO']
178
+ ]
179
+ assert_equal expected, @doc.toc
180
+ end
181
+
182
+ test 'passing a list of styles' do
183
+ @doc = Ronn::Document.new('hello.1.ronn', styles: %w[test boom test]) { '' }
184
+ assert_equal %w[man test boom], @doc.styles
185
+ end
186
+ end