binman 3.2.1 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.markdown +15 -4
- data/{HISTORY.markdown → VERSION.markdown} +16 -0
- data/bin/binman +3 -3
- data/bin/binman-rake +62 -0
- data/binman.gemspec +5 -1
- data/lib/binman.rb +19 -6
- data/lib/binman/rakefile.rb +0 -2
- data/lib/binman/version.rb +1 -1
- data/man/index.html +11 -0
- data/man/man0/README.html +198 -0
- data/man/man0/README.markdown +254 -0
- data/man/man0/VERSION.html +157 -0
- data/man/man0/VERSION.markdown +199 -0
- data/man/man1/binman-rake.1 +57 -0
- data/man/man1/binman-rake.1.html +21 -0
- data/man/man1/binman.1 +3 -3
- data/man/man1/binman.1.html +51 -0
- data/man/style.css +57 -0
- metadata +43 -24
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 59dacb035f95229d4261bc1ede0d49c5351d2bfd
|
4
|
+
data.tar.gz: 3d08a026878970843143de1234a6f9274b94c166
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b4687dde4ceb788cdb51a298d0e10a4798904467d7aac99531401f327e7e4c02d7c873503f81a63ee8310b5fc80f7a2cd95b901b6f06e762fcd1e47926a23089
|
7
|
+
data.tar.gz: aa1b36901f76a242909f99595eaee06f4b63897cf6197c9b6b8e9d9d6b7b3b6d7780cfe671f7e81b380004a248486ef15661545368df46b3e051b868ef8fbae0
|
data/README.markdown
CHANGED
@@ -47,6 +47,8 @@ If you also want to build your own manual pages:
|
|
47
47
|
|
48
48
|
### At the command line
|
49
49
|
|
50
|
+
See binman(1) manual:
|
51
|
+
|
50
52
|
binman --help
|
51
53
|
|
52
54
|
### Inside a Ruby script
|
@@ -210,12 +212,21 @@ You can also write the manual as a multi-line Ruby comment inside an `if 0`:
|
|
210
212
|
|
211
213
|
## Packaging
|
212
214
|
|
213
|
-
###
|
215
|
+
### Building man pages
|
216
|
+
|
217
|
+
#### At the command line
|
218
|
+
|
219
|
+
See binman-rake(1) manual:
|
220
|
+
|
221
|
+
binman-rake --help
|
222
|
+
|
223
|
+
#### Inside a Ruby script
|
214
224
|
|
215
|
-
Add
|
225
|
+
Add this snippet to your gemspec file:
|
216
226
|
|
217
|
-
s.files += Dir['man/man?/*.?']
|
218
|
-
s.
|
227
|
+
s.files += Dir['man/man?/*.?'] # UNIX man pages
|
228
|
+
s.files += Dir['man/**/*.{html,css,js}'] # HTML man pages
|
229
|
+
s.add_development_dependency 'md2man', '~> 2.0'
|
219
230
|
|
220
231
|
Add the following line to your Rakefile:
|
221
232
|
|
@@ -1,3 +1,19 @@
|
|
1
|
+
## Version 3.3.0 (2013-05-08)
|
2
|
+
|
3
|
+
Minor:
|
4
|
+
|
5
|
+
* Add binman-rake(1) script to provide access to `binman/rakefile` tasks.
|
6
|
+
|
7
|
+
* Always try showing HTML manual page in web browser from `BinMan.show()`.
|
8
|
+
|
9
|
+
Other:
|
10
|
+
|
11
|
+
* Upgrade to md2man 2.0.0.
|
12
|
+
|
13
|
+
* Rename HISTORY to VERSION so it sorts after README.
|
14
|
+
|
15
|
+
* Add man/man0/ subdir containing README and VERSION.
|
16
|
+
|
1
17
|
## Version 3.2.1 (2013-05-04)
|
2
18
|
|
3
19
|
Patch:
|
data/bin/binman
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
=begin =======================================================================
|
3
3
|
|
4
|
-
# BINMAN 1 2013-05-
|
4
|
+
# BINMAN 1 2013-05-08 3.3.0
|
5
5
|
|
6
6
|
## NAME
|
7
7
|
|
@@ -55,8 +55,8 @@ The following [Redcarpet] extensions are enabled while processing markdown(7):
|
|
55
55
|
* autolink
|
56
56
|
* superscript
|
57
57
|
* strikethrough
|
58
|
-
*
|
59
|
-
*
|
58
|
+
* no\_intra\_emphasis
|
59
|
+
* fenced\_code\_blocks
|
60
60
|
|
61
61
|
## OPTIONS
|
62
62
|
|
data/bin/binman-rake
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
=begin =======================================================================
|
3
|
+
|
4
|
+
# BINMAN-RAKE 1 2013-05-08 3.3.0
|
5
|
+
|
6
|
+
## NAME
|
7
|
+
|
8
|
+
binman-rake - run rake(1) tasks from binman(1)
|
9
|
+
|
10
|
+
## SYNOPSIS
|
11
|
+
|
12
|
+
`binman-rake` [*OPTION*]... [*TASK*]...
|
13
|
+
|
14
|
+
## DESCRIPTION
|
15
|
+
|
16
|
+
This program lets you run rake(1) tasks provided by binman(1) without having
|
17
|
+
to create a special file named `Rakefile` that contains the following snippet:
|
18
|
+
|
19
|
+
require 'binman/rakefile'
|
20
|
+
|
21
|
+
If no *TASK* is specified, then the `binman` task is run by default.
|
22
|
+
|
23
|
+
## TASKS
|
24
|
+
|
25
|
+
`binman`
|
26
|
+
Runs the `binman:man` and `binman:web` tasks, in that order.
|
27
|
+
|
28
|
+
`binman:man`
|
29
|
+
Builds UNIX manual pages from scripts found in your `bin/` directory.
|
30
|
+
It also runs the `md2man:man` task, provided by md2man-rake(1), which
|
31
|
+
builds UNIX manual pages from `*.markdown`, `*.mkd`, and `*.md` files
|
32
|
+
found in or beneath the `man/` subdirectory in your working directory.
|
33
|
+
|
34
|
+
`binman:web`
|
35
|
+
Builds HTML manual pages from scripts found in your `bin/` directory.
|
36
|
+
It also runs the `md2man:web` task, provided by md2man-rake(1), which
|
37
|
+
builds HTML manual pages from `*.markdown`, `*.mkd`, and `*.md` files
|
38
|
+
found in or beneath the `man/` subdirectory in your working directory.
|
39
|
+
|
40
|
+
## OPTIONS
|
41
|
+
|
42
|
+
`-h`, `--help`
|
43
|
+
Show this help manual.
|
44
|
+
|
45
|
+
Run `rake --help` to see more options.
|
46
|
+
|
47
|
+
## SEE ALSO
|
48
|
+
|
49
|
+
rake(1), binman(1), md2man-rake(1)
|
50
|
+
|
51
|
+
=end =========================================================================
|
52
|
+
|
53
|
+
require 'binman'
|
54
|
+
BinMan.help
|
55
|
+
|
56
|
+
require 'rake'
|
57
|
+
Rake.application.init File.basename(__FILE__)
|
58
|
+
|
59
|
+
require 'binman/rakefile'
|
60
|
+
task :default => :binman
|
61
|
+
|
62
|
+
Rake.application.top_level
|
data/binman.gemspec
CHANGED
@@ -16,6 +16,10 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
17
|
s.require_paths = ['lib']
|
18
18
|
|
19
|
-
s.
|
19
|
+
s.files += Dir['man/man?/*.?'] # UNIX man pages
|
20
|
+
s.files += Dir['man/**/*.{html,css,js}'] # HTML man pages
|
21
|
+
s.add_development_dependency 'md2man', '~> 2.0'
|
22
|
+
|
23
|
+
s.add_dependency 'opener', '>= 0.1.0', '< 1'
|
20
24
|
s.add_development_dependency 'rake', '>= 0.9.2.2', '< 1'
|
21
25
|
end
|
data/lib/binman.rb
CHANGED
@@ -31,10 +31,10 @@ module BinMan
|
|
31
31
|
|
32
32
|
# Converts given markdown(7) source into roff(7).
|
33
33
|
def conv source=nil
|
34
|
-
require 'md2man'
|
35
|
-
Md2Man::ENGINE.render(read(source))
|
34
|
+
require 'md2man/roff/engine'
|
35
|
+
Md2Man::Roff::ENGINE.render(read(source))
|
36
36
|
rescue LoadError
|
37
|
-
raise 'Run `gem install md2man
|
37
|
+
raise 'Run `gem install md2man --version "~> 2.0"` to use BinMan::conv().'
|
38
38
|
end
|
39
39
|
|
40
40
|
# Extracts leading comment header content from given
|
@@ -47,10 +47,23 @@ module BinMan
|
|
47
47
|
# possible, else falls back to showing leading comment header as-is.
|
48
48
|
def show source=nil
|
49
49
|
# try showing existing man page files for given source
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
if file = find(source) and File.exist? file
|
51
|
+
man_page = File.basename(file)
|
52
|
+
man_path = File.expand_path('../../man', file)
|
53
53
|
|
54
|
+
# try showing HTML manual page in a web browser in background
|
55
|
+
require 'opener'
|
56
|
+
Dir["#{man_path}/**/#{man_page}.*.html"].each do |man_html|
|
57
|
+
# close streams to avoid interference with man(1) reader below
|
58
|
+
Opener.spawn man_html, 0 => :close, 1 => :close, 2 => :close
|
59
|
+
end
|
60
|
+
|
61
|
+
# try showing roff manual page in man(1) reader in foreground;
|
62
|
+
# close STDERR to avoid interference with the fall back below
|
63
|
+
return if system 'man', '-M', man_path, '-a', man_page, 2 => :close
|
64
|
+
end
|
65
|
+
|
66
|
+
# fall back to showing leading comment header as-is
|
54
67
|
header = load(source)
|
55
68
|
|
56
69
|
begin
|
data/lib/binman/rakefile.rb
CHANGED
@@ -26,7 +26,6 @@ end
|
|
26
26
|
desc 'Build UNIX manual pages for bin/ scripts.'
|
27
27
|
task 'binman:man' => mkds do
|
28
28
|
#-----------------------------------------------------------------------------
|
29
|
-
require 'md2man'
|
30
29
|
load 'md2man/rakefile.rb'
|
31
30
|
Rake::Task['md2man:man'].invoke
|
32
31
|
end
|
@@ -35,7 +34,6 @@ end
|
|
35
34
|
desc 'Build HTML manual pages for bin/ scripts.'
|
36
35
|
task 'binman:web' => mkds do
|
37
36
|
#-----------------------------------------------------------------------------
|
38
|
-
require 'md2man'
|
39
37
|
load 'md2man/rakefile.rb'
|
40
38
|
Rake::Task['md2man:web'].invoke
|
41
39
|
end
|
data/lib/binman/version.rb
CHANGED
data/man/index.html
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<meta name="generator" content="md2man 2.0.0 https://github.com/sunaku/md2man" />
|
6
|
+
<title>man/index</title>
|
7
|
+
<link rel="stylesheet" href="style.css"/>
|
8
|
+
<!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
|
9
|
+
</head>
|
10
|
+
<body><div class="container-fluid"><h2 id="man0">man0</h2><dl class="dl-horizontal"><dt><a href="man0/README.html">README</a></dt><dd></dd></dl><dl class="dl-horizontal"><dt><a href="man0/VERSION.html">VERSION</a></dt><dd></dd></dl><h2 id="man1">man1</h2><dl class="dl-horizontal"><dt><a href="man1/binman-rake.1.html">binman-rake(1)</a></dt><dd>run rake(1) tasks from binman(1)</dd></dl><dl class="dl-horizontal"><dt><a href="man1/binman.1.html">binman(1)</a></dt><dd>man pages for bin scripts</dd></dl></div></body>
|
11
|
+
</html>
|
@@ -0,0 +1,198 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<meta name="generator" content="md2man 2.0.0 https://github.com/sunaku/md2man" />
|
6
|
+
<title>README</title>
|
7
|
+
<link rel="stylesheet" href="../style.css"/>
|
8
|
+
<!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
|
9
|
+
</head>
|
10
|
+
<body><div class="navbar"><div class="navbar-inner"><span class="brand"><a href="../index.html#man0">man0</a>/README</span></div></div><div class="container-fluid"><h1 id="binman-man-pages-for-bin-scripts">binman - man pages for bin scripts</h1><p><a href="https://github.com/sunaku/binman">binman</a> produces UNIX manual pages for executable scripts using <a href="https://github.com/sunaku/md2man">md2man</a>.</p><h2 id="Features">Features</h2>
|
11
|
+
<ul>
|
12
|
+
<li><p>Supports any scripting language that has multi-line
|
13
|
+
comments or uses <code>#</code> for single-line comments: Ruby,
|
14
|
+
Perl, Python, Node.js, Tcl, AWK, UNIX shell, and more!</p></li>
|
15
|
+
<li><p>Provides a Ruby library and a command-line client too.</p></li>
|
16
|
+
<li><p>Individual extraction, conversion, and display commands.</p></li>
|
17
|
+
<li><p>Implemented in roughly 100 lines of pure Ruby code! :-)</p></li>
|
18
|
+
</ul>
|
19
|
+
<h3 id="Demonstration">Demonstration</h3><p><img src="http://ompldr.org/vYm5mcg" alt="Obligatory screen-shot of binman(1) in action!"></p><p>Here is <a href="https://raw.github.com/sunaku/binman/master/bin/binman">a complete example in Ruby</a> to help you get started.
|
20
|
+
For examples in other scripting languages, see the "Usage" section below!</p><h2 id="Installation">Installation</h2><p>If you only want to view pre-built manual pages:</p>
|
21
|
+
<pre><code>gem install binman
|
22
|
+
</code></pre>
|
23
|
+
<p>If you also want to build your own manual pages:</p>
|
24
|
+
<pre><code>gem install md2man -v '~> 1.4'
|
25
|
+
</code></pre>
|
26
|
+
<h3 id="Prerequisites">Prerequisites</h3>
|
27
|
+
<ul>
|
28
|
+
<li>Ruby 1.8.7 or 1.9.2 or newer.</li>
|
29
|
+
</ul>
|
30
|
+
<h3 id="Development">Development</h3>
|
31
|
+
<pre><code>git clone git://github.com/sunaku/binman
|
32
|
+
cd binman
|
33
|
+
bundle install
|
34
|
+
bundle exec binman --help # run it directly
|
35
|
+
bundle exec rake --tasks # packaging tasks
|
36
|
+
</code></pre>
|
37
|
+
<h2 id="Usage">Usage</h2><h3 id="At-the-command-line">At the command line</h3><p>See <a class="md2man-xref" href="../man1/binman.1.html">binman(1)</a> manual:</p>
|
38
|
+
<pre><code>binman --help
|
39
|
+
</code></pre>
|
40
|
+
<h3 id="Inside-a-Ruby-script">Inside a Ruby script</h3>
|
41
|
+
<pre><code>#!/usr/bin/env ruby
|
42
|
+
# your program's manual page goes here
|
43
|
+
|
44
|
+
require 'binman'
|
45
|
+
|
46
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
47
|
+
BinMan.help
|
48
|
+
|
49
|
+
# OPTION 2: show manual unconditionally
|
50
|
+
BinMan.show
|
51
|
+
</code></pre>
|
52
|
+
<p>You can also specify your program's source file encoding above the manual:</p>
|
53
|
+
<pre><code>#!/usr/bin/env ruby
|
54
|
+
# -*- coding: utf-8 -*-
|
55
|
+
# your program's manual page goes here
|
56
|
+
</code></pre>
|
57
|
+
<p>You can also write the manual as a multi-line Ruby comment:</p>
|
58
|
+
<pre><code>#!/usr/bin/env ruby
|
59
|
+
=begin
|
60
|
+
your program's manual page goes here
|
61
|
+
=end
|
62
|
+
</code></pre>
|
63
|
+
<p>You can also specify your program's source file encoding above the manual:</p>
|
64
|
+
<pre><code>#!/usr/bin/env ruby
|
65
|
+
# -*- coding: utf-8 -*-
|
66
|
+
=begin
|
67
|
+
your program's manual page goes here
|
68
|
+
=end
|
69
|
+
</code></pre>
|
70
|
+
<p>See the <a href="http://rubydoc.info/gems/binman/frames">API documentation</a> for even more possibilities!</p><h3 id="Inside-a-shell-script">Inside a shell script</h3>
|
71
|
+
<pre><code>#!/usr/bin/sh
|
72
|
+
# your program's manual page goes here
|
73
|
+
|
74
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
75
|
+
binman help "$0" "$@" && exit
|
76
|
+
|
77
|
+
# OPTION 2: show manual unconditionally
|
78
|
+
binman show "$0"
|
79
|
+
</code></pre>
|
80
|
+
<h3 id="Inside-a-Perl-script">Inside a Perl script</h3>
|
81
|
+
<pre><code>#!/usr/bin/env perl
|
82
|
+
# your program's manual page goes here
|
83
|
+
|
84
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
85
|
+
system('binman', 'help', __FILE__, @ARGV) == 0 and exit;
|
86
|
+
|
87
|
+
# OPTION 2: show manual unconditionally
|
88
|
+
system('binman', 'show', __FILE__);
|
89
|
+
</code></pre>
|
90
|
+
<p>You can also write the manual as a multi-line Ruby comment after <code>__END__</code>:</p>
|
91
|
+
<pre><code>#!/usr/bin/env perl
|
92
|
+
print "your program's code goes here";
|
93
|
+
__END__
|
94
|
+
=begin
|
95
|
+
your program's manual page goes here
|
96
|
+
=end
|
97
|
+
</code></pre>
|
98
|
+
<h3 id="Inside-a-Python-script">Inside a Python script</h3>
|
99
|
+
<pre><code>#!/usr/bin/env python
|
100
|
+
# your program's manual page goes here
|
101
|
+
|
102
|
+
import sys, subprocess
|
103
|
+
|
104
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
105
|
+
subprocess.call(['binman', 'help', __file__] + sys.argv) == 0 and sys.exit()
|
106
|
+
|
107
|
+
# OPTION 2: show manual unconditionally
|
108
|
+
subprocess.call(['binman', 'show', __file__])
|
109
|
+
</code></pre>
|
110
|
+
<p>You can also specify your program's source file encoding above the manual:</p>
|
111
|
+
<pre><code>#!/usr/bin/env python
|
112
|
+
# -*- coding: utf-8 -*-
|
113
|
+
# your program's manual page goes here
|
114
|
+
</code></pre>
|
115
|
+
<p>You can also write the manual as a multi-line Ruby comment inside a docstring:</p>
|
116
|
+
<pre><code>#!/usr/bin/env python
|
117
|
+
"""
|
118
|
+
=begin
|
119
|
+
your program's manual page goes here
|
120
|
+
=end
|
121
|
+
"""
|
122
|
+
</code></pre>
|
123
|
+
<p>You can also specify your program's source file encoding above the manual:</p>
|
124
|
+
<pre><code>#!/usr/bin/env python
|
125
|
+
# -*- coding: utf-8 -*-
|
126
|
+
"""
|
127
|
+
=begin
|
128
|
+
your program's manual page goes here
|
129
|
+
=end
|
130
|
+
"""
|
131
|
+
</code></pre>
|
132
|
+
<h3 id="Inside-an-AWK-script">Inside an AWK script</h3><p>The technique for determining current AWK script file name <a href="http://www.mombu.com/programming/programming/t-the-name-of-script-itself-2040784-print.html">comes from here</a>.</p>
|
133
|
+
<pre><code>#!/usr/bin/awk -f
|
134
|
+
# your program's manual page goes here
|
135
|
+
|
136
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
137
|
+
BEGIN {getline c <"/proc/self/cmdline"; sub(".*-f\0"," ",c); gsub("\0"," ",c);
|
138
|
+
if(system("binman help" c) == 0){ exit }}
|
139
|
+
|
140
|
+
# OPTION 2: show manual unconditionally
|
141
|
+
BEGIN {getline c <"/proc/self/cmdline"; sub(".*-f\0"," ",c); sub("\0.*","",c);
|
142
|
+
system("binman show" c)}
|
143
|
+
</code></pre>
|
144
|
+
<h3 id="Inside-a-Tcl-script">Inside a Tcl script</h3>
|
145
|
+
<pre><code>#!/usr/bin/env tclsh
|
146
|
+
# your program's manual page goes here
|
147
|
+
|
148
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
149
|
+
if {![catch {exec -- >/dev/tty binman help $argv0 {*}$argv}]} {exit}
|
150
|
+
|
151
|
+
# OPTION 2: show manual unconditionally
|
152
|
+
exec >/dev/tty binman show $argv0
|
153
|
+
</code></pre>
|
154
|
+
<p>You can also write the manual as a multi-line Ruby comment inside an <code>if 0</code>:</p>
|
155
|
+
<pre><code>#!/usr/bin/env tclsh
|
156
|
+
if 0 {
|
157
|
+
=begin
|
158
|
+
your program's manual page goes here
|
159
|
+
=end
|
160
|
+
}
|
161
|
+
</code></pre>
|
162
|
+
<h3 id="Inside-a-Node-js-script">Inside a Node.js script</h3>
|
163
|
+
<pre><code>/*
|
164
|
+
=begin
|
165
|
+
your program's manual page goes here
|
166
|
+
=end
|
167
|
+
*/
|
168
|
+
|
169
|
+
var exec = require('child_process').exec;
|
170
|
+
|
171
|
+
// OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
172
|
+
exec(['>/dev/tty', 'binman', 'help', __filename].concat(process.argv).
|
173
|
+
join(' '), <a class="md2man-xref">function(error)</a>{ if (error === null){ process.exit(); } });
|
174
|
+
|
175
|
+
// OPTION 2: show manual unconditionally
|
176
|
+
exec(['>/dev/tty', 'binman', 'show', __filename].join(' '));
|
177
|
+
</code></pre>
|
178
|
+
<h2 id="Packaging">Packaging</h2><h3 id="Building-man-pages">Building man pages</h3><h4 id="At-the-command-line">At the command line</h4><p>See <a class="md2man-xref" href="../man1/binman-rake.1.html">binman-rake(1)</a> manual:</p>
|
179
|
+
<pre><code>binman-rake --help
|
180
|
+
</code></pre>
|
181
|
+
<h4 id="Inside-a-Ruby-script">Inside a Ruby script</h4><p>Add this snippet to your gemspec file:</p>
|
182
|
+
<pre><code>s.files += Dir['man/man?/*.?'] # UNIX man pages
|
183
|
+
s.files += Dir['man/**/*.{html,css,js}'] # HTML man pages
|
184
|
+
s.add_development_dependency 'md2man', '~> 2.0'
|
185
|
+
</code></pre>
|
186
|
+
<p>Add the following line to your Rakefile:</p>
|
187
|
+
<pre><code>require 'binman/rakefile'
|
188
|
+
</code></pre>
|
189
|
+
<p>You now have a <code>rake binman</code> task that pre-builds UNIX manual page files for
|
190
|
+
your <code>bin/</code> scripts into a <code>man/</code> directory so that your end-users do not need
|
191
|
+
<a href="https://github.com/sunaku/md2man">md2man</a> installed in order to view the manual pages you've embedded therein!
|
192
|
+
There are also sub-tasks to build manual pages individually as <a href="http://troff.org">roff</a> or HTML.</p><p>If you're using Bundler, this task also hooks into its gem packaging tasks and
|
193
|
+
ensures that your UNIX manual pages are pre-built and packaged into your gem:</p>
|
194
|
+
<pre><code>bundle exec rake build
|
195
|
+
gem spec pkg/*.gem | fgrep man/man
|
196
|
+
</code></pre>
|
197
|
+
<h2 id="License">License</h2><p>Released under the ISC license. See the LICENSE file for details.</p></div></body>
|
198
|
+
</html>
|
@@ -0,0 +1,254 @@
|
|
1
|
+
# binman - man pages for bin scripts
|
2
|
+
|
3
|
+
[binman] produces UNIX manual pages for executable scripts using [md2man].
|
4
|
+
|
5
|
+
## Features
|
6
|
+
|
7
|
+
* Supports any scripting language that has multi-line
|
8
|
+
comments or uses `#` for single-line comments: Ruby,
|
9
|
+
Perl, Python, Node.js, Tcl, AWK, UNIX shell, and more!
|
10
|
+
|
11
|
+
* Provides a Ruby library and a command-line client too.
|
12
|
+
|
13
|
+
* Individual extraction, conversion, and display commands.
|
14
|
+
|
15
|
+
* Implemented in roughly 100 lines of pure Ruby code! :-)
|
16
|
+
|
17
|
+
### Demonstration
|
18
|
+
|
19
|
+
![Obligatory screen-shot of binman(1) in action!](http://ompldr.org/vYm5mcg)
|
20
|
+
|
21
|
+
Here is [a complete example in Ruby][binman-bin] to help you get started.
|
22
|
+
For examples in other scripting languages, see the "Usage" section below!
|
23
|
+
|
24
|
+
## Installation
|
25
|
+
|
26
|
+
If you only want to view pre-built manual pages:
|
27
|
+
|
28
|
+
gem install binman
|
29
|
+
|
30
|
+
If you also want to build your own manual pages:
|
31
|
+
|
32
|
+
gem install md2man -v '~> 1.4'
|
33
|
+
|
34
|
+
### Prerequisites
|
35
|
+
|
36
|
+
* Ruby 1.8.7 or 1.9.2 or newer.
|
37
|
+
|
38
|
+
### Development
|
39
|
+
|
40
|
+
git clone git://github.com/sunaku/binman
|
41
|
+
cd binman
|
42
|
+
bundle install
|
43
|
+
bundle exec binman --help # run it directly
|
44
|
+
bundle exec rake --tasks # packaging tasks
|
45
|
+
|
46
|
+
## Usage
|
47
|
+
|
48
|
+
### At the command line
|
49
|
+
|
50
|
+
See binman(1) manual:
|
51
|
+
|
52
|
+
binman --help
|
53
|
+
|
54
|
+
### Inside a Ruby script
|
55
|
+
|
56
|
+
#!/usr/bin/env ruby
|
57
|
+
# your program's manual page goes here
|
58
|
+
|
59
|
+
require 'binman'
|
60
|
+
|
61
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
62
|
+
BinMan.help
|
63
|
+
|
64
|
+
# OPTION 2: show manual unconditionally
|
65
|
+
BinMan.show
|
66
|
+
|
67
|
+
You can also specify your program's source file encoding above the manual:
|
68
|
+
|
69
|
+
#!/usr/bin/env ruby
|
70
|
+
# -*- coding: utf-8 -*-
|
71
|
+
# your program's manual page goes here
|
72
|
+
|
73
|
+
You can also write the manual as a multi-line Ruby comment:
|
74
|
+
|
75
|
+
#!/usr/bin/env ruby
|
76
|
+
=begin
|
77
|
+
your program's manual page goes here
|
78
|
+
=end
|
79
|
+
|
80
|
+
You can also specify your program's source file encoding above the manual:
|
81
|
+
|
82
|
+
#!/usr/bin/env ruby
|
83
|
+
# -*- coding: utf-8 -*-
|
84
|
+
=begin
|
85
|
+
your program's manual page goes here
|
86
|
+
=end
|
87
|
+
|
88
|
+
See the [API documentation][binman-api] for even more possibilities!
|
89
|
+
|
90
|
+
### Inside a shell script
|
91
|
+
|
92
|
+
#!/usr/bin/sh
|
93
|
+
# your program's manual page goes here
|
94
|
+
|
95
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
96
|
+
binman help "$0" "$@" && exit
|
97
|
+
|
98
|
+
# OPTION 2: show manual unconditionally
|
99
|
+
binman show "$0"
|
100
|
+
|
101
|
+
### Inside a Perl script
|
102
|
+
|
103
|
+
#!/usr/bin/env perl
|
104
|
+
# your program's manual page goes here
|
105
|
+
|
106
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
107
|
+
system('binman', 'help', __FILE__, @ARGV) == 0 and exit;
|
108
|
+
|
109
|
+
# OPTION 2: show manual unconditionally
|
110
|
+
system('binman', 'show', __FILE__);
|
111
|
+
|
112
|
+
You can also write the manual as a multi-line Ruby comment after `__END__`:
|
113
|
+
|
114
|
+
#!/usr/bin/env perl
|
115
|
+
print "your program's code goes here";
|
116
|
+
__END__
|
117
|
+
=begin
|
118
|
+
your program's manual page goes here
|
119
|
+
=end
|
120
|
+
|
121
|
+
### Inside a Python script
|
122
|
+
|
123
|
+
#!/usr/bin/env python
|
124
|
+
# your program's manual page goes here
|
125
|
+
|
126
|
+
import sys, subprocess
|
127
|
+
|
128
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
129
|
+
subprocess.call(['binman', 'help', __file__] + sys.argv) == 0 and sys.exit()
|
130
|
+
|
131
|
+
# OPTION 2: show manual unconditionally
|
132
|
+
subprocess.call(['binman', 'show', __file__])
|
133
|
+
|
134
|
+
You can also specify your program's source file encoding above the manual:
|
135
|
+
|
136
|
+
#!/usr/bin/env python
|
137
|
+
# -*- coding: utf-8 -*-
|
138
|
+
# your program's manual page goes here
|
139
|
+
|
140
|
+
You can also write the manual as a multi-line Ruby comment inside a docstring:
|
141
|
+
|
142
|
+
#!/usr/bin/env python
|
143
|
+
"""
|
144
|
+
=begin
|
145
|
+
your program's manual page goes here
|
146
|
+
=end
|
147
|
+
"""
|
148
|
+
|
149
|
+
You can also specify your program's source file encoding above the manual:
|
150
|
+
|
151
|
+
#!/usr/bin/env python
|
152
|
+
# -*- coding: utf-8 -*-
|
153
|
+
"""
|
154
|
+
=begin
|
155
|
+
your program's manual page goes here
|
156
|
+
=end
|
157
|
+
"""
|
158
|
+
|
159
|
+
### Inside an AWK script
|
160
|
+
|
161
|
+
The technique for determining current AWK script file name [comes from here](
|
162
|
+
http://www.mombu.com/programming/programming/t-the-name-of-script-itself-2040784-print.html
|
163
|
+
).
|
164
|
+
|
165
|
+
#!/usr/bin/awk -f
|
166
|
+
# your program's manual page goes here
|
167
|
+
|
168
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
169
|
+
BEGIN {getline c <"/proc/self/cmdline"; sub(".*-f\0"," ",c); gsub("\0"," ",c);
|
170
|
+
if(system("binman help" c) == 0){ exit }}
|
171
|
+
|
172
|
+
# OPTION 2: show manual unconditionally
|
173
|
+
BEGIN {getline c <"/proc/self/cmdline"; sub(".*-f\0"," ",c); sub("\0.*","",c);
|
174
|
+
system("binman show" c)}
|
175
|
+
|
176
|
+
### Inside a Tcl script
|
177
|
+
|
178
|
+
#!/usr/bin/env tclsh
|
179
|
+
# your program's manual page goes here
|
180
|
+
|
181
|
+
# OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
182
|
+
if {![catch {exec -- >/dev/tty binman help $argv0 {*}$argv}]} {exit}
|
183
|
+
|
184
|
+
# OPTION 2: show manual unconditionally
|
185
|
+
exec >/dev/tty binman show $argv0
|
186
|
+
|
187
|
+
You can also write the manual as a multi-line Ruby comment inside an `if 0`:
|
188
|
+
|
189
|
+
#!/usr/bin/env tclsh
|
190
|
+
if 0 {
|
191
|
+
=begin
|
192
|
+
your program's manual page goes here
|
193
|
+
=end
|
194
|
+
}
|
195
|
+
|
196
|
+
### Inside a Node.js script
|
197
|
+
|
198
|
+
/*
|
199
|
+
=begin
|
200
|
+
your program's manual page goes here
|
201
|
+
=end
|
202
|
+
*/
|
203
|
+
|
204
|
+
var exec = require('child_process').exec;
|
205
|
+
|
206
|
+
// OPTION 1: show manual and exit if ARGV has -h or --help except after --
|
207
|
+
exec(['>/dev/tty', 'binman', 'help', __filename].concat(process.argv).
|
208
|
+
join(' '), function(error){ if (error === null){ process.exit(); } });
|
209
|
+
|
210
|
+
// OPTION 2: show manual unconditionally
|
211
|
+
exec(['>/dev/tty', 'binman', 'show', __filename].join(' '));
|
212
|
+
|
213
|
+
## Packaging
|
214
|
+
|
215
|
+
### Building man pages
|
216
|
+
|
217
|
+
#### At the command line
|
218
|
+
|
219
|
+
See binman-rake(1) manual:
|
220
|
+
|
221
|
+
binman-rake --help
|
222
|
+
|
223
|
+
#### Inside a Ruby script
|
224
|
+
|
225
|
+
Add this snippet to your gemspec file:
|
226
|
+
|
227
|
+
s.files += Dir['man/man?/*.?'] # UNIX man pages
|
228
|
+
s.files += Dir['man/**/*.{html,css,js}'] # HTML man pages
|
229
|
+
s.add_development_dependency 'md2man', '~> 2.0'
|
230
|
+
|
231
|
+
Add the following line to your Rakefile:
|
232
|
+
|
233
|
+
require 'binman/rakefile'
|
234
|
+
|
235
|
+
You now have a `rake binman` task that pre-builds UNIX manual page files for
|
236
|
+
your `bin/` scripts into a `man/` directory so that your end-users do not need
|
237
|
+
[md2man] installed in order to view the manual pages you've embedded therein!
|
238
|
+
There are also sub-tasks to build manual pages individually as [roff] or HTML.
|
239
|
+
|
240
|
+
If you're using Bundler, this task also hooks into its gem packaging tasks and
|
241
|
+
ensures that your UNIX manual pages are pre-built and packaged into your gem:
|
242
|
+
|
243
|
+
bundle exec rake build
|
244
|
+
gem spec pkg/*.gem | fgrep man/man
|
245
|
+
|
246
|
+
## License
|
247
|
+
|
248
|
+
Released under the ISC license. See the LICENSE file for details.
|
249
|
+
|
250
|
+
[roff]: http://troff.org
|
251
|
+
[binman]: https://github.com/sunaku/binman
|
252
|
+
[binman-api]: http://rubydoc.info/gems/binman/frames
|
253
|
+
[binman-bin]: https://raw.github.com/sunaku/binman/master/bin/binman
|
254
|
+
[md2man]: https://github.com/sunaku/md2man
|