ronn-ng 0.7.4

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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +8 -0
  3. data/CHANGES +184 -0
  4. data/INSTALLING +20 -0
  5. data/LICENSE.txt +11 -0
  6. data/README.md +113 -0
  7. data/Rakefile +163 -0
  8. data/bin/ronn +223 -0
  9. data/config.ru +15 -0
  10. data/lib/ronn.rb +50 -0
  11. data/lib/ronn/document.rb +495 -0
  12. data/lib/ronn/index.rb +183 -0
  13. data/lib/ronn/roff.rb +302 -0
  14. data/lib/ronn/server.rb +70 -0
  15. data/lib/ronn/template.rb +171 -0
  16. data/lib/ronn/template/80c.css +6 -0
  17. data/lib/ronn/template/dark.css +18 -0
  18. data/lib/ronn/template/darktoc.css +17 -0
  19. data/lib/ronn/template/default.html +41 -0
  20. data/lib/ronn/template/man.css +100 -0
  21. data/lib/ronn/template/print.css +5 -0
  22. data/lib/ronn/template/screen.css +105 -0
  23. data/lib/ronn/template/toc.css +27 -0
  24. data/lib/ronn/utils.rb +55 -0
  25. data/man/index.html +78 -0
  26. data/man/index.txt +15 -0
  27. data/man/ronn-format.7 +201 -0
  28. data/man/ronn-format.7.ronn +157 -0
  29. data/man/ronn.1 +325 -0
  30. data/man/ronn.1.ronn +306 -0
  31. data/ronn-ng.gemspec +97 -0
  32. data/test/angle_bracket_syntax.html +18 -0
  33. data/test/angle_bracket_syntax.ronn +12 -0
  34. data/test/basic_document.html +9 -0
  35. data/test/basic_document.ronn +4 -0
  36. data/test/contest.rb +68 -0
  37. data/test/custom_title_document.html +6 -0
  38. data/test/custom_title_document.ronn +5 -0
  39. data/test/definition_list_syntax.html +21 -0
  40. data/test/definition_list_syntax.roff +26 -0
  41. data/test/definition_list_syntax.ronn +18 -0
  42. data/test/dots_at_line_start_test.roff +10 -0
  43. data/test/dots_at_line_start_test.ronn +4 -0
  44. data/test/entity_encoding_test.html +35 -0
  45. data/test/entity_encoding_test.roff +61 -0
  46. data/test/entity_encoding_test.ronn +25 -0
  47. data/test/index.txt +8 -0
  48. data/test/markdown_syntax.html +957 -0
  49. data/test/markdown_syntax.roff +1467 -0
  50. data/test/markdown_syntax.ronn +881 -0
  51. data/test/middle_paragraph.html +15 -0
  52. data/test/middle_paragraph.roff +13 -0
  53. data/test/middle_paragraph.ronn +10 -0
  54. data/test/missing_spaces.roff +9 -0
  55. data/test/missing_spaces.ronn +2 -0
  56. data/test/pre_block_with_quotes.roff +13 -0
  57. data/test/pre_block_with_quotes.ronn +6 -0
  58. data/test/section_reference_links.html +17 -0
  59. data/test/section_reference_links.roff +10 -0
  60. data/test/section_reference_links.ronn +12 -0
  61. data/test/test_ronn.rb +110 -0
  62. data/test/test_ronn_document.rb +186 -0
  63. data/test/test_ronn_index.rb +73 -0
  64. data/test/titleless_document.html +10 -0
  65. data/test/titleless_document.ronn +3 -0
  66. data/test/underline_spacing_test.roff +21 -0
  67. data/test/underline_spacing_test.ronn +11 -0
  68. metadata +176 -0
