nronn 0.10.1.pre2

Sign up to get free protection for your applications and to get access to all the features.
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
data/Rakefile ADDED
@@ -0,0 +1,153 @@
1
+ require 'rake/clean'
2
+ require 'date'
3
+
4
+ task default: :test
5
+
6
+ ROOTDIR = File.expand_path(__dir__).sub(/#{Dir.pwd}(?=\/)/, '.')
7
+ LIBDIR = "#{ROOTDIR}/lib".freeze
8
+ BINDIR = "#{ROOTDIR}/bin".freeze
9
+
10
+ task :environment do
11
+ $LOAD_PATH.unshift ROOTDIR unless $LOAD_PATH.include?(ROOTDIR)
12
+ $LOAD_PATH.unshift LIBDIR unless $LOAD_PATH.include?(LIBDIR)
13
+ require_library 'nokogiri'
14
+ require_library 'kramdown'
15
+ ENV['RUBYLIB'] = $LOAD_PATH.join(':')
16
+ ENV['PATH'] = "#{BINDIR}:#{ENV['PATH']}"
17
+ end
18
+
19
+ desc 'Run tests'
20
+ task test: :environment do
21
+ $LOAD_PATH.unshift "#{ROOTDIR}/test"
22
+ Dir['test/test_*.rb'].sort.each { |f| require(f) }
23
+ end
24
+
25
+ desc 'Start the server'
26
+ task server: :environment do
27
+ if system('type shotgun >/dev/null 2>&1')
28
+ exec 'shotgun config.ru'
29
+ else
30
+ require 'ronn/server'
31
+ Ronn::Server.run('man/*.ronn')
32
+ end
33
+ end
34
+
35
+ desc 'Build the manual'
36
+ task man: :environment do
37
+ require 'ronn'
38
+ ENV['RONN_MANUAL'] = 'Ronn Manual'
39
+ ENV['RONN_ORGANIZATION'] = "nRonn #{Ronn.revision}"
40
+ sh 'ronn -w -s toc -r5 --markdown man/*.ronn'
41
+ end
42
+
43
+ desc 'Publish to GitHub pages'
44
+ task pages: :man do
45
+ puts '----------------------------------------------'
46
+ puts 'Rebuilding pages ...'
47
+ verbose(false) do
48
+ rm_rf 'pages'
49
+ push_url = `git remote show origin`.grep(/Push.*URL/).first[/git@.*/]
50
+ sh "
51
+ set -e
52
+ git fetch -q origin
53
+ rev=$(git rev-parse origin/gh-pages)
54
+ git clone -q -b gh-pages . pages
55
+ cd pages
56
+ git reset --hard $rev
57
+ rm -f ronn*.html index.html
58
+ cp -rp ../man/ronn*.html ../man/index.txt ../man/index.html ./
59
+ git add -u ronn*.html index.html index.txt
60
+ git commit -m 'rebuild manual'
61
+ git push #{push_url} gh-pages
62
+ ", verbose: false
63
+ end
64
+ end
65
+
66
+ # PACKAGING ============================================================
67
+
68
+ # Rev Ronn::VERSION
69
+ task :rev do
70
+ rev = ENV['REV'] || `git describe --tags`.chomp
71
+ data = File.read('lib/ronn.rb')
72
+ data.gsub!(/^( *)REV *=.*/, "\\1REV = '#{rev}'")
73
+ File.open('lib/ronn.rb', 'wb') { |fd| fd.write(data) }
74
+ puts "revision: #{rev}"
75
+ puts "version: #{`ruby -Ilib -rronn -e 'puts Ronn::VERSION'`}"
76
+ end
77
+
78
+ require 'rubygems'
79
+ @spec = eval(File.read('nronn.gemspec'))
80
+
81
+ def package(ext = '')
82
+ "pkg/nronn-#{@spec.version}" + ext
83
+ end
84
+
85
+ desc 'Build packages'
86
+ task package: %w[.gem .tar.gz].map { |ext| package(ext) }
87
+
88
+ desc 'Build and install as local gem'
89
+ task install: package('.gem') do
90
+ sh "gem install #{package('.gem')}"
91
+ end
92
+
93
+ directory 'pkg/'
94
+ CLOBBER.include('pkg')
95
+
96
+ file package('.gem') => %w[pkg/ nronn.gemspec] + @spec.files do |f|
97
+ sh 'gem build nronn.gemspec'
98
+ mv File.basename(f.name), f.name
99
+ end
100
+
101
+ file package('.tar.gz') => %w[pkg/] + @spec.files do |f|
102
+ sh <<-SH
103
+ git archive --prefix=ronn-#{source_version}/ --format=tar HEAD |
104
+ gzip > #{f.name}
105
+ SH
106
+ end
107
+
108
+ def source_version
109
+ @source_version ||= `ruby -Ilib -rronn -e 'puts Ronn::VERSION'`.chomp
110
+ end
111
+
112
+ file 'nronn.gemspec' => FileList['{lib,test,bin}/**', 'Rakefile'] do |f|
113
+ # read spec file and split out manifest section
114
+ spec = File.read(f.name)
115
+ head, _manifest, tail = spec.split(" # = MANIFEST =\n")
116
+ # replace version and date
117
+ head.sub!(/\.version = '.*'/, ".version = '#{source_version}'")
118
+ head.sub!(/\.date = '.*'/, ".date = '#{Date.today}'")
119
+ # determine file list from git ls-files
120
+ files = `git ls-files`
121
+ .split("\n")
122
+ .sort
123
+ .reject { |file| file =~ /^\./ }
124
+ .reject { |file| file =~ /^doc/ }
125
+ .map { |file| " #{file}" }
126
+ .join("\n")
127
+ # piece file back together and write...
128
+ manifest = " s.files = %w[\n#{files}\n ]\n"
129
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
130
+ File.open(f.name, 'w') { |io| io.write(spec) }
131
+ puts "updated #{f.name}"
132
+ end
133
+
134
+ # Misc ===============================================================
135
+
136
+ def require_library(name)
137
+ require name
138
+ rescue LoadError => e
139
+ unless defined?(Gem)
140
+ warn "warn: #{e}. trying again with rubygems."
141
+ require 'rubygems'
142
+ retry
143
+ end
144
+ abort "fatal: the '#{name}' library is required (gem install #{name})"
145
+ end
146
+
147
+ # make .wrong test files right
148
+ task :right do
149
+ Dir['test/*.wrong'].each do |file|
150
+ dest = file.sub(/\.wrong$/, '')
151
+ mv file, dest
152
+ end
153
+ end
data/bin/ronn ADDED
@@ -0,0 +1,253 @@
1
+ #!/usr/bin/env ruby
2
+ # / Usage: ronn <options> <file>...
3
+ # / ronn -m|--man <file>
4
+ # / ronn -S|--server <file> ...
5
+ # / ronn --pipe [<file>...]
6
+ # / Convert ronn source <file>s to roff or HTML manpage. In the first synopsis form,
7
+ # / build HTML and roff output files based on the input file names.
8
+ # /
9
+ # / Mode options alter the default behavior of generating files:
10
+ # / --pipe write to standard output instead of generating files
11
+ # / -m, --man show manual like with man(1)
12
+ # / -S, --server serve <file>s at http://localhost:1207/
13
+ # / --port <port> run server at specified port instead of 1207
14
+ # / -o, --output-dir <dir> write generated files to specified directory
15
+ # /
16
+ # / Format options control which files / formats are generated:
17
+ # / -r, --roff generate roff output
18
+ # / -5, --html generate entire HTML page with layout
19
+ # / -f, --fragment generate HTML fragment
20
+ # / --markdown generate post-processed markdown output
21
+ # /
22
+ # / Document attributes:
23
+ # / --date=<date> published date in YYYY-MM-DD format (bottom-center)
24
+ # / --manual=<name> name of the manual (top-center)
25
+ # / --name=<name> title of the manual page (top-left, top-right, bottom-right)
26
+ # / --organization=<name> publishing group or individual (bottom-left)
27
+ # / --section=<sec> section of the manual page (with name)
28
+ # /
29
+ # / Misc options:
30
+ # / -w, --warnings show troff warnings on stderr
31
+ # / -W disable previously enabled troff warnings
32
+ # / --version show ronn version and exit
33
+ # / --help show this help message
34
+ # / -E <encoding> specify the encoding files are in (default is UTF-8)
35
+ # / Note: this only affects files. Data passed in to ronn's STDIN
36
+ # / must be in UTF-8 regardless of the -E setting.
37
+ # /
38
+ # / A <file> named example.1.ronn generates example.1.html (HTML manpage)
39
+ # / and example.1 (roff manpage) by default.
40
+ require 'date'
41
+ require 'optparse'
42
+
43
+ # Ronn wants its inputs to be in UTF-8, regardless of the user's
44
+ # locale settings or Ruby version.
45
+ Encoding.default_external = Encoding::UTF_8
46
+
47
+ def usage
48
+ puts File.readlines(__FILE__)
49
+ .grep(/^# \/.*/)
50
+ .map { |line| line.chomp[4..-1] }
51
+ .join("\n")
52
+ end
53
+
54
+ ##
55
+ # Libraries and LOAD_PATH shenanigans
56
+
57
+ begin
58
+ require 'kramdown'
59
+ require 'nokogiri'
60
+ require 'ronn'
61
+ rescue LoadError => e
62
+ if e.to_s =~ /ronn/
63
+ libdir = File.expand_path('../lib', __dir__).sub(%r{^#{Dir.pwd}/}, './')
64
+ if File.directory?(libdir) && !$LOAD_PATH.include?(libdir)
65
+ # warn "warn: #{boom}. adding #{libdir} to RUBYLIB ..."
66
+ $LOAD_PATH.unshift libdir
67
+ retry
68
+ end
69
+ elsif !defined?(Gem)
70
+ warn "warn: #{e}. loading rubygems ..."
71
+ require 'rubygems'
72
+ retry
73
+ end
74
+ abort e.to_s
75
+ end
76
+
77
+ ##
78
+ # Argument defaults
79
+
80
+ build = true
81
+ view = false
82
+ server = false
83
+ port_arg = nil
84
+ formats = nil
85
+ encoding = 'UTF-8'
86
+ options = {}
87
+ write_index = false
88
+ styles = %w[man]
89
+ groff = 'groff -Wall -mtty-char -mandoc -Tascii -t'
90
+ pager = ENV['MANPAGER'] || ENV['PAGER'] || 'more -s'
91
+ output_dir = nil
92
+
93
+ ##
94
+ # Environment variables
95
+
96
+ %w[manual organization date].each do |attribute|
97
+ value = ENV["RONN_#{attribute.upcase}"]
98
+ next if value.nil? || value.empty?
99
+
100
+ options[attribute] = value
101
+ end
102
+
103
+ ##
104
+ # Argument parsing
105
+
106
+ ARGV.options do |argv|
107
+ # modes
108
+ argv.on('--pipe') { build = server = false }
109
+ argv.on('-b', '--build') { build = true; server = false }
110
+ argv.on('-m', '--man') { build = server = false; view = true }
111
+ argv.on('-S', '--server') { build = view = false; server = true }
112
+ argv.on('-i', '--index') { write_index = true }
113
+ argv.on('-o', '--output-dir=V') { |val| output_dir = val }
114
+ argv.on('--port=V') { |val| port_arg = val }
115
+
116
+ # format options
117
+ argv.on('-r', '--roff') { (formats ||= []) << 'roff' }
118
+ argv.on('-5', '--html') { (formats ||= []) << 'html' }
119
+ argv.on('-f', '--fragment') { (formats ||= []) << 'html_fragment' }
120
+ argv.on('--markdown') { (formats ||= []) << 'markdown' }
121
+ argv.on('--yaml') { (formats ||= []) << 'yaml' }
122
+ argv.on('-E', '--encoding=V') { |val| encoding = val }
123
+
124
+ # html output options
125
+ argv.on('-s', '--style=V') { |val| styles += val.split(/[, \n]+/) }
126
+
127
+ # manual attribute options
128
+ %w[name section manual organization date].each do |attribute|
129
+ argv.on("--#{attribute}=VALUE") { |val| options[attribute] = val }
130
+ end
131
+
132
+ # misc
133
+ argv.on('-w', '--warnings') { groff += ' -ww' }
134
+ argv.on('-W') { groff += ' -Ww' }
135
+ argv.on('-v', '--version') do
136
+ require 'ronn'
137
+ if Ronn.release?
138
+ printf "nRonn v%s\n", Ronn::VERSION
139
+ else
140
+ printf "nRonn v%s (%s)\n", Ronn::VERSION, Ronn::REV
141
+ end
142
+ printf "https://github.com/n-ronn/nronn/tree/%s\n", Ronn.revision
143
+ exit 0
144
+ end
145
+ argv.on_tail('--help') { usage; exit 0 }
146
+ argv.parse!
147
+ end
148
+
149
+ ##
150
+ # Modes, Formats, Options
151
+
152
+ if ARGV.empty? && $stdin.tty?
153
+ usage
154
+ exit 2
155
+ elsif ARGV.empty? && !server
156
+ ARGV.push '-'
157
+ build = false
158
+ formats ||= %w[roff]
159
+ elsif view
160
+ formats ||= %w[roff]
161
+ elsif build
162
+ formats ||= %w[roff html]
163
+ end
164
+ formats ||= []
165
+ formats.delete('html') if formats.include?('html_fragment')
166
+
167
+ options['date'] &&= Date.strptime(options['date'], '%Y-%m-%d')
168
+ options['styles'] = styles
169
+ options['outdir'] = output_dir
170
+ options['encoding'] = encoding
171
+
172
+ unless port_arg.nil?
173
+ begin
174
+ options['port'] = Integer(port_arg)
175
+ rescue ArgumentError
176
+ warn "Error: invalid port number: '#{port_arg}'"
177
+ exit 1
178
+ end
179
+ end
180
+
181
+ ##
182
+ # Server
183
+
184
+ if server
185
+ require 'ronn/server'
186
+ Ronn::Server.run(ARGV, options)
187
+ exit 0
188
+ end
189
+
190
+ ##
191
+ # Build Pipeline
192
+
193
+ pid = nil
194
+ wr = $stdout
195
+ documents = ARGV.map { |file| Ronn::Document.new(file, options) }
196
+ documents.each do |doc|
197
+ # setup the man pipeline if the --man option was specified
198
+ if view && !build
199
+ rd, wr = IO.pipe
200
+ pid = fork
201
+ if pid
202
+ rd.close
203
+ else
204
+ wr.close
205
+ $stdin.reopen rd
206
+ exec "#{groff} | #{pager}"
207
+ end
208
+ end
209
+
210
+ # write output for each format
211
+ formats.each do |fmt|
212
+ if build
213
+ path = doc.path_for(fmt)
214
+ case fmt
215
+ when 'html'
216
+ warn format('%9s: %-43s%15s', fmt, path, '+' + doc.styles.join(','))
217
+ when 'roff', 'html_fragment', 'markdown'
218
+ warn format('%9s: %-43s', fmt, path)
219
+ end
220
+
221
+ output = doc.convert(fmt)
222
+ File.open(path, 'wb') { |f| f.puts(output) }
223
+
224
+ if fmt == 'roff'
225
+ if view
226
+ system "man #{path}"
227
+ else
228
+ system "#{groff} <#{path} >/dev/null"
229
+ end
230
+ end
231
+ else
232
+ output = doc.convert(fmt)
233
+ wr.puts(output)
234
+ end
235
+ end
236
+
237
+ # wait for children to exit
238
+ if pid
239
+ wr.close
240
+ Process.wait
241
+ end
242
+ end
243
+
244
+ # Write index.txt files
245
+
246
+ if write_index
247
+ indexes = documents.map(&:index).uniq
248
+ indexes.each do |index|
249
+ File.open(index.path, 'wb') do |fd|
250
+ fd.puts(index.to_text)
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,32 @@
1
+ # Bash completion script for ronn(1) from nRonn
2
+
3
+ _ronn()
4
+ {
5
+ local cur prev words cword
6
+ _init_completion -n = || return
7
+
8
+ COMREPLY=()
9
+ cur=${COMP_WORDS[COMP_CWORD]}
10
+
11
+ case "$prev" in
12
+ --help|--version|-!(-*)'?')
13
+ return
14
+ ;;
15
+ -o|--output-dir|-!(-*)e)
16
+ _filedir -d
17
+ return
18
+ ;;
19
+ esac
20
+
21
+ if [[ "$cur" == -* ]]; then
22
+ COMREPLY=( $( compgen -W '--pipe -m --man -S --server --port -o --output-dir -r --roff -5 --html -f --fragment --markdown --date --manual --organization -w --warnings -W --version --help'))
23
+ return
24
+ fi
25
+
26
+ _filedir
27
+
28
+ return 0
29
+ } &&
30
+ complete -F _ronn ronn
31
+
32
+ # ex: filetype=sh
@@ -0,0 +1,24 @@
1
+ #compdef ronn
2
+
3
+ # Zsh completion definitions for ronn, from nRonn
4
+
5
+ _arguments -C -s -S \
6
+ '(--pipe)--pipe[write to standard output instead of generating files]' \
7
+ '(-m --man)'{-m,--man}'[show manual like with man]' \
8
+ '(-S --server)'{-S,--server}'[serve <file>s at http://localhost:1207/]' \
9
+ '(--port)--port[run server at specified port instead of 1207]:Port Number' \
10
+ '(-o --output-dir)'{-o,--output-dir}'[write generated files to specified directory]:Output Directory:_dirs' \
11
+ '(-r --roff)'{-r,--roff}'[generate roff output]' \
12
+ '(-5 --html)'{-5,--html}'[generate entire HTML page with layout]' \
13
+ '(-f --fragment)'{-f,--fragment}'[generate HTML fragment]' \
14
+ '(--markdown)--markdown[generate post-processed markdown output]' \
15
+ '(--date)--date[published date in YYYY-MM-DD format]:Date' \
16
+ '(--manual)--manual[name of the manual]:Manual Name' \
17
+ '(--organization)--organization[publishing group or individual]:Organization Name' \
18
+ '(-w --warnings)'{-w,--warnings}'[show troff warnings on stderr]' \
19
+ '(-W)-W[disable previously enabled troff warnings]' \
20
+ '(--version)--version[show ronn version and exit]' \
21
+ '(--help)--help[show help message and exit]' \
22
+ '*:input files:_files' \
23
+ && ret=0
24
+
data/config.ru ADDED
@@ -0,0 +1,15 @@
1
+ #\ -p 1207
2
+ $LOAD_PATH << File.expand_path('lib', __dir__)
3
+
4
+ require 'ronn'
5
+ require 'ronn/server'
6
+
7
+ # use Rack::Lint
8
+
9
+ options = {
10
+ styles: %w[man toc],
11
+ organization: "Ronn v#{Ronn::VERSION}"
12
+ }
13
+ files = Dir['man/*.ronn'] + Dir['test/*.ronn']
14
+
15
+ run Ronn::Server.new(files, options)