asciidoctor 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of asciidoctor might be problematic. Click here for more details.
- data/README.asciidoc +156 -0
- data/asciidoctor.gemspec +5 -4
- data/lib/asciidoctor.rb +46 -34
- data/lib/asciidoctor/block.rb +59 -42
- data/lib/asciidoctor/document.rb +56 -20
- data/lib/asciidoctor/lexer.rb +204 -107
- data/lib/asciidoctor/list_item.rb +47 -14
- data/lib/asciidoctor/reader.rb +29 -14
- data/lib/asciidoctor/render_templates.rb +162 -64
- data/lib/asciidoctor/renderer.rb +3 -3
- data/lib/asciidoctor/section.rb +32 -6
- data/lib/asciidoctor/version.rb +1 -1
- data/test/attributes_test.rb +44 -4
- data/test/document_test.rb +21 -2
- data/test/headers_test.rb +72 -13
- data/test/lexer_test.rb +54 -0
- data/test/lists_test.rb +406 -0
- data/test/paragraphs_test.rb +103 -3
- data/test/preamble_test.rb +88 -0
- data/test/test_helper.rb +6 -5
- data/test/text_test.rb +2 -1
- metadata +7 -5
- data/README.md +0 -154
- data/test/list_elements_test.rb +0 -55
data/test/paragraphs_test.rb
CHANGED
@@ -18,10 +18,25 @@ context "Paragraphs" do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
context "code" do
|
21
|
-
test "literal
|
21
|
+
test "single-line literal paragraphs" do
|
22
|
+
output = render_string(" LITERALS\n\n ARE LITERALLY\n\n AWESOMMMME.")
|
22
23
|
assert_xpath "//pre/tt", render_string(" LITERALS\n\n ARE LITERALLY\n\n AWESOMMMME.")
|
23
24
|
end
|
24
25
|
|
26
|
+
test "multi-line literal paragraph" do
|
27
|
+
input = <<-EOS
|
28
|
+
Install instructions:
|
29
|
+
|
30
|
+
yum install ruby rubygems
|
31
|
+
gem install asciidoctor
|
32
|
+
|
33
|
+
You're good to go!
|
34
|
+
EOS
|
35
|
+
output = render_string(input)
|
36
|
+
assert_xpath "//pre/tt", output, 1
|
37
|
+
assert_match /^gem install asciidoctor/, output, "Indentation should be trimmed from literal block"
|
38
|
+
end
|
39
|
+
|
25
40
|
test "listing paragraph" do
|
26
41
|
assert_xpath "//div[@class='highlight']", render_string("----\nblah blah blah\n----")
|
27
42
|
end
|
@@ -31,13 +46,98 @@ context "Paragraphs" do
|
|
31
46
|
end
|
32
47
|
end
|
33
48
|
|
49
|
+
context "quote" do
|
50
|
+
test "quote block" do
|
51
|
+
output = render_string("____\nFamous quote.\n____")
|
52
|
+
assert_xpath '//*[@class = "quoteblock"]', output, 1
|
53
|
+
assert_xpath '//*[@class = "quoteblock"]//p[text() = "Famous quote."]', output, 1
|
54
|
+
end
|
55
|
+
|
56
|
+
test "quote block with attribution" do
|
57
|
+
output = render_string("[quote, A famous person, A famous book]\n____\nFamous quote.\n____")
|
58
|
+
assert_xpath '//*[@class = "quoteblock"]', output, 1
|
59
|
+
assert_xpath '//*[@class = "quoteblock"]/*[@class = "attribution"]', output, 1
|
60
|
+
assert_xpath '//*[@class = "quoteblock"]/*[@class = "attribution"]/em[text() = "A famous book"]', output, 1
|
61
|
+
# TODO I can't seem to match the attribution (author) w/ xpath
|
62
|
+
end
|
63
|
+
|
64
|
+
test "quote block with section body" do
|
65
|
+
output = render_string("____\nFamous quote.\n\nNOTE: That was inspiring.\n____")
|
66
|
+
assert_xpath '//*[@class = "quoteblock"]', output, 1
|
67
|
+
assert_xpath '//*[@class = "quoteblock"]//*[@class = "admonitionblock"]', output, 1
|
68
|
+
end
|
69
|
+
|
70
|
+
test "single-line quote paragraph" do
|
71
|
+
output = render_string("[quote]\nFamous quote.")
|
72
|
+
assert_xpath '//*[@class = "quoteblock"]', output, 1
|
73
|
+
assert_xpath '//*[@class = "quoteblock"]//p', output, 0
|
74
|
+
assert_xpath '//*[@class = "quoteblock"]//*[contains(text(), "Famous quote.")]', output, 1
|
75
|
+
end
|
76
|
+
|
77
|
+
test "verse paragraph" do
|
78
|
+
output = render_string("[verse]\nFamous verse.")
|
79
|
+
assert_xpath '//*[@class = "verseblock"]', output, 1
|
80
|
+
assert_xpath '//*[@class = "verseblock"]/pre', output, 1
|
81
|
+
assert_xpath '//*[@class = "verseblock"]//p', output, 0
|
82
|
+
assert_xpath '//*[@class = "verseblock"]/pre[normalize-space(text()) = "Famous verse."]', output, 1
|
83
|
+
end
|
84
|
+
|
85
|
+
test "single-line verse block" do
|
86
|
+
output = render_string("[verse]\n____\nFamous verse.\n____")
|
87
|
+
assert_xpath '//*[@class = "verseblock"]', output, 1
|
88
|
+
assert_xpath '//*[@class = "verseblock"]/pre', output, 1
|
89
|
+
assert_xpath '//*[@class = "verseblock"]//p', output, 0
|
90
|
+
assert_xpath '//*[@class = "verseblock"]/pre[normalize-space(text()) = "Famous verse."]', output, 1
|
91
|
+
end
|
92
|
+
|
93
|
+
test "multi-line verse block" do
|
94
|
+
output = render_string("[verse]\n____\nFamous verse.\n\nStanza two.\n____")
|
95
|
+
assert_xpath '//*[@class = "verseblock"]', output, 1
|
96
|
+
assert_xpath '//*[@class = "verseblock"]/pre', output, 1
|
97
|
+
assert_xpath '//*[@class = "verseblock"]//p', output, 0
|
98
|
+
assert_xpath '//*[@class = "verseblock"]/pre[contains(text(), "Famous verse.")]', output, 1
|
99
|
+
assert_xpath '//*[@class = "verseblock"]/pre[contains(text(), "Stanza two.")]', output, 1
|
100
|
+
end
|
101
|
+
|
102
|
+
test "verse block does not contain block elements" do
|
103
|
+
output = render_string("[verse]\n____\nFamous verse.\n\n....\nnot a literal\n....\n____")
|
104
|
+
assert_xpath '//*[@class = "verseblock"]', output, 1
|
105
|
+
assert_xpath '//*[@class = "verseblock"]/pre', output, 1
|
106
|
+
assert_xpath '//*[@class = "verseblock"]//p', output, 0
|
107
|
+
assert_xpath '//*[@class = "verseblock"]//*[@class = "literalblock"]', output, 0
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
34
111
|
context "special" do
|
35
112
|
test "note multiline syntax" do
|
36
|
-
|
113
|
+
Asciidoctor::ADMONITION_STYLES.each do |style|
|
114
|
+
assert_xpath "//div[@class='admonitionblock']", render_string("[#{style}]\nThis is a winner.")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
test "note block syntax" do
|
119
|
+
Asciidoctor::ADMONITION_STYLES.each do |style|
|
120
|
+
assert_xpath "//div[@class='admonitionblock']", render_string("[#{style}]\n====\nThis is a winner.\n====")
|
121
|
+
end
|
37
122
|
end
|
38
123
|
|
39
124
|
test "note inline syntax" do
|
40
|
-
|
125
|
+
Asciidoctor::ADMONITION_STYLES.each do |style|
|
126
|
+
assert_xpath "//div[@class='admonitionblock']", render_string("#{style}: This is important, fool!")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
test "sidebar block" do
|
131
|
+
input = <<-EOS
|
132
|
+
== Section
|
133
|
+
|
134
|
+
.Sidebar
|
135
|
+
****
|
136
|
+
Content goes here
|
137
|
+
****
|
138
|
+
EOS
|
139
|
+
result = render_string(input)
|
140
|
+
assert_xpath "//*[@class='sidebarblock']//p", result, 1
|
41
141
|
end
|
42
142
|
end
|
43
143
|
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
context 'Preamble' do
|
4
|
+
|
5
|
+
test 'title and single paragraph preamble before section' do
|
6
|
+
input = <<-EOS
|
7
|
+
Title
|
8
|
+
=====
|
9
|
+
|
10
|
+
Preamble paragraph 1.
|
11
|
+
|
12
|
+
== First Section
|
13
|
+
|
14
|
+
Section paragraph 1.
|
15
|
+
EOS
|
16
|
+
result = render_string(input)
|
17
|
+
assert_xpath '//p', result, 2
|
18
|
+
assert_xpath '//*[@id="preamble"]', result, 1
|
19
|
+
assert_xpath '//*[@id="preamble"]//p', result, 1
|
20
|
+
assert_xpath '//*[@id="preamble"]/following-sibling::*//h2[@id="_first_section"]', result, 1
|
21
|
+
assert_xpath '//*[@id="preamble"]/following-sibling::*//p', result, 1
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'title and multi-paragraph preamble before section' do
|
25
|
+
input = <<-EOS
|
26
|
+
Title
|
27
|
+
=====
|
28
|
+
|
29
|
+
Preamble paragraph 1.
|
30
|
+
|
31
|
+
Preamble paragraph 2.
|
32
|
+
|
33
|
+
== First Section
|
34
|
+
|
35
|
+
Section paragraph 1.
|
36
|
+
EOS
|
37
|
+
result = render_string(input)
|
38
|
+
assert_xpath '//p', result, 3
|
39
|
+
assert_xpath '//*[@id="preamble"]', result, 1
|
40
|
+
assert_xpath '//*[@id="preamble"]//p', result, 2
|
41
|
+
assert_xpath '//*[@id="preamble"]/following-sibling::*//h2[@id="_first_section"]', result, 1
|
42
|
+
assert_xpath '//*[@id="preamble"]/following-sibling::*//p', result, 1
|
43
|
+
end
|
44
|
+
|
45
|
+
test 'title and preamble only' do
|
46
|
+
input = <<-EOS
|
47
|
+
Title
|
48
|
+
=====
|
49
|
+
|
50
|
+
Preamble paragraph 1.
|
51
|
+
EOS
|
52
|
+
result = render_string(input)
|
53
|
+
assert_xpath '//p', result, 1
|
54
|
+
assert_xpath '//*[@id="preamble"]', result, 1
|
55
|
+
assert_xpath '//*[@id="preamble"]//p', result, 1
|
56
|
+
assert_xpath '//*[@id="preamble"]/following-sibling::*', result, 0
|
57
|
+
end
|
58
|
+
|
59
|
+
test 'title and section without preamble' do
|
60
|
+
input = <<-EOS
|
61
|
+
Title
|
62
|
+
=====
|
63
|
+
|
64
|
+
== First Section
|
65
|
+
|
66
|
+
Section paragraph 1.
|
67
|
+
EOS
|
68
|
+
result = render_string(input)
|
69
|
+
assert_xpath '//p', result, 1
|
70
|
+
assert_xpath '//*[@id="preamble"]', result, 0
|
71
|
+
assert_xpath '//h2[@id="_first_section"]', result, 1
|
72
|
+
end
|
73
|
+
|
74
|
+
test 'no title with preamble and section' do
|
75
|
+
input = <<-EOS
|
76
|
+
Preamble paragraph 1.
|
77
|
+
|
78
|
+
== First Section
|
79
|
+
|
80
|
+
Section paragraph 1.
|
81
|
+
EOS
|
82
|
+
result = render_string(input)
|
83
|
+
assert_xpath '//p', result, 2
|
84
|
+
assert_xpath '//*[@id="preamble"]', result, 0
|
85
|
+
assert_xpath '//h2[@id="_first_section"]/preceding::p', result, 1
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -50,7 +50,8 @@ class Test::Unit::TestCase
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def assert_xpath(xpath, html, count = nil)
|
53
|
-
|
53
|
+
doc = (html =~ /\s*<!DOCTYPE/) ? Nokogiri::HTML::Document.parse(html) : Nokogiri::HTML::DocumentFragment.parse(html)
|
54
|
+
results = doc.xpath("#{xpath.sub('/', './')}")
|
54
55
|
|
55
56
|
if (count && results.length != count)
|
56
57
|
flunk "XPath #{xpath} yielded #{results.length} elements rather than #{count} for:\n#{html}"
|
@@ -61,12 +62,12 @@ class Test::Unit::TestCase
|
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
64
|
-
def document_from_string(src)
|
65
|
-
Asciidoctor::Document.new(src.
|
65
|
+
def document_from_string(src, opts = {})
|
66
|
+
Asciidoctor::Document.new(src.lines.entries, opts)
|
66
67
|
end
|
67
68
|
|
68
|
-
def render_string(src)
|
69
|
-
document_from_string(src).render
|
69
|
+
def render_string(src, opts = {})
|
70
|
+
document_from_string(src, opts).render
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
data/test/text_test.rb
CHANGED
@@ -16,7 +16,8 @@ context "Text" do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
test "separator" do
|
19
|
-
|
19
|
+
# for some reason, the html enclosure breaks the xpath //*[@id='content']//hr
|
20
|
+
assert_xpath "//*[@id='content']//hr", render_string("This is separated.\n\n'''\n\n...from this!"), 1
|
20
21
|
end
|
21
22
|
|
22
23
|
test "emphasized text" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asciidoctor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-12-
|
13
|
+
date: 2012-12-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: json
|
@@ -118,7 +118,7 @@ extra_rdoc_files:
|
|
118
118
|
- LICENSE
|
119
119
|
files:
|
120
120
|
- LICENSE
|
121
|
-
- README.
|
121
|
+
- README.asciidoc
|
122
122
|
- Rakefile
|
123
123
|
- asciidoctor.gemspec
|
124
124
|
- bin/asciidoctor
|
@@ -145,8 +145,9 @@ files:
|
|
145
145
|
- test/headers_test.rb
|
146
146
|
- test/lexer_test.rb
|
147
147
|
- test/links_test.rb
|
148
|
-
- test/
|
148
|
+
- test/lists_test.rb
|
149
149
|
- test/paragraphs_test.rb
|
150
|
+
- test/preamble_test.rb
|
150
151
|
- test/reader_test.rb
|
151
152
|
- test/test_helper.rb
|
152
153
|
- test/text_test.rb
|
@@ -181,7 +182,8 @@ test_files:
|
|
181
182
|
- test/headers_test.rb
|
182
183
|
- test/lexer_test.rb
|
183
184
|
- test/links_test.rb
|
184
|
-
- test/
|
185
|
+
- test/lists_test.rb
|
185
186
|
- test/paragraphs_test.rb
|
187
|
+
- test/preamble_test.rb
|
186
188
|
- test/reader_test.rb
|
187
189
|
- test/text_test.rb
|
data/README.md
DELETED
@@ -1,154 +0,0 @@
|
|
1
|
-
Asciidoctor
|
2
|
-
===========
|
3
|
-
|
4
|
-
Asciidoctor is a pure-ruby processor for turning
|
5
|
-
[Asciidoc](http://www.methods.co.nz/asciidoc/index.html) documents
|
6
|
-
into HTML (and, eventually, other formats perhaps).
|
7
|
-
|
8
|
-
Asciidoctor uses simple built-in ERB templates to style the output in
|
9
|
-
a way that roughly matches the default HTML output of the native
|
10
|
-
Python processor. You can override this behavior by providing
|
11
|
-
[Tilt]-compatible templates. See the Usage section for more details.
|
12
|
-
|
13
|
-
Asciidoctor currently works with Ruby 1.8.7 and 1.9.3, though I don't
|
14
|
-
know of any reason it shouldn't work with more exotic Ruby versions,
|
15
|
-
and would welcome help in testing that out.
|
16
|
-
|
17
|
-
The initial code from which asciidoctor started was from the [Git SCM
|
18
|
-
site repo][gitscm-next].
|
19
|
-
|
20
|
-
[gitscm-next]: https://github.com/github/gitscm-next
|
21
|
-
|
22
|
-
# Installation
|
23
|
-
|
24
|
-
NOTE: This gem is very immature, and as yet only supports a small
|
25
|
-
subset of Asciidoc features. Thus, you should only use it if you have
|
26
|
-
a high tolerance for bugs, failures, and generally bad and intemperate
|
27
|
-
behavior.
|
28
|
-
|
29
|
-
To install the gem:
|
30
|
-
|
31
|
-
gem install 'asciidoctor'
|
32
|
-
|
33
|
-
Or if you prefer bundler:
|
34
|
-
|
35
|
-
bundle install 'asciidoctor'
|
36
|
-
|
37
|
-
# Usage
|
38
|
-
|
39
|
-
To render a file of Asciidoc-marked-up text to html
|
40
|
-
|
41
|
-
lines = File.readlines("your_file.asc")
|
42
|
-
doc = Asciidoctor::Document.new(lines)
|
43
|
-
html = doc.render
|
44
|
-
File.open("your_file.html", "w+") do |file|
|
45
|
-
file.puts html
|
46
|
-
end
|
47
|
-
|
48
|
-
Render an Asciidoc-formatted string
|
49
|
-
|
50
|
-
doc = Asciidoctor::Document.new("*This* is it.")
|
51
|
-
puts doc.render
|
52
|
-
|
53
|
-
Asciidoctor allows you to override the default template used to render
|
54
|
-
almost any individual Asciidoc elements. If you provide a directory of
|
55
|
-
[Tilt]-compatible templates, named in a way Asciidoctor can figure out
|
56
|
-
which template goes with which element, Asciidoctor will use the
|
57
|
-
templates in this directory instead of its built-in templates for any
|
58
|
-
elements for which it finds a matching template. It will use its
|
59
|
-
default templates for everything else.
|
60
|
-
|
61
|
-
doc = Asciidoctor::Document.new("*This* is it.", :template_dir => 'templates')
|
62
|
-
puts doc.render
|
63
|
-
|
64
|
-
The Document and Section templates should begin with `document.` and
|
65
|
-
`section.`, respectively. The file extension will depend on which
|
66
|
-
Tilt-compatible format you've chosen. For ERB, they would be
|
67
|
-
`document.html.erb` and `section.html.erb`, for instance.
|
68
|
-
|
69
|
-
Specific elements, like a Paragraph or Anchor, would begin with
|
70
|
-
`section_<element>.`. So to override the default Paragraph template
|
71
|
-
with an ERB template you'd put a file called
|
72
|
-
`section_paragraph.html.erb` in the template directory you pass in to
|
73
|
-
`Document.new`.
|
74
|
-
|
75
|
-
For more usage examples, see the test suite.
|
76
|
-
|
77
|
-
[Tilt]: https://github.com/rtomayko/tilt
|
78
|
-
|
79
|
-
## Contributing
|
80
|
-
In the spirit of [free software][free-sw], **everyone** is encouraged to help
|
81
|
-
improve this project.
|
82
|
-
|
83
|
-
[free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
|
84
|
-
|
85
|
-
Here are some ways *you* can contribute:
|
86
|
-
|
87
|
-
* by using alpha, beta, and prerelease versions
|
88
|
-
* by reporting bugs
|
89
|
-
* by suggesting new features
|
90
|
-
* by writing or editing documentation
|
91
|
-
* by writing specifications
|
92
|
-
* by writing code (**no patch is too small**: fix typos, add comments, clean up
|
93
|
-
inconsistent whitespace)
|
94
|
-
* by refactoring code
|
95
|
-
* by fixing [issues][]
|
96
|
-
* by reviewing patches
|
97
|
-
|
98
|
-
[issues]: https://github.com/erebor/asciidoctor/issues
|
99
|
-
|
100
|
-
## Submitting an Issue
|
101
|
-
We use the [GitHub issue tracker][issues] to track bugs and
|
102
|
-
features. Before submitting a bug report or feature request, check to
|
103
|
-
make sure it hasn't already been submitted. When submitting a bug
|
104
|
-
report, please include a [Gist][] that includes any details that may
|
105
|
-
help reproduce the bug, including your gem version, Ruby version, and
|
106
|
-
operating system.
|
107
|
-
|
108
|
-
Most importantly, since asciidoctor is a text processor, reproducing
|
109
|
-
most bugs requires that we have some snippet of text on which
|
110
|
-
asciidoctor exhibits the bad behavior.
|
111
|
-
|
112
|
-
An ideal bug report would include a pull request with failing
|
113
|
-
specs.
|
114
|
-
|
115
|
-
[gist]: https://gist.github.com/
|
116
|
-
|
117
|
-
## Submitting a Pull Request
|
118
|
-
1. [Fork the repository.][fork]
|
119
|
-
2. [Create a topic branch.][branch]
|
120
|
-
3. Add tests for your unimplemented feature or bug fix.
|
121
|
-
4. Run `bundle exec rake`. If your tests pass, return to step 3.
|
122
|
-
5. Implement your feature or bug fix.
|
123
|
-
6. Run `bundle exec rake`. If your tests fail, return to step 5.
|
124
|
-
7. Add documentation for your feature or bug fix.
|
125
|
-
8. If your changes are not 100% documented, go back to step 7.
|
126
|
-
9. Add, commit, and push your changes.
|
127
|
-
10. [Submit a pull request.][pr]
|
128
|
-
|
129
|
-
[fork]: http://help.github.com/fork-a-repo/
|
130
|
-
[branch]: http://learn.github.com/p/branching.html
|
131
|
-
[pr]: http://help.github.com/send-pull-requests/
|
132
|
-
|
133
|
-
## Supported Ruby Versions
|
134
|
-
This library aims to support the following Ruby implementations:
|
135
|
-
|
136
|
-
* Ruby 1.8.7
|
137
|
-
* Ruby 1.9.3
|
138
|
-
|
139
|
-
If something doesn't work on one of these interpreters, it should be
|
140
|
-
considered a bug.
|
141
|
-
|
142
|
-
If you would like this library to support another Ruby version, you
|
143
|
-
may volunteer to be a maintainer. Being a maintainer entails making
|
144
|
-
sure all tests run and pass on that implementation. When something
|
145
|
-
breaks on your implementation, you will be personally responsible for
|
146
|
-
providing patches in a timely fashion. If critical issues for a
|
147
|
-
particular implementation exist at the time of a major release,
|
148
|
-
support for that Ruby version may be dropped.
|
149
|
-
|
150
|
-
## Copyright
|
151
|
-
Copyright (c) 2012 Ryan Waldron.
|
152
|
-
See [LICENSE][] for details.
|
153
|
-
|
154
|
-
[license]: https://github.com/erebor/asciidoctor/blob/master/LICENSE
|