@@ -0,0 +1,15 @@
1
+ <div class='mp'>
2
+ <h2 id="NAME">NAME</h2>
3
+ <p class="man-name">
4
+ <code>test</code> - <span class="man-whatis">just a ron test</span>
5
+ </p>
6
+
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
+
15
+ </div>
@@ -0,0 +1,13 @@
1
+ .TH "TEST" "1" "January 1979" "" ""
2
+ .
3
+ .SH "NAME"
4
+ \fBtest\fR \- just a ron test
5
+ .
6
+ .SH "TEST"
7
+ Foo
8
+ .
9
+ .P
10
+ 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\.
11
+ .
12
+ .P
13
+ Bar
@@ -0,0 +1,10 @@
1
+ test(1) -- just a ron 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,9 @@
1
+ .TH "MISSING_SPACES" "" "January 1979" "" ""
2
+ .
3
+ .SH "NAME"
4
+ \fBmissing_spaces\fR
5
+ .
6
+ .TP
7
+ \fB\-S\fR \fItext\fR, \fBsearch\fR \fItext\fR
8
+ Performs a substring search of formula names for \fItext\fR\.
9
+
@@ -0,0 +1,2 @@
1
+ * `-S` <text>, `search` <text>:
2
+ Performs a substring search of formula names for <text>.
@@ -0,0 +1,13 @@
1
+ .TH "T" "1" "January 1979" "" ""
2
+ .
3
+ .SH "NAME"
4
+ \fBt\fR \- test
5
+ .
6
+ .SH "test"
7
+ .
8
+ .nf
9
+
10
+ [ "$11" ]
11
+ .
12
+ .fi
13
+
@@ -0,0 +1,6 @@
1
+ t(1) - test
2
+ ===========
3
+
4
+ ## test
5
+
6
+ [ "$11" ]
@@ -0,0 +1,17 @@
1
+ <div class='mp'>
2
+ <h2 id="NAME">NAME</h2>
3
+ <p class="man-name">
4
+ <code>section_reference_links</code> - <span class="man-whatis">linking to sections</span>
5
+ </p>
6
+
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">link this</a></p>
16
+
17
+ </div>
@@ -0,0 +1,10 @@
1
+ .TH "SECTION_REFERENCE_LINKS" "1" "January 1979" "" ""
2
+ .
3
+ .SH "NAME"
4
+ \fBsection_reference_links\fR \- linking to sections
5
+ .
6
+ .SH "SECTION 1"
7
+ See the following section\.
8
+ .
9
+ .SH "SECTION 2"
10
+ See \fISECTION 1\fR or \fIto put it another way\fR or even \fIlink 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 [link this](#SECTION-1)
data/test/test_ronn.rb ADDED
@@ -0,0 +1,110 @@
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
+ $:.unshift(libdir) unless $:.any? { |path| File.expand_path(path) == libdir }
13
+ ENV['RUBYLIB'] = $:.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 7, lines.size
21
+ assert_equal %[.\\" generated with Ronn-NG/v#{Ronn::version}], lines.shift
22
+ assert_equal %[.\\" http://github.com/apjanke/ronn-ng/tree/#{Ronn::revision}], lines.shift
23
+ assert_equal %[.], lines.shift
24
+ assert_equal %[.TH "HELLO" "1" "November 2009" "" ""], lines.shift
25
+ assert_equal %[.], lines.shift
26
+ assert_equal %[.SH "NAME"], lines.shift
27
+ assert_equal %[\\fBhello\\fR \\- hello world], lines.shift
28
+ assert_equal 0, lines.size
29
+ end
30
+
31
+ def canonicalize(text)
32
+ text.
33
+ gsub(/^ +/, '').
34
+ gsub(/\n/m, '').
35
+ gsub(/ +/, ' ').
36
+ gsub(/"/, "'")
37
+ end
38
+
39
+ test "produces html instead of roff with the --html argument" do
40
+ output = `echo '# hello(1) -- hello world' | ronn --html`
41
+ output = canonicalize(output)
42
+ assert_match(/<h2 id='NAME'>NAME<\/h2>/, output)
43
+ advertising = "<meta name='generator' content='Ronn-NG/v" + Ronn::version +
44
+ " (http://github.com/apjanke/ronn-ng/tree/" + Ronn::revision + ")'>"
45
+ assert_match(/#{Regexp.escape(advertising)}/, output)
46
+ end
47
+
48
+ test "produces html fragment with the --fragment argument" do
49
+ output = `echo '# hello(1) -- hello world' | ronn --fragment`
50
+ assert_equal [
51
+ "<div class='mp'>",
52
+ "<h2 id='NAME'>NAME</h2>",
53
+ "<p class='man-name'><code>hello</code>",
54
+ " - <span class='man-whatis'>hello world</span>",
55
+ "</p></div>"
56
+ ].join, canonicalize(output)
57
+ end
58
+
59
+ test "abides by the RONN_MANUAL environment variable" do
60
+ output = `echo '# hello(1) -- hello world' | RONN_MANUAL='Some Manual' ronn --html`
61
+ assert_match(/Some Manual/, output)
62
+ end
63
+
64
+ test "abides by the RONN_DATE environment variable" do
65
+ output = `echo '# hello(1) -- hello world' | RONN_DATE=1979-01-01 ronn --html`
66
+ assert_match(/January 1979/, output)
67
+ end
68
+
69
+ test "abides by the RONN_ORGANIZATION environment variable" do
70
+ output = `echo '# hello(1) -- hello world' | RONN_ORGANIZATION='GitHub' ronn --html`
71
+ assert_match(/GitHub/, output)
72
+ end
73
+
74
+ # ronn -> HTML file based tests
75
+ Dir[testdir + '/*.ronn'].each do |source|
76
+ dest = source.sub(/ronn$/, 'html')
77
+ next unless File.exist?(dest)
78
+ wrong = dest + '.wrong'
79
+ test File.basename(source, '.ronn') + ' HTML' do
80
+ output = `ronn --pipe --html --fragment #{source}`
81
+ expected = File.read(dest) rescue ''
82
+ if expected != output
83
+ File.open(wrong, 'wb') { |f| f.write(output) }
84
+ diff = `diff -u #{dest} #{wrong} 2>/dev/null`
85
+ flunk diff
86
+ elsif File.exist?(wrong)
87
+ File.unlink(wrong)
88
+ end
89
+ end
90
+ end
91
+
92
+ # ronn -> roff file based tests
93
+ Dir[testdir + '/*.ronn'].each do |source|
94
+ dest = source.sub(/ronn$/, 'roff')
95
+ next unless File.exist?(dest)
96
+ wrong = dest + '.wrong'
97
+ test File.basename(source, '.ronn') + ' roff' do
98
+ output = `ronn --pipe --roff --date=1979-01-01 #{source}`.
99
+ split("\n", 4).last # remove ronn version comments
100
+ expected = File.read(dest) rescue ''
101
+ if expected != output
102
+ File.open(wrong, 'wb') { |f| f.write(output) }
103
+ diff = `diff -u #{dest} #{wrong} 2>/dev/null`
104
+ flunk diff
105
+ elsif File.exist?(wrong)
106
+ File.unlink(wrong)
107
+ end
108
+ end
109
+ end
110
+ 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"
6
+
7
+ def canonicalize(text)
8
+ text.
9
+ gsub(/^ +/, '').
10
+ gsub(/\n/m, '').
11
+ gsub(/ +/, ' ').
12
+ gsub(/"/, "'")
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(wrap=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(wrap_class='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', __FILE__))
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
@@ -0,0 +1,73 @@
1
+ require 'contest'
2
+ require 'ronn'
3
+
4
+ class IndexTest < Test::Unit::TestCase
5
+ setup do
6
+ @index_path = File.expand_path('../index.txt', __FILE__)
7
+ @missing_path = File.expand_path('../missing-index.txt', __FILE__)
8
+ end
9
+
10
+ def expand_path(path, rel=File.dirname(__FILE__))
11
+ File.expand_path(path, rel)
12
+ end
13
+
14
+ test "creating with a non-existant file" do
15
+ index = Ronn::Index.new(@missing_path)
16
+ assert_equal @missing_path, index.path
17
+ assert_equal 0, index.size
18
+ assert index.empty?
19
+ end
20
+
21
+ test "creating with an index file and no block" do
22
+ index = Ronn::Index.new(@index_path)
23
+ assert_equal 3, index.size
24
+ assert_equal 2, index.manuals.size
25
+
26
+ ref = index.references[0]
27
+ assert_equal 'basic_document(7)', ref.name
28
+ assert_equal 'basic_document.ronn', ref.location
29
+ assert_equal 'basic_document.html', ref.url
30
+ assert_equal expand_path('basic_document.ronn'), ref.path
31
+ assert ref.manual?
32
+ assert ref.ronn?
33
+ assert !ref.remote?
34
+
35
+ ref = index.references[1]
36
+ assert_equal 'definition_list_syntax(5)', ref.name
37
+ assert_equal 'definition_list_syntax.ronn', ref.location
38
+ assert_equal 'definition_list_syntax.html', ref.url
39
+ assert_equal expand_path('definition_list_syntax.ronn'), ref.path
40
+
41
+ ref = index.references[2]
42
+ assert_equal 'grep(1)', ref.name
43
+ assert_equal 'http://man.cx/grep(1)', ref.url
44
+ assert ref.manual?
45
+ assert ref.remote?
46
+ assert !ref.ronn?
47
+ end
48
+
49
+ test "creating with a block reader" do
50
+ index = Ronn::Index.new(@index_path) { "hello(1) hello.1.ronn" }
51
+ assert_equal @index_path, index.path
52
+ assert_equal 1, index.size
53
+ ref = index.first
54
+ assert_equal 'hello(1)', ref.name
55
+ assert_equal 'hello.1.ronn', ref.location
56
+ assert_equal 'hello.1.html', ref.url
57
+ assert_equal expand_path('hello.1.ronn'), ref.path
58
+ end
59
+
60
+ test "adding manual paths" do
61
+ index = Ronn::Index.new(@index_path)
62
+ index << expand_path("angle_bracket_syntax.ronn")
63
+ assert_equal 'angle_bracket_syntax(5)', index.last.name
64
+ assert_equal expand_path('angle_bracket_syntax.ronn'), index.last.path
65
+ end
66
+
67
+ test "adding manual paths that are already present" do
68
+ index = Ronn::Index.new(@index_path)
69
+ size = index.size
70
+ index << expand_path("basic_document.ronn")
71
+ assert_equal size, index.size
72
+ end
73
+ end