ron 0.1
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.
- data/COPYING +21 -0
- data/README +145 -0
- data/Rakefile +73 -0
- data/bin/ron +94 -0
- data/lib/ron.rb +15 -0
- data/lib/ron/document.rb +117 -0
- data/lib/ron/layout.html +39 -0
- data/lib/ron/roff.rb +147 -0
- data/man/markdown.5.ron +881 -0
- data/man/ron.1.ron +136 -0
- data/man/ron.5.ron +150 -0
- data/ron.gemspec +48 -0
- data/test/document_test.rb +35 -0
- data/test/ron_test.rb +29 -0
- data/test/simple.ron +2 -0
- metadata +103 -0
data/man/ron.1.ron
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
ron(1) -- the opposite of roff
|
2
|
+
==============================
|
3
|
+
|
4
|
+
## SYNOPSIS
|
5
|
+
|
6
|
+
`ron` [ _OPTIONS_ ]
|
7
|
+
`ron` --build _FILE_ ...
|
8
|
+
`ron` --install _FILE_ ...
|
9
|
+
`ron` --man _FILE_
|
10
|
+
|
11
|
+
## DESCRIPTION
|
12
|
+
|
13
|
+
`Ron` is a humane text format and toolchain for authoring man pages
|
14
|
+
(and things that appear as man pages from a distance). Use it to build
|
15
|
+
and install standard UNIX / roff(7) formatted man pages and to
|
16
|
+
generate nicely formatted HTML manual pages.
|
17
|
+
|
18
|
+
The `ron` command converts one or more named input <em>FILE</em>s
|
19
|
+
(or standard input when no files are named or the file name `-`
|
20
|
+
is given) from humane man page markup to one or more destination
|
21
|
+
output formats. If no output format is selected explicitly, `ron`
|
22
|
+
writes output in roff format.
|
23
|
+
|
24
|
+
## FILES
|
25
|
+
|
26
|
+
The `ron` command expects input to be formatted as ron(5) text.
|
27
|
+
Source files are typically named '_name_._section_.ron' (e.g.,
|
28
|
+
`hello.1.ron`). The _name_ and _section_ should match the name
|
29
|
+
and section defined in _FILE_'s heading.
|
30
|
+
|
31
|
+
When building roff and/or HTML output files with the `--build`
|
32
|
+
argument, destination filenames are determined by taking the basename
|
33
|
+
of the input _FILE_ and adding the appropriate file extension (or
|
34
|
+
removing the file extension in the case of roff output).
|
35
|
+
|
36
|
+
For example, the command `ron -b --html --roff hello.1.ron` would
|
37
|
+
generate a `hello.1` file with roff output and a `hello.1.html` file
|
38
|
+
with HTML output.
|
39
|
+
|
40
|
+
## OPTIONS
|
41
|
+
|
42
|
+
`Ron`'s default mode of operation is to read a single document from
|
43
|
+
standard input and to write the generated output to standard output.
|
44
|
+
The following arguments change this behavior:
|
45
|
+
|
46
|
+
* `-b`, `--build`:
|
47
|
+
Write output directly to files instead of standard output. When
|
48
|
+
the `--roff` option is provided, writes roff output to
|
49
|
+
_file_._section_. When the `--html` option is provided, writes
|
50
|
+
output to '_file_._section_.html'.
|
51
|
+
|
52
|
+
* `-i`, `--install`:
|
53
|
+
Install the roff formatted man page to the local system such
|
54
|
+
that it can be displayed by man(1). The `MANHOME`
|
55
|
+
environment variable is used to determine the prefix where
|
56
|
+
man pages should be installed when defined.
|
57
|
+
|
58
|
+
If `MANHOME` is not defined, `ron` installs man pages to
|
59
|
+
_/usr/local/man_.
|
60
|
+
|
61
|
+
* `-m`, `--man`:
|
62
|
+
Display _FILE_ as if man(1) were invoked on the roff output
|
63
|
+
file. This simulates default man behavior by piping the roff
|
64
|
+
output through groff(1) and the paging program specified by the
|
65
|
+
`MANPAGER` environment variable.
|
66
|
+
|
67
|
+
The following options control the output formats generated:
|
68
|
+
|
69
|
+
* `--html`:
|
70
|
+
Generate HTML output.
|
71
|
+
|
72
|
+
* `--roff`:
|
73
|
+
Generate roff output. This is the default behavior when no
|
74
|
+
other format argument is provided.
|
75
|
+
|
76
|
+
## EXAMPLES
|
77
|
+
|
78
|
+
Generate `roff(7)` output on stdout:
|
79
|
+
|
80
|
+
$ ron < hello.1.ron
|
81
|
+
|
82
|
+
Build a roff file based on the input filename:
|
83
|
+
|
84
|
+
$ ron -b hello.1.ron
|
85
|
+
building: hello.1
|
86
|
+
$ man hello.1
|
87
|
+
|
88
|
+
Build and open a standalone HTML file based on the input filename:
|
89
|
+
|
90
|
+
$ ron -b --html test.1.ron
|
91
|
+
$ open test.1.html
|
92
|
+
|
93
|
+
Build roff and HTML versions of all `.ron` files in the current
|
94
|
+
directory:
|
95
|
+
|
96
|
+
$ ron -b --roff --html *.ron
|
97
|
+
building: hello.1
|
98
|
+
building: hello.1.html
|
99
|
+
building: world.1
|
100
|
+
building: world.1.html
|
101
|
+
|
102
|
+
View a ron file in the same way as man(1) without building a roff
|
103
|
+
file:
|
104
|
+
|
105
|
+
$ ron -m hello.1.ron
|
106
|
+
|
107
|
+
Install the roff man page for a ron file:
|
108
|
+
|
109
|
+
$ ron -i hello.1.ron
|
110
|
+
|
111
|
+
## ENVIRONMENT
|
112
|
+
|
113
|
+
* `MANHOME`:
|
114
|
+
Location where roff formatted man pages should be installed.
|
115
|
+
Relevant only when the `--installed` argument is provided.
|
116
|
+
_PATH_ is to the base of a man file hierarchy. e.g.,
|
117
|
+
`/usr/local/share/man`, `/home/rtomayko/man`.
|
118
|
+
|
119
|
+
* `MANPAGER`:
|
120
|
+
The paging program used for man pages. This is typically set
|
121
|
+
to something like 'less -is'.
|
122
|
+
|
123
|
+
* `PAGER`:
|
124
|
+
Used instead of `MANPAGER` when `MANPAGER` is not defined.
|
125
|
+
|
126
|
+
## BUGS
|
127
|
+
|
128
|
+
Ron is written in Ruby.
|
129
|
+
|
130
|
+
## COPYRIGHT
|
131
|
+
|
132
|
+
`ron` is Copyright (C) 2009 Ryan Tomayko <tomayko.com/about>
|
133
|
+
|
134
|
+
## SEE ALSO
|
135
|
+
|
136
|
+
ron(5), markdown(5), manpages(5), man(1), roff(7), groff(1)
|
data/man/ron.5.ron
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
ron(5) -- humane manual page authoring format
|
2
|
+
=============================================
|
3
|
+
|
4
|
+
## SYNOPSIS
|
5
|
+
|
6
|
+
name(1) -- one sentence description
|
7
|
+
===================================
|
8
|
+
|
9
|
+
## SECTION HEADING
|
10
|
+
|
11
|
+
A normal paragraph. This can span multiple lines and is
|
12
|
+
terminated with two or more line endings -- just like
|
13
|
+
Markdown.
|
14
|
+
|
15
|
+
## INLINE MARKUP
|
16
|
+
|
17
|
+
Inline markup should be used for `code` (displayed in
|
18
|
+
boldface) and _variables_ (displayed in underline).
|
19
|
+
|
20
|
+
Manual page references like sh(1), markdown(5), roff(7), etc.
|
21
|
+
are displayed in boldface and hyperlinked in HTML output.
|
22
|
+
|
23
|
+
## DEFINITION LISTS
|
24
|
+
|
25
|
+
Definition lists are used to define arguments, variables,
|
26
|
+
or other terms:
|
27
|
+
|
28
|
+
* `-a`, `--arg1`=[_OPTION_]:
|
29
|
+
One or more paragraphs describing the
|
30
|
+
* `-b`, `--arg2`:
|
31
|
+
Any number of these may be specified and they can be
|
32
|
+
nested.
|
33
|
+
|
34
|
+
## DESCRIPTION
|
35
|
+
|
36
|
+
`Ron` files are simple ascii texts that document things in the
|
37
|
+
style of UNIX man pages but with a syntax and feature-set less
|
38
|
+
insane than that of roff(7). `Ron` files are piped through
|
39
|
+
ron(1) to build and install traditional roff(7) man pages or
|
40
|
+
to generate hyperlinked HTML documentation.
|
41
|
+
|
42
|
+
All `ron` files must conform to a simple subset of markdown(5), a
|
43
|
+
humane text markup designed for writing on the web. It is neither
|
44
|
+
possible nor desirable to express many of roff(7)'s complex
|
45
|
+
typesetting features in `ron`.
|
46
|
+
|
47
|
+
## MANPAGE TITLE
|
48
|
+
|
49
|
+
All man pages have a _name_, belong to a _section_, and have a
|
50
|
+
single sentence _tagline_ (useless but witty, preferably). `Ron`
|
51
|
+
files must begin with a first-level heading that includes all of
|
52
|
+
this information. For example, this very man page begins:
|
53
|
+
|
54
|
+
ron(5) -- humane manual page authoring format
|
55
|
+
=============================================
|
56
|
+
|
57
|
+
Here, we're saying that the man page documents a thing named `ron`
|
58
|
+
in manual section `5` -- the "file formats" section; see
|
59
|
+
manpages(5) for full section list -- and that's quickly
|
60
|
+
described as a "humane manual page authoring format".
|
61
|
+
|
62
|
+
These bits of information are used to fill in the document
|
63
|
+
header, to create the `NAME` section, and also to establish
|
64
|
+
output filenames when processed with ron(1).
|
65
|
+
|
66
|
+
## SECTION HEADINGS
|
67
|
+
|
68
|
+
Man section headings are expressed with markdown level two
|
69
|
+
headings. markdown(5) provides two syntaxes for level two
|
70
|
+
headings. A hash prefix syntax:
|
71
|
+
|
72
|
+
## HEADING TEXT
|
73
|
+
|
74
|
+
Or, a dash underline syntax:
|
75
|
+
|
76
|
+
HEADING TEXT
|
77
|
+
------------
|
78
|
+
|
79
|
+
Section headings should be in all uppercase and may not contain
|
80
|
+
other inline markup.
|
81
|
+
|
82
|
+
Most manual pages include at least one of the `SYNOPSIS`,
|
83
|
+
`DESCRIPTION`, and/or `OPTIONS` sections. Additional sections
|
84
|
+
commonly included are `SYNTAX`, `ENVIRONMENT`, `HISTORY`, `RETURN
|
85
|
+
VALUES`, `BUGS`, `SECURITY CONSIDERATIONS`, `STANDARDS` /
|
86
|
+
`CONFORMING TO`, `AUTHOR`, and `COPYRIGHT`. Finally, most man
|
87
|
+
pages end with a `SEE ALSO` section that references other manual
|
88
|
+
pages and external documents.
|
89
|
+
|
90
|
+
## INLINE MARKUP
|
91
|
+
|
92
|
+
Man pages typically use a limited set of text formatting
|
93
|
+
capabilities. There's basically <b>boldface</b> and
|
94
|
+
<i>italics</i> (often displayed using <u>underline</u>). Ron
|
95
|
+
uses the following bits of markdown(5) to accomplish this:
|
96
|
+
|
97
|
+
* <code>\`backticks\`</code>:
|
98
|
+
Code, flags, commands, and noun-like things; typically
|
99
|
+
displayed in in <b>boldface</b>. Note that all text included
|
100
|
+
within `backticks` is displayed literally; other inline markup
|
101
|
+
is not processed.
|
102
|
+
* `_`_underbars_`_`:
|
103
|
+
User-specified arguments, variables, or user input; typically
|
104
|
+
displayed in <u>underline</u>.
|
105
|
+
* `**double stars**`:
|
106
|
+
Like `backticks` but may contain other inline markup.
|
107
|
+
|
108
|
+
Here is grep(1)'s DESCRIPTION section represented in `ron`:
|
109
|
+
|
110
|
+
`Grep` searches the named input _FILE_ (or standard input if
|
111
|
+
no files are named, or the file name `-` is given) for lines
|
112
|
+
containing a match to the given _PATTERN_. By default, `grep`
|
113
|
+
prints the matching lines.
|
114
|
+
|
115
|
+
## DEFINITION LISTS
|
116
|
+
|
117
|
+
Because definition lists are so often used in manual pages to
|
118
|
+
describe arguments, options, and variables, the basic markdown(5)
|
119
|
+
list syntax has been extended to support a definition list
|
120
|
+
syntax.
|
121
|
+
|
122
|
+
A definition list's syntax is exactly the same as markdown(5)'s
|
123
|
+
unordered list syntax but requires that the first line of each
|
124
|
+
list item be terminated with a colon "`:`". The first line
|
125
|
+
(minus the colon) is the _term_; subsequent lines may be
|
126
|
+
comprised of multiple paragraphs, code blocks, standard lists,
|
127
|
+
and nested definition lists.
|
128
|
+
|
129
|
+
An example definition list, taken from test(1)'s `DESCRIPTION`
|
130
|
+
section:
|
131
|
+
|
132
|
+
The following primaries are used to construct expressions:
|
133
|
+
|
134
|
+
* `-b` _file_:
|
135
|
+
True if _file_ exists and is a block special file.
|
136
|
+
|
137
|
+
* `-c` _file_:
|
138
|
+
True if _file_ exists and is a character special file.
|
139
|
+
|
140
|
+
* `-d` _file_:
|
141
|
+
True if file exists and is a directory.
|
142
|
+
|
143
|
+
The definition list syntax is intentionally backward compatible
|
144
|
+
with markdown(5)'s list syntax. This allows `ron` documents to be
|
145
|
+
piped through normal markdown processors with minor degradation
|
146
|
+
in output formatting.
|
147
|
+
|
148
|
+
## SEE ALSO
|
149
|
+
|
150
|
+
ron(1), markdown(5), manpages(5)
|
data/ron.gemspec
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.specification_version = 2 if s.respond_to? :specification_version=
|
3
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
4
|
+
|
5
|
+
s.name = 'ron'
|
6
|
+
s.version = '0.1'
|
7
|
+
s.date = '2009-11-05'
|
8
|
+
|
9
|
+
s.description = "The opposite of roff"
|
10
|
+
s.summary = "The opposite of roff"
|
11
|
+
|
12
|
+
s.authors = ["Ryan Tomayko"]
|
13
|
+
s.email = "rtomayko@gmail.com"
|
14
|
+
|
15
|
+
# = MANIFEST =
|
16
|
+
s.files = %w[
|
17
|
+
COPYING
|
18
|
+
README
|
19
|
+
Rakefile
|
20
|
+
bin/ron
|
21
|
+
lib/ron.rb
|
22
|
+
lib/ron/document.rb
|
23
|
+
lib/ron/layout.html
|
24
|
+
lib/ron/roff.rb
|
25
|
+
man/markdown.5.ron
|
26
|
+
man/ron.1.ron
|
27
|
+
man/ron.5.ron
|
28
|
+
ron.gemspec
|
29
|
+
test/document_test.rb
|
30
|
+
test/ron_test.rb
|
31
|
+
test/simple.ron
|
32
|
+
]
|
33
|
+
# = MANIFEST =
|
34
|
+
|
35
|
+
s.executables = ['ron']
|
36
|
+
s.test_files = s.files.select { |path| path =~ /^test\/.*_test.rb/ }
|
37
|
+
|
38
|
+
s.extra_rdoc_files = %w[README COPYING]
|
39
|
+
s.add_dependency 'nokogiri', '~> 1.4'
|
40
|
+
s.add_dependency 'rdiscount', '~> 1.3'
|
41
|
+
s.add_development_dependency 'contest', '~> 0.1'
|
42
|
+
|
43
|
+
s.has_rdoc = true
|
44
|
+
s.homepage = "http://github.com/rtomayko/ron/"
|
45
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Ron"]
|
46
|
+
s.require_paths = %w[lib]
|
47
|
+
s.rubygems_version = '1.1.1'
|
48
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'ron/document'
|
3
|
+
|
4
|
+
class DocumentTest < Test::Unit::TestCase
|
5
|
+
SIMPLE_FILE = "#{File.dirname(__FILE__)}/simple.ron"
|
6
|
+
HELLO_DATA = "# hello(1) -- hello world"
|
7
|
+
|
8
|
+
test "creating with a file" do
|
9
|
+
doc = Ron::Document.new(SIMPLE_FILE)
|
10
|
+
assert_equal File.read(SIMPLE_FILE), doc.data
|
11
|
+
end
|
12
|
+
|
13
|
+
test "creating with a string and a file" do
|
14
|
+
doc = Ron::Document.new('hello.1.ron') { HELLO_DATA }
|
15
|
+
assert_equal HELLO_DATA, doc.data
|
16
|
+
end
|
17
|
+
|
18
|
+
context "Document" do
|
19
|
+
setup do
|
20
|
+
@doc = Ron::Document.new('hello.1.ron') { HELLO_DATA }
|
21
|
+
end
|
22
|
+
|
23
|
+
should "load data" do
|
24
|
+
assert_equal HELLO_DATA, @doc.data
|
25
|
+
end
|
26
|
+
|
27
|
+
should "extract the name" do
|
28
|
+
assert_equal 'hello', @doc.name
|
29
|
+
end
|
30
|
+
|
31
|
+
should "extract the section" do
|
32
|
+
assert_equal '1', @doc.section
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/test/ron_test.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'contest'
|
2
|
+
|
3
|
+
# ron command tests
|
4
|
+
class RonTest < Test::Unit::TestCase
|
5
|
+
testdir = File.dirname(__FILE__)
|
6
|
+
bindir = File.dirname(testdir)
|
7
|
+
ENV['PATH'] = "#{bindir}:#{ENV['PATH']}"
|
8
|
+
|
9
|
+
SIMPLE_FILE = "#{File.dirname(__FILE__)}/simple.ron"
|
10
|
+
|
11
|
+
test "takes ron text on stdin and produces roff on stdout" do
|
12
|
+
output = `echo '# hello(1) -- hello world' | ron`
|
13
|
+
lines = output.split("\n")
|
14
|
+
assert_equal 7, lines.size
|
15
|
+
assert_equal %[.\\" generated with Ron], lines.shift
|
16
|
+
assert_equal %[.\\" http://github.com/rtomayko/ron/], lines.shift
|
17
|
+
assert_equal %[.], lines.shift
|
18
|
+
assert_equal %[.TH "HELLO" 1 "" "" ""], lines.shift
|
19
|
+
assert_equal %[.], lines.shift
|
20
|
+
assert_equal %[.SH "NAME"], lines.shift
|
21
|
+
assert_equal %[\\fBhello\\fR \\-\\- hello world], lines.shift
|
22
|
+
assert_equal 0, lines.size
|
23
|
+
end
|
24
|
+
|
25
|
+
test "produces html instead of roff with the --html argument" do
|
26
|
+
output = `echo '# hello(1) -- hello world' | ron --html`
|
27
|
+
assert_match(/<h2 id="NAME">NAME<\/h2>/, output)
|
28
|
+
end
|
29
|
+
end
|
data/test/simple.ron
ADDED
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ron
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.1"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan Tomayko
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-05 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: nokogiri
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ~>
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "1.4"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rdiscount
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "1.3"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: contest
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0.1"
|
44
|
+
version:
|
45
|
+
description: The opposite of roff
|
46
|
+
email: rtomayko@gmail.com
|
47
|
+
executables:
|
48
|
+
- ron
|
49
|
+
extensions: []
|
50
|
+
|
51
|
+
extra_rdoc_files:
|
52
|
+
- README
|
53
|
+
- COPYING
|
54
|
+
files:
|
55
|
+
- COPYING
|
56
|
+
- README
|
57
|
+
- Rakefile
|
58
|
+
- bin/ron
|
59
|
+
- lib/ron.rb
|
60
|
+
- lib/ron/document.rb
|
61
|
+
- lib/ron/layout.html
|
62
|
+
- lib/ron/roff.rb
|
63
|
+
- man/markdown.5.ron
|
64
|
+
- man/ron.1.ron
|
65
|
+
- man/ron.5.ron
|
66
|
+
- ron.gemspec
|
67
|
+
- test/document_test.rb
|
68
|
+
- test/ron_test.rb
|
69
|
+
- test/simple.ron
|
70
|
+
has_rdoc: true
|
71
|
+
homepage: http://github.com/rtomayko/ron/
|
72
|
+
licenses: []
|
73
|
+
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options:
|
76
|
+
- --line-numbers
|
77
|
+
- --inline-source
|
78
|
+
- --title
|
79
|
+
- Ron
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: "0"
|
87
|
+
version:
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: "0"
|
93
|
+
version:
|
94
|
+
requirements: []
|
95
|
+
|
96
|
+
rubyforge_project:
|
97
|
+
rubygems_version: 1.3.5
|
98
|
+
signing_key:
|
99
|
+
specification_version: 2
|
100
|
+
summary: The opposite of roff
|
101
|
+
test_files:
|
102
|
+
- test/document_test.rb
|
103
|
+
- test/ron_test.rb
|