RbST 0.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/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.markdown +66 -0
- data/Rakefile +57 -0
- data/RbST.gemspec +60 -0
- data/VERSION +1 -0
- data/lib/rbst.rb +49 -0
- data/lib/rst2parts.py +43 -0
- data/test/files/test.html +335 -0
- data/test/files/test.rst +127 -0
- data/test/test_helper.rb +10 -0
- data/test/test_rbst.rb +42 -0
- metadata +88 -0
data/.document
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 William Melody
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# RbST
|
2
|
+
|
3
|
+
A simple Ruby wrapper for processing reStructuredText via
|
4
|
+
Python's Docutils.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Python 2.3+ is required.
|
9
|
+
|
10
|
+
RbST is available on gemcutter.
|
11
|
+
|
12
|
+
gem install gemcutter
|
13
|
+
gem tumble
|
14
|
+
gem install RbST
|
15
|
+
|
16
|
+
## Usage
|
17
|
+
|
18
|
+
require 'RbST'
|
19
|
+
...
|
20
|
+
@html = RbST.new('/some/file.rst').to_html
|
21
|
+
|
22
|
+
This takes the reStructuredText formatted file and converts it to
|
23
|
+
HTML. The first argument can be either a file or a string.
|
24
|
+
|
25
|
+
You can also use the `#convert` class method:
|
26
|
+
|
27
|
+
puts RbST.convert('/some/file.rst')
|
28
|
+
|
29
|
+
When no options are passed, the default behavior converts
|
30
|
+
reStructuredText to html. Options supported include
|
31
|
+
`:cloak_email_addresses` and `:strip_comments`, either of which can
|
32
|
+
be simply included as additional arguments.
|
33
|
+
|
34
|
+
puts RbST.convert(".. a comment", :strip_comments) # => '<div class="document">\n</div>'
|
35
|
+
|
36
|
+
Document parts can also be specified with the `:parts` option.
|
37
|
+
|
38
|
+
puts RbST.convert("hello world", :part => :fragment) # => '<p>hello world</p>'
|
39
|
+
|
40
|
+
By default, RbST uses the `html_body` part.
|
41
|
+
|
42
|
+
For more information on reStructuredText, see the
|
43
|
+
[ReST documentation](http://docutils.sourceforge.net/rst.html).
|
44
|
+
|
45
|
+
## Caveats
|
46
|
+
|
47
|
+
- Docutils is very slow. On my 2.5 GHz Core 2 Duo it takes over
|
48
|
+
half a second to convert the test file to HTML, including about 0.2s
|
49
|
+
to start up and 0.38s to process the input data.
|
50
|
+
- This has only been tested on \*nix systems.
|
51
|
+
- Python 3 has not been tested.
|
52
|
+
|
53
|
+
## Note on Patches/Pull Requests
|
54
|
+
|
55
|
+
- Fork the project.
|
56
|
+
- Make your feature addition or bug fix.
|
57
|
+
- Add tests for it. This is important so I don't break it in a
|
58
|
+
future version unintentionally.
|
59
|
+
- Commit, do not mess with rakefile, version, or history. (if you
|
60
|
+
want to have your own version, that is fine but bump version in a
|
61
|
+
commit by itself I can ignore when I pull)
|
62
|
+
- Send me a pull request. Bonus points for topic branches.
|
63
|
+
|
64
|
+
## Copyright
|
65
|
+
|
66
|
+
Copyright (c) 2009 William Melody. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "RbST"
|
8
|
+
gem.summary = %Q{A simple Ruby wrapper for processing reStructuredText via Python's Docutils}
|
9
|
+
gem.description = %Q{A simple Ruby wrapper for processing reStructuredText via Python's Docutils}
|
10
|
+
gem.email = "wmelody@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/autodata/rbst"
|
12
|
+
gem.authors = ["William Melody"]
|
13
|
+
gem.add_development_dependency "thoughtbot-shoulda"
|
14
|
+
gem.add_dependency "open4"
|
15
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
|
+
end
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'rake/testtask'
|
22
|
+
Rake::TestTask.new(:test) do |test|
|
23
|
+
test.libs << 'lib' << 'test'
|
24
|
+
test.pattern = 'test/**/test_*.rb'
|
25
|
+
test.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'rcov/rcovtask'
|
30
|
+
Rcov::RcovTask.new do |test|
|
31
|
+
test.libs << 'test'
|
32
|
+
test.pattern = 'test/**/test_*.rb'
|
33
|
+
test.verbose = true
|
34
|
+
end
|
35
|
+
rescue LoadError
|
36
|
+
task :rcov do
|
37
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
task :test => :check_dependencies
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'rake/rdoctask'
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
47
|
+
if File.exist?('VERSION')
|
48
|
+
version = File.read('VERSION')
|
49
|
+
else
|
50
|
+
version = ""
|
51
|
+
end
|
52
|
+
|
53
|
+
rdoc.rdoc_dir = 'rdoc'
|
54
|
+
rdoc.title = "RbST #{version}"
|
55
|
+
rdoc.rdoc_files.include('README*')
|
56
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
57
|
+
end
|
data/RbST.gemspec
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{RbST}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["William Melody"]
|
12
|
+
s.date = %q{2009-11-01}
|
13
|
+
s.description = %q{A simple Ruby wrapper for processing reStructuredText via Python's Docutils}
|
14
|
+
s.email = %q{wmelody@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.markdown"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.markdown",
|
24
|
+
"Rakefile",
|
25
|
+
"RbST.gemspec",
|
26
|
+
"VERSION",
|
27
|
+
"lib/rbst.rb",
|
28
|
+
"lib/rst2parts.py",
|
29
|
+
"test/files/test.html",
|
30
|
+
"test/files/test.rst",
|
31
|
+
"test/test_helper.rb",
|
32
|
+
"test/test_rbst.rb"
|
33
|
+
]
|
34
|
+
s.homepage = %q{http://github.com/autodata/rbst}
|
35
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
s.rubygems_version = %q{1.3.5}
|
38
|
+
s.summary = %q{A simple Ruby wrapper for processing reStructuredText via Python's Docutils}
|
39
|
+
s.test_files = [
|
40
|
+
"test/test_helper.rb",
|
41
|
+
"test/test_rbst.rb"
|
42
|
+
]
|
43
|
+
|
44
|
+
if s.respond_to? :specification_version then
|
45
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
46
|
+
s.specification_version = 3
|
47
|
+
|
48
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
49
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
50
|
+
s.add_runtime_dependency(%q<open4>, [">= 0"])
|
51
|
+
else
|
52
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
53
|
+
s.add_dependency(%q<open4>, [">= 0"])
|
54
|
+
end
|
55
|
+
else
|
56
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
57
|
+
s.add_dependency(%q<open4>, [">= 0"])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/lib/rbst.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'open4'
|
2
|
+
|
3
|
+
class RbST
|
4
|
+
|
5
|
+
def self.convert(*args)
|
6
|
+
new(*args).convert
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(*args)
|
10
|
+
target = args.shift
|
11
|
+
@target = File.exists?(target) ? File.read(target) : target rescue target
|
12
|
+
@options = args
|
13
|
+
end
|
14
|
+
|
15
|
+
def convert
|
16
|
+
executable = File.join(File.dirname(__FILE__), 'rst2parts.py')
|
17
|
+
execute "python #{executable}" + convert_options
|
18
|
+
end
|
19
|
+
alias_method :to_s, :convert
|
20
|
+
|
21
|
+
def to_html
|
22
|
+
@options << {:writer_name => :html}
|
23
|
+
convert
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def execute(command)
|
29
|
+
output = ''
|
30
|
+
Open4::popen4(command) do |pid, stdin, stdout, stderr|
|
31
|
+
stdin.puts @target
|
32
|
+
stdin.close
|
33
|
+
output = stdout.read.strip
|
34
|
+
end
|
35
|
+
output
|
36
|
+
end
|
37
|
+
|
38
|
+
def convert_options
|
39
|
+
@options.inject('') do |string, opt|
|
40
|
+
string + if opt.respond_to?(:each_pair)
|
41
|
+
opt.inject('') do |s, (flag, val)|
|
42
|
+
s + (flag.to_s.length == 1 ? " -#{flag} #{val}" : " --#{flag}=#{val}")
|
43
|
+
end
|
44
|
+
else
|
45
|
+
opt.to_s.length == 1 ? " -#{opt}" : " --#{opt}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/rst2parts.py
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
|
3
|
+
import sys
|
4
|
+
from optparse import OptionParser
|
5
|
+
from docutils.core import publish_parts
|
6
|
+
|
7
|
+
def main():
|
8
|
+
p = OptionParser()
|
9
|
+
|
10
|
+
p.add_option('--cloak_email_addresses', action="store_true", default=False)
|
11
|
+
p.add_option('--strip_comments', action="store_true", default=False)
|
12
|
+
p.add_option('--writer_name', default="html")
|
13
|
+
p.add_option('--part', default="html_body")
|
14
|
+
|
15
|
+
opts, args = p.parse_args()
|
16
|
+
|
17
|
+
settings = {
|
18
|
+
'file_insertion_enabled': False,
|
19
|
+
'raw_enabled': False,
|
20
|
+
'cloak_email_addresses': opts.cloak_email_addresses,
|
21
|
+
'strip_comments': opts.strip_comments,
|
22
|
+
}
|
23
|
+
|
24
|
+
if len(args) == 1:
|
25
|
+
try:
|
26
|
+
content = open(args[0], 'r').read()
|
27
|
+
except IOError:
|
28
|
+
content = args[0]
|
29
|
+
else:
|
30
|
+
content = sys.stdin.read()
|
31
|
+
|
32
|
+
parts = publish_parts(
|
33
|
+
source=content,
|
34
|
+
settings_overrides=settings,
|
35
|
+
writer_name=opts.writer_name,
|
36
|
+
)
|
37
|
+
|
38
|
+
if opts.part in parts:
|
39
|
+
return parts[opts.part]
|
40
|
+
return ''
|
41
|
+
|
42
|
+
if __name__ == '__main__':
|
43
|
+
print(main())
|
@@ -0,0 +1,335 @@
|
|
1
|
+
<div class="document" id="the-restructuredtext-cheat-sheet-syntax-reminders">
|
2
|
+
<h1 class="title">The <a class="reference external" href="http://docutils.sf.net/rst.html">reStructuredText</a> Cheat Sheet: Syntax Reminders</h1>
|
3
|
+
<table class="docinfo" frame="void" rules="none">
|
4
|
+
<col class="docinfo-name" />
|
5
|
+
<col class="docinfo-content" />
|
6
|
+
<tbody valign="top">
|
7
|
+
<tr class="field"><th class="docinfo-name">Info:</th><td class="field-body">See <<a class="reference external" href="http://docutils.sf.net/rst.html">http://docutils.sf.net/rst.html</a>> for introductory docs.</td>
|
8
|
+
</tr>
|
9
|
+
<tr><th class="docinfo-name">Author:</th>
|
10
|
+
<td>David Goodger <<a class="reference external" href="mailto:goodger@python.org">goodger@python.org</a>></td></tr>
|
11
|
+
<tr><th class="docinfo-name">Date:</th>
|
12
|
+
<td>2006-01-23</td></tr>
|
13
|
+
<tr><th class="docinfo-name">Revision:</th>
|
14
|
+
<td>4321</td></tr>
|
15
|
+
<tr class="field"><th class="docinfo-name">Description:</th><td class="field-body">This is a "docinfo block", or bibliographic field list</td>
|
16
|
+
</tr>
|
17
|
+
</tbody>
|
18
|
+
</table>
|
19
|
+
<div class="section" id="section-structure">
|
20
|
+
<h1>Section Structure</h1>
|
21
|
+
<p>Section titles are underlined or overlined & underlined.</p>
|
22
|
+
</div>
|
23
|
+
<div class="section" id="body-elements">
|
24
|
+
<h1>Body Elements</h1>
|
25
|
+
<p>Grid table:</p>
|
26
|
+
<table border="1" class="docutils">
|
27
|
+
<colgroup>
|
28
|
+
<col width="48%" />
|
29
|
+
<col width="52%" />
|
30
|
+
</colgroup>
|
31
|
+
<tbody valign="top">
|
32
|
+
<tr><td><p class="first">Paragraphs are flush-left,
|
33
|
+
separated by blank lines.</p>
|
34
|
+
<blockquote class="last">
|
35
|
+
Block quotes are indented.</blockquote>
|
36
|
+
</td>
|
37
|
+
<td rowspan="2"><p class="first">Literal block, preceded by "::":</p>
|
38
|
+
<pre class="literal-block">
|
39
|
+
Indented
|
40
|
+
</pre>
|
41
|
+
<p>or:</p>
|
42
|
+
<pre class="last literal-block">
|
43
|
+
> Quoted
|
44
|
+
</pre>
|
45
|
+
</td>
|
46
|
+
</tr>
|
47
|
+
<tr><td><pre class="first last doctest-block">
|
48
|
+
>>> print 'Doctest block'
|
49
|
+
Doctest block
|
50
|
+
</pre>
|
51
|
+
</td>
|
52
|
+
</tr>
|
53
|
+
<tr><td colspan="2"><div class="first last line-block">
|
54
|
+
<div class="line">Line blocks preserve line breaks & indents. [new in 0.3.6]</div>
|
55
|
+
<div class="line-block">
|
56
|
+
<div class="line">Useful for addresses, verse, and adornment-free lists; long
|
57
|
+
lines can be wrapped with continuation lines.</div>
|
58
|
+
</div>
|
59
|
+
</div>
|
60
|
+
</td>
|
61
|
+
</tr>
|
62
|
+
</tbody>
|
63
|
+
</table>
|
64
|
+
<p>Simple tables:</p>
|
65
|
+
<table border="1" class="docutils">
|
66
|
+
<colgroup>
|
67
|
+
<col width="21%" />
|
68
|
+
<col width="79%" />
|
69
|
+
</colgroup>
|
70
|
+
<thead valign="bottom">
|
71
|
+
<tr><th class="head">List Type</th>
|
72
|
+
<th class="head">Examples</th>
|
73
|
+
</tr>
|
74
|
+
</thead>
|
75
|
+
<tbody valign="top">
|
76
|
+
<tr><td>Bullet list</td>
|
77
|
+
<td><ul class="first last simple">
|
78
|
+
<li>items begin with "-", "+", or "*"</li>
|
79
|
+
</ul>
|
80
|
+
</td>
|
81
|
+
</tr>
|
82
|
+
<tr><td>Enumerated list</td>
|
83
|
+
<td><ol class="first last arabic simple">
|
84
|
+
<li>items use any variation of "1.", "A)", and "(i)"</li>
|
85
|
+
<li>also auto-enumerated</li>
|
86
|
+
</ol>
|
87
|
+
</td>
|
88
|
+
</tr>
|
89
|
+
<tr><td>Definition list</td>
|
90
|
+
<td><dl class="first last docutils">
|
91
|
+
<dt>Term is flush-left <span class="classifier-delimiter">:</span> <span class="classifier">optional classifier</span></dt>
|
92
|
+
<dd>Definition is indented, no blank line between</dd>
|
93
|
+
</dl>
|
94
|
+
</td>
|
95
|
+
</tr>
|
96
|
+
<tr><td>Field list</td>
|
97
|
+
<td><table class="first last docutils field-list" frame="void" rules="none">
|
98
|
+
<col class="field-name" />
|
99
|
+
<col class="field-body" />
|
100
|
+
<tbody valign="top">
|
101
|
+
<tr class="field"><th class="field-name">field name:</th><td class="field-body">field body</td>
|
102
|
+
</tr>
|
103
|
+
</tbody>
|
104
|
+
</table>
|
105
|
+
</td>
|
106
|
+
</tr>
|
107
|
+
<tr><td>Option list</td>
|
108
|
+
<td><table class="first last docutils option-list" frame="void" rules="none">
|
109
|
+
<col class="option" />
|
110
|
+
<col class="description" />
|
111
|
+
<tbody valign="top">
|
112
|
+
<tr><td class="option-group">
|
113
|
+
<kbd><span class="option">-o</span></kbd></td>
|
114
|
+
<td>at least 2 spaces between option & description</td></tr>
|
115
|
+
</tbody>
|
116
|
+
</table>
|
117
|
+
</td>
|
118
|
+
</tr>
|
119
|
+
</tbody>
|
120
|
+
</table>
|
121
|
+
<table border="1" class="docutils">
|
122
|
+
<colgroup>
|
123
|
+
<col width="21%" />
|
124
|
+
<col width="79%" />
|
125
|
+
</colgroup>
|
126
|
+
<thead valign="bottom">
|
127
|
+
<tr><th class="head">Explicit Markup</th>
|
128
|
+
<th class="head">Examples (visible in the <a class="reference external" href="cheatsheet.txt">text source</a>)</th>
|
129
|
+
</tr>
|
130
|
+
</thead>
|
131
|
+
<tbody valign="top">
|
132
|
+
<tr><td>Footnote</td>
|
133
|
+
<td><table class="first last docutils footnote" frame="void" id="id1" rules="none">
|
134
|
+
<colgroup><col class="label" /><col /></colgroup>
|
135
|
+
<tbody valign="top">
|
136
|
+
<tr><td class="label"><a class="fn-backref" href="#id3">[1]</a></td><td>Manually numbered or [#] auto-numbered
|
137
|
+
(even [#labelled]) or [*] auto-symbol</td></tr>
|
138
|
+
</tbody>
|
139
|
+
</table>
|
140
|
+
</td>
|
141
|
+
</tr>
|
142
|
+
<tr><td>Citation</td>
|
143
|
+
<td><table class="first last docutils citation" frame="void" id="cit2002" rules="none">
|
144
|
+
<colgroup><col class="label" /><col /></colgroup>
|
145
|
+
<tbody valign="top">
|
146
|
+
<tr><td class="label"><a class="fn-backref" href="#id4">[CIT2002]</a></td><td>A citation.</td></tr>
|
147
|
+
</tbody>
|
148
|
+
</table>
|
149
|
+
</td>
|
150
|
+
</tr>
|
151
|
+
<tr><td>Hyperlink Target</td>
|
152
|
+
<td></td>
|
153
|
+
</tr>
|
154
|
+
<tr id="internal-target"><td>Anonymous Target</td>
|
155
|
+
<td></td>
|
156
|
+
</tr>
|
157
|
+
<tr><td>Directive ("::")</td>
|
158
|
+
<td><img alt="images/biohazard.png" class="first last" src="images/biohazard.png" />
|
159
|
+
</td>
|
160
|
+
</tr>
|
161
|
+
<tr><td>Substitution Def</td>
|
162
|
+
<td></td>
|
163
|
+
</tr>
|
164
|
+
<tr><td>Comment</td>
|
165
|
+
<td><!-- is anything else -->
|
166
|
+
</td>
|
167
|
+
</tr>
|
168
|
+
<tr><td>Empty Comment</td>
|
169
|
+
<td>(".." on a line by itself, with blank lines before & after,
|
170
|
+
used to separate indentation contexts)</td>
|
171
|
+
</tr>
|
172
|
+
</tbody>
|
173
|
+
</table>
|
174
|
+
</div>
|
175
|
+
<div class="section" id="inline-markup">
|
176
|
+
<h1>Inline Markup</h1>
|
177
|
+
<p><em>emphasis</em>; <strong>strong emphasis</strong>; <cite>interpreted text</cite>; <em>interpreted text
|
178
|
+
with role</em>; <tt class="docutils literal"><span class="pre">inline</span> <span class="pre">literal</span> <span class="pre">text</span></tt>; standalone hyperlink,
|
179
|
+
<a class="reference external" href="http://docutils.sourceforge.net">http://docutils.sourceforge.net</a>; named reference, <a class="reference external" href="http://docutils.sf.net/rst.html">reStructuredText</a>;
|
180
|
+
<a class="reference external" href="http://docutils.sf.net/docs/ref/rst/restructuredtext.html">anonymous reference</a>; footnote reference, <a class="footnote-reference" href="#id1" id="id3">[1]</a>; citation reference,
|
181
|
+
<a class="citation-reference" href="#cit2002" id="id4">[CIT2002]</a>; like an inline directive; <span class="target" id="inline-internal-target">inline internal target</span>.</p>
|
182
|
+
</div>
|
183
|
+
<div class="section" id="directive-quick-reference">
|
184
|
+
<h1>Directive Quick Reference</h1>
|
185
|
+
<p>See <<a class="reference external" href="http://docutils.sf.net/docs/ref/rst/directives.html">http://docutils.sf.net/docs/ref/rst/directives.html</a>> for full info.</p>
|
186
|
+
<table border="1" class="docutils">
|
187
|
+
<colgroup>
|
188
|
+
<col width="21%" />
|
189
|
+
<col width="79%" />
|
190
|
+
</colgroup>
|
191
|
+
<thead valign="bottom">
|
192
|
+
<tr><th class="head">Directive Name</th>
|
193
|
+
<th class="head">Description (Docutils version added to, in [brackets])</th>
|
194
|
+
</tr>
|
195
|
+
</thead>
|
196
|
+
<tbody valign="top">
|
197
|
+
<tr><td>attention</td>
|
198
|
+
<td>Specific admonition; also "caution", "danger",
|
199
|
+
"error", "hint", "important", "note", "tip", "warning"</td>
|
200
|
+
</tr>
|
201
|
+
<tr><td>admonition</td>
|
202
|
+
<td>Generic titled admonition: <tt class="docutils literal"><span class="pre">..</span> <span class="pre">admonition::</span> <span class="pre">By</span> <span class="pre">The</span> <span class="pre">Way</span></tt></td>
|
203
|
+
</tr>
|
204
|
+
<tr><td>image</td>
|
205
|
+
<td><tt class="docutils literal"><span class="pre">..</span> <span class="pre">image::</span> <span class="pre">picture.png</span></tt>; many options possible</td>
|
206
|
+
</tr>
|
207
|
+
<tr><td>figure</td>
|
208
|
+
<td>Like "image", but with optional caption and legend</td>
|
209
|
+
</tr>
|
210
|
+
<tr><td>topic</td>
|
211
|
+
<td><tt class="docutils literal"><span class="pre">..</span> <span class="pre">topic::</span> <span class="pre">Title</span></tt>; like a mini section</td>
|
212
|
+
</tr>
|
213
|
+
<tr><td>sidebar</td>
|
214
|
+
<td><tt class="docutils literal"><span class="pre">..</span> <span class="pre">sidebar::</span> <span class="pre">Title</span></tt>; like a mini parallel document</td>
|
215
|
+
</tr>
|
216
|
+
<tr><td>parsed-literal</td>
|
217
|
+
<td>A literal block with parsed inline markup</td>
|
218
|
+
</tr>
|
219
|
+
<tr><td>rubric</td>
|
220
|
+
<td><tt class="docutils literal"><span class="pre">..</span> <span class="pre">rubric::</span> <span class="pre">Informal</span> <span class="pre">Heading</span></tt></td>
|
221
|
+
</tr>
|
222
|
+
<tr><td>epigraph</td>
|
223
|
+
<td>Block quote with class="epigraph"</td>
|
224
|
+
</tr>
|
225
|
+
<tr><td>highlights</td>
|
226
|
+
<td>Block quote with class="highlights"</td>
|
227
|
+
</tr>
|
228
|
+
<tr><td>pull-quote</td>
|
229
|
+
<td>Block quote with class="pull-quote"</td>
|
230
|
+
</tr>
|
231
|
+
<tr><td>compound</td>
|
232
|
+
<td>Compound paragraphs [0.3.6]</td>
|
233
|
+
</tr>
|
234
|
+
<tr><td>container</td>
|
235
|
+
<td>Generic block-level container element [0.3.10]</td>
|
236
|
+
</tr>
|
237
|
+
<tr><td>table</td>
|
238
|
+
<td>Create a titled table [0.3.1]</td>
|
239
|
+
</tr>
|
240
|
+
<tr><td>list-table</td>
|
241
|
+
<td>Create a table from a uniform two-level bullet list [0.3.8]</td>
|
242
|
+
</tr>
|
243
|
+
<tr><td>csv-table</td>
|
244
|
+
<td>Create a table from CSV data (requires Python 2.3+) [0.3.4]</td>
|
245
|
+
</tr>
|
246
|
+
<tr><td>contents</td>
|
247
|
+
<td>Generate a table of contents</td>
|
248
|
+
</tr>
|
249
|
+
<tr><td>sectnum</td>
|
250
|
+
<td>Automatically number sections, subsections, etc.</td>
|
251
|
+
</tr>
|
252
|
+
<tr><td>header, footer</td>
|
253
|
+
<td>Create document decorations [0.3.8]</td>
|
254
|
+
</tr>
|
255
|
+
<tr><td>target-notes</td>
|
256
|
+
<td>Create an explicit footnote for each external target</td>
|
257
|
+
</tr>
|
258
|
+
<tr><td>meta</td>
|
259
|
+
<td>HTML-specific metadata</td>
|
260
|
+
</tr>
|
261
|
+
<tr><td>include</td>
|
262
|
+
<td>Read an external reST file as if it were inline</td>
|
263
|
+
</tr>
|
264
|
+
<tr><td>raw</td>
|
265
|
+
<td>Non-reST data passed untouched to the Writer</td>
|
266
|
+
</tr>
|
267
|
+
<tr><td>replace</td>
|
268
|
+
<td>Replacement text for substitution definitions</td>
|
269
|
+
</tr>
|
270
|
+
<tr><td>unicode</td>
|
271
|
+
<td>Unicode character code conversion for substitution defs</td>
|
272
|
+
</tr>
|
273
|
+
<tr><td>date</td>
|
274
|
+
<td>Generates today's date; for substitution defs</td>
|
275
|
+
</tr>
|
276
|
+
<tr><td>class</td>
|
277
|
+
<td>Set a "class" attribute on the next element</td>
|
278
|
+
</tr>
|
279
|
+
<tr><td>role</td>
|
280
|
+
<td>Create a custom interpreted text role [0.3.2]</td>
|
281
|
+
</tr>
|
282
|
+
<tr><td>default-role</td>
|
283
|
+
<td>Set the default interpreted text role [0.3.10]</td>
|
284
|
+
</tr>
|
285
|
+
<tr><td>title</td>
|
286
|
+
<td>Set the metadata document title [0.3.10]</td>
|
287
|
+
</tr>
|
288
|
+
</tbody>
|
289
|
+
</table>
|
290
|
+
</div>
|
291
|
+
<div class="section" id="interpreted-text-role-quick-reference">
|
292
|
+
<h1>Interpreted Text Role Quick Reference</h1>
|
293
|
+
<p>See <<a class="reference external" href="http://docutils.sf.net/docs/ref/rst/roles.html">http://docutils.sf.net/docs/ref/rst/roles.html</a>> for full info.</p>
|
294
|
+
<table border="1" class="docutils">
|
295
|
+
<colgroup>
|
296
|
+
<col width="21%" />
|
297
|
+
<col width="79%" />
|
298
|
+
</colgroup>
|
299
|
+
<thead valign="bottom">
|
300
|
+
<tr><th class="head">Role Name</th>
|
301
|
+
<th class="head">Description</th>
|
302
|
+
</tr>
|
303
|
+
</thead>
|
304
|
+
<tbody valign="top">
|
305
|
+
<tr><td>emphasis</td>
|
306
|
+
<td>Equivalent to <em>emphasis</em></td>
|
307
|
+
</tr>
|
308
|
+
<tr><td>literal</td>
|
309
|
+
<td>Equivalent to <tt class="docutils literal"><span class="pre">literal</span></tt> but processes backslash escapes</td>
|
310
|
+
</tr>
|
311
|
+
<tr><td>PEP</td>
|
312
|
+
<td>Reference to a numbered Python Enhancement Proposal</td>
|
313
|
+
</tr>
|
314
|
+
<tr><td>RFC</td>
|
315
|
+
<td>Reference to a numbered Internet Request For Comments</td>
|
316
|
+
</tr>
|
317
|
+
<tr><td>raw</td>
|
318
|
+
<td>For non-reST data; cannot be used directly (see docs) [0.3.6]</td>
|
319
|
+
</tr>
|
320
|
+
<tr><td>strong</td>
|
321
|
+
<td>Equivalent to <strong>strong</strong></td>
|
322
|
+
</tr>
|
323
|
+
<tr><td>sub</td>
|
324
|
+
<td>Subscript</td>
|
325
|
+
</tr>
|
326
|
+
<tr><td>sup</td>
|
327
|
+
<td>Superscript</td>
|
328
|
+
</tr>
|
329
|
+
<tr><td>title</td>
|
330
|
+
<td>Title reference (book, etc.); standard default role</td>
|
331
|
+
</tr>
|
332
|
+
</tbody>
|
333
|
+
</table>
|
334
|
+
</div>
|
335
|
+
</div>
|
data/test/files/test.rst
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
=====================================================
|
2
|
+
The reStructuredText_ Cheat Sheet: Syntax Reminders
|
3
|
+
=====================================================
|
4
|
+
:Info: See <http://docutils.sf.net/rst.html> for introductory docs.
|
5
|
+
:Author: David Goodger <goodger@python.org>
|
6
|
+
:Date: $Date: 2006-01-23 02:13:55 +0100 (Mon, 23 Jän 2006) $
|
7
|
+
:Revision: $Revision: 4321 $
|
8
|
+
:Description: This is a "docinfo block", or bibliographic field list
|
9
|
+
|
10
|
+
Section Structure
|
11
|
+
=================
|
12
|
+
Section titles are underlined or overlined & underlined.
|
13
|
+
|
14
|
+
Body Elements
|
15
|
+
=============
|
16
|
+
Grid table:
|
17
|
+
|
18
|
+
+--------------------------------+-----------------------------------+
|
19
|
+
| Paragraphs are flush-left, | Literal block, preceded by "::":: |
|
20
|
+
| separated by blank lines. | |
|
21
|
+
| | Indented |
|
22
|
+
| Block quotes are indented. | |
|
23
|
+
+--------------------------------+ or:: |
|
24
|
+
| >>> print 'Doctest block' | |
|
25
|
+
| Doctest block | > Quoted |
|
26
|
+
+--------------------------------+-----------------------------------+
|
27
|
+
| | Line blocks preserve line breaks & indents. [new in 0.3.6] |
|
28
|
+
| | Useful for addresses, verse, and adornment-free lists; long |
|
29
|
+
| lines can be wrapped with continuation lines. |
|
30
|
+
+--------------------------------------------------------------------+
|
31
|
+
|
32
|
+
Simple tables:
|
33
|
+
|
34
|
+
================ ============================================================
|
35
|
+
List Type Examples
|
36
|
+
================ ============================================================
|
37
|
+
Bullet list * items begin with "-", "+", or "*"
|
38
|
+
Enumerated list 1. items use any variation of "1.", "A)", and "(i)"
|
39
|
+
#. also auto-enumerated
|
40
|
+
Definition list Term is flush-left : optional classifier
|
41
|
+
Definition is indented, no blank line between
|
42
|
+
Field list :field name: field body
|
43
|
+
Option list -o at least 2 spaces between option & description
|
44
|
+
================ ============================================================
|
45
|
+
|
46
|
+
================ ============================================================
|
47
|
+
Explicit Markup Examples (visible in the `text source <cheatsheet.txt>`_)
|
48
|
+
================ ============================================================
|
49
|
+
Footnote .. [1] Manually numbered or [#] auto-numbered
|
50
|
+
(even [#labelled]) or [*] auto-symbol
|
51
|
+
Citation .. [CIT2002] A citation.
|
52
|
+
Hyperlink Target .. _reStructuredText: http://docutils.sf.net/rst.html
|
53
|
+
.. _indirect target: reStructuredText_
|
54
|
+
.. _internal target:
|
55
|
+
Anonymous Target __ http://docutils.sf.net/docs/ref/rst/restructuredtext.html
|
56
|
+
Directive ("::") .. image:: images/biohazard.png
|
57
|
+
Substitution Def .. |substitution| replace:: like an inline directive
|
58
|
+
Comment .. is anything else
|
59
|
+
Empty Comment (".." on a line by itself, with blank lines before & after,
|
60
|
+
used to separate indentation contexts)
|
61
|
+
================ ============================================================
|
62
|
+
|
63
|
+
Inline Markup
|
64
|
+
=============
|
65
|
+
*emphasis*; **strong emphasis**; `interpreted text`; `interpreted text
|
66
|
+
with role`:emphasis:; ``inline literal text``; standalone hyperlink,
|
67
|
+
http://docutils.sourceforge.net; named reference, reStructuredText_;
|
68
|
+
`anonymous reference`__; footnote reference, [1]_; citation reference,
|
69
|
+
[CIT2002]_; |substitution|; _`inline internal target`.
|
70
|
+
|
71
|
+
Directive Quick Reference
|
72
|
+
=========================
|
73
|
+
See <http://docutils.sf.net/docs/ref/rst/directives.html> for full info.
|
74
|
+
|
75
|
+
================ ============================================================
|
76
|
+
Directive Name Description (Docutils version added to, in [brackets])
|
77
|
+
================ ============================================================
|
78
|
+
attention Specific admonition; also "caution", "danger",
|
79
|
+
"error", "hint", "important", "note", "tip", "warning"
|
80
|
+
admonition Generic titled admonition: ``.. admonition:: By The Way``
|
81
|
+
image ``.. image:: picture.png``; many options possible
|
82
|
+
figure Like "image", but with optional caption and legend
|
83
|
+
topic ``.. topic:: Title``; like a mini section
|
84
|
+
sidebar ``.. sidebar:: Title``; like a mini parallel document
|
85
|
+
parsed-literal A literal block with parsed inline markup
|
86
|
+
rubric ``.. rubric:: Informal Heading``
|
87
|
+
epigraph Block quote with class="epigraph"
|
88
|
+
highlights Block quote with class="highlights"
|
89
|
+
pull-quote Block quote with class="pull-quote"
|
90
|
+
compound Compound paragraphs [0.3.6]
|
91
|
+
container Generic block-level container element [0.3.10]
|
92
|
+
table Create a titled table [0.3.1]
|
93
|
+
list-table Create a table from a uniform two-level bullet list [0.3.8]
|
94
|
+
csv-table Create a table from CSV data (requires Python 2.3+) [0.3.4]
|
95
|
+
contents Generate a table of contents
|
96
|
+
sectnum Automatically number sections, subsections, etc.
|
97
|
+
header, footer Create document decorations [0.3.8]
|
98
|
+
target-notes Create an explicit footnote for each external target
|
99
|
+
meta HTML-specific metadata
|
100
|
+
include Read an external reST file as if it were inline
|
101
|
+
raw Non-reST data passed untouched to the Writer
|
102
|
+
replace Replacement text for substitution definitions
|
103
|
+
unicode Unicode character code conversion for substitution defs
|
104
|
+
date Generates today's date; for substitution defs
|
105
|
+
class Set a "class" attribute on the next element
|
106
|
+
role Create a custom interpreted text role [0.3.2]
|
107
|
+
default-role Set the default interpreted text role [0.3.10]
|
108
|
+
title Set the metadata document title [0.3.10]
|
109
|
+
================ ============================================================
|
110
|
+
|
111
|
+
Interpreted Text Role Quick Reference
|
112
|
+
=====================================
|
113
|
+
See <http://docutils.sf.net/docs/ref/rst/roles.html> for full info.
|
114
|
+
|
115
|
+
================ ============================================================
|
116
|
+
Role Name Description
|
117
|
+
================ ============================================================
|
118
|
+
emphasis Equivalent to *emphasis*
|
119
|
+
literal Equivalent to ``literal`` but processes backslash escapes
|
120
|
+
PEP Reference to a numbered Python Enhancement Proposal
|
121
|
+
RFC Reference to a numbered Internet Request For Comments
|
122
|
+
raw For non-reST data; cannot be used directly (see docs) [0.3.6]
|
123
|
+
strong Equivalent to **strong**
|
124
|
+
sub Subscript
|
125
|
+
sup Superscript
|
126
|
+
title Title reference (book, etc.); standard default role
|
127
|
+
================ ============================================================
|
data/test/test_helper.rb
ADDED
data/test/test_rbst.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
require 'mocha'
|
3
|
+
|
4
|
+
class TestRbST < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@rst_file = File.join(File.dirname(__FILE__), 'files', 'test.rst')
|
7
|
+
@html_file = File.join(File.dirname(__FILE__), 'files', 'test.html')
|
8
|
+
end
|
9
|
+
|
10
|
+
should "call bare rest2parts when passed no options" do
|
11
|
+
converter = RbST.new(@rst_file)
|
12
|
+
converter.expects(:execute).with('python ./test/../lib/rst2parts.py').returns(true)
|
13
|
+
assert converter.convert
|
14
|
+
end
|
15
|
+
|
16
|
+
should "convert ReST to html" do
|
17
|
+
html = RbST.new(@rst_file).to_html
|
18
|
+
assert_equal html, File.read(@html_file)
|
19
|
+
end
|
20
|
+
|
21
|
+
should "recognize strip_comments option" do
|
22
|
+
html_with_comment = RbST.convert(".. comment")
|
23
|
+
assert_equal html_with_comment, %Q{<div class="document">\n<!-- comment -->\n</div>}
|
24
|
+
html_without_comment = RbST.convert(".. comment", :strip_comments)
|
25
|
+
assert_equal html_without_comment, %Q{<div class="document">\n</div>}
|
26
|
+
end
|
27
|
+
|
28
|
+
should "recognize cloak_email_addresses option" do
|
29
|
+
html_with_uncloaked_email = RbST.convert("steve@mac.com")
|
30
|
+
assert_equal %Q{<div class="document">\n<p><a class="reference external" href="mailto:steve@mac.com">steve@mac.com</a></p>\n</div>}, html_with_uncloaked_email
|
31
|
+
html_with_cloaked_email = RbST.convert("steve@mac.com", :cloak_email_addresses)
|
32
|
+
assert_equal %Q{<div class="document">\n<p><a class="reference external" href="mailto:steve%40mac.com">steve<span>@</span>mac<span>.</span>com</a></p>\n</div>}, html_with_cloaked_email
|
33
|
+
end
|
34
|
+
|
35
|
+
should "recognize part option" do
|
36
|
+
html_body = RbST.convert("hello world", :part => :html_body)
|
37
|
+
assert_equal %Q{<div class="document">\n<p>hello world</p>\n</div>}, html_body
|
38
|
+
fragment = RbST.convert("hello world", :part => :fragment)
|
39
|
+
assert_equal %Q{<p>hello world</p>}, fragment
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: RbST
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- William Melody
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-01 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: thoughtbot-shoulda
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: open4
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description: A simple Ruby wrapper for processing reStructuredText via Python's Docutils
|
36
|
+
email: wmelody@gmail.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- LICENSE
|
43
|
+
- README.markdown
|
44
|
+
files:
|
45
|
+
- .document
|
46
|
+
- .gitignore
|
47
|
+
- LICENSE
|
48
|
+
- README.markdown
|
49
|
+
- Rakefile
|
50
|
+
- RbST.gemspec
|
51
|
+
- VERSION
|
52
|
+
- lib/rbst.rb
|
53
|
+
- lib/rst2parts.py
|
54
|
+
- test/files/test.html
|
55
|
+
- test/files/test.rst
|
56
|
+
- test/test_helper.rb
|
57
|
+
- test/test_rbst.rb
|
58
|
+
has_rdoc: true
|
59
|
+
homepage: http://github.com/autodata/rbst
|
60
|
+
licenses: []
|
61
|
+
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options:
|
64
|
+
- --charset=UTF-8
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: "0"
|
72
|
+
version:
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: "0"
|
78
|
+
version:
|
79
|
+
requirements: []
|
80
|
+
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 1.3.5
|
83
|
+
signing_key:
|
84
|
+
specification_version: 3
|
85
|
+
summary: A simple Ruby wrapper for processing reStructuredText via Python's Docutils
|
86
|
+
test_files:
|
87
|
+
- test/test_helper.rb
|
88
|
+
- test/test_rbst.rb
|