lilac 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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +112 -0
- data/Rakefile +10 -0
- data/bin/lilac +58 -0
- data/lib/lilac.rb +6 -0
- data/lib/lilac/cli.rb +13 -0
- data/lib/lilac/list.rb +24 -0
- data/lib/lilac/parser.rb +66 -0
- data/lib/lilac/renderer.rb +42 -0
- data/lib/lilac/version.rb +3 -0
- data/lilac.gemspec +23 -0
- data/test/integration/asciidoc_test.rb +100 -0
- data/test/integration/markdown_test.rb +101 -0
- data/test/lilac_test.rb +31 -0
- data/test/list_test.rb +14 -0
- data/test/parser_test.rb +124 -0
- data/test/renderer_test.rb +42 -0
- data/test/test_helper.rb +2 -0
- metadata +114 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a9ba7b0c9acb613529808fee0ed9d298393805ea
|
4
|
+
data.tar.gz: 9d6eaf1830d69253ac70a57a632fbac053a934f8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ef2de1600cc3e66d7775d7fc9a610fca7a7e33aac4ba281f280f0d697d4348f8e47732f38b2c1ec1d1acc9fc44bd56e2c7c58a32b43b3b634eb74d6aa2e67ce7
|
7
|
+
data.tar.gz: 576328c54533f17f83e3e138032914b91bdd1afe1d7bd80a5952cc3a45a41ac42eb0ae55a64a1d57f29c1d4ba02656b11e16efd91a2bee528feb4a0980f0bbef
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014,2015 Yasuhiro Asaka
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
# Lilac
|
2
|
+
|
3
|
+
Lilac (luxury indented list another converter) is list converter
|
4
|
+
that supports list styles of several lightweight markup languages.
|
5
|
+
|
6
|
+
|
7
|
+
## Supported syntax
|
8
|
+
|
9
|
+
* Asciidoc
|
10
|
+
* Markdown
|
11
|
+
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
```sh
|
16
|
+
$ git clone https://github.com/grauwoelfchen/lilac.git
|
17
|
+
```
|
18
|
+
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
### Ruby
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
text = <<TEXT
|
26
|
+
* foo
|
27
|
+
** bar
|
28
|
+
*** baz
|
29
|
+
**** qux
|
30
|
+
** quux
|
31
|
+
TEXT
|
32
|
+
|
33
|
+
list = Lilac::List.new(text)
|
34
|
+
puts list.to_html #=> <ul><li>foo<li><li><ul><li>...</li></ul></li></ul>
|
35
|
+
```
|
36
|
+
|
37
|
+
### Command line
|
38
|
+
|
39
|
+
```sh
|
40
|
+
$ lilac
|
41
|
+
* foo
|
42
|
+
** bar
|
43
|
+
*** baz
|
44
|
+
;; press ^D
|
45
|
+
<ul><li>foo</li><li><ul><li>bar</li><li><ul><li>baz</li></ul></li></ul></li></ul>
|
46
|
+
```
|
47
|
+
|
48
|
+
### Supported list styles
|
49
|
+
|
50
|
+
#### Asciidoc
|
51
|
+
|
52
|
+
```
|
53
|
+
- foo
|
54
|
+
- bar
|
55
|
+
- baz
|
56
|
+
|
57
|
+
;; p list.to_html
|
58
|
+
<ul>
|
59
|
+
<li>foo</li>
|
60
|
+
<li>bar</li>
|
61
|
+
<li>baz</li>
|
62
|
+
</ul>
|
63
|
+
```
|
64
|
+
|
65
|
+
```
|
66
|
+
* foo
|
67
|
+
** bar
|
68
|
+
*** baz
|
69
|
+
|
70
|
+
;; p list.to_html
|
71
|
+
<ul>
|
72
|
+
<li>foo</li>
|
73
|
+
<li>
|
74
|
+
<ul>
|
75
|
+
<li>bar</li>
|
76
|
+
<li>
|
77
|
+
<ul>
|
78
|
+
<li>baz</li>
|
79
|
+
</ul>
|
80
|
+
</li>
|
81
|
+
</ul>
|
82
|
+
</li>
|
83
|
+
</ul>
|
84
|
+
```
|
85
|
+
|
86
|
+
#### Markdown
|
87
|
+
|
88
|
+
```
|
89
|
+
* foo
|
90
|
+
* bar
|
91
|
+
* baz
|
92
|
+
|
93
|
+
;; p list.to_html
|
94
|
+
<ul>
|
95
|
+
<li>foo</li>
|
96
|
+
<li>
|
97
|
+
<ul>
|
98
|
+
<li>bar</li>
|
99
|
+
<li>
|
100
|
+
<ul>
|
101
|
+
<li>baz</li>
|
102
|
+
</ul>
|
103
|
+
</li>
|
104
|
+
</ul>
|
105
|
+
</li>
|
106
|
+
</ul>
|
107
|
+
```
|
108
|
+
|
109
|
+
|
110
|
+
## License
|
111
|
+
|
112
|
+
[MIT](LICENSE.txt)
|
data/Rakefile
ADDED
data/bin/lilac
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "pathname"
|
4
|
+
require "optparse"
|
5
|
+
|
6
|
+
root = Pathname.new(__FILE__).realpath.parent.parent
|
7
|
+
$:.unshift root.join("lib") if $0 == __FILE__
|
8
|
+
|
9
|
+
require "lilac"
|
10
|
+
|
11
|
+
def name
|
12
|
+
$0.gsub(/.*\//, "")
|
13
|
+
end
|
14
|
+
|
15
|
+
def help
|
16
|
+
<<-MESSAGE
|
17
|
+
Useage:
|
18
|
+
#{name} [input|option]
|
19
|
+
-v, --version Show version of gem.
|
20
|
+
-h, --helf Show this message.
|
21
|
+
MESSAGE
|
22
|
+
end
|
23
|
+
|
24
|
+
opts = {
|
25
|
+
path: nil
|
26
|
+
}
|
27
|
+
|
28
|
+
input = nil
|
29
|
+
|
30
|
+
filter = lambda do |v|
|
31
|
+
unless File.exists?(v)
|
32
|
+
puts "#{name}: cannot access #{v}: No such file"
|
33
|
+
exit 1
|
34
|
+
end
|
35
|
+
opts[key] = v
|
36
|
+
end
|
37
|
+
|
38
|
+
parser = OptionParser.new
|
39
|
+
parser.on("-v", "--version") { puts Lilac::VERSION; exit }
|
40
|
+
parser.on_tail("-h", "--help") { puts help; exit }
|
41
|
+
|
42
|
+
begin
|
43
|
+
args = ARGV.dup
|
44
|
+
if args.length > 1
|
45
|
+
parser.parse!(args)
|
46
|
+
else
|
47
|
+
input = ARGF.each_line.to_a.join
|
48
|
+
end
|
49
|
+
unless input
|
50
|
+
raise OptionParser::MissingArgument
|
51
|
+
end
|
52
|
+
rescue
|
53
|
+
puts help
|
54
|
+
exit 1
|
55
|
+
end
|
56
|
+
|
57
|
+
cli = Lilac::Cli.new(opts, input)
|
58
|
+
cli.run
|
data/lib/lilac.rb
ADDED
data/lib/lilac/cli.rb
ADDED
data/lib/lilac/list.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "lilac/parser"
|
2
|
+
require "lilac/renderer"
|
3
|
+
|
4
|
+
module Lilac
|
5
|
+
class List
|
6
|
+
def initialize(text)
|
7
|
+
@text = text
|
8
|
+
@data = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_html
|
12
|
+
parse! unless @data
|
13
|
+
renderer = Lilac::Renderer.new(@data)
|
14
|
+
renderer.render
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def parse!
|
20
|
+
parser = Lilac::Parser.new(@text)
|
21
|
+
@data = parser.parse
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/lilac/parser.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
module Lilac
|
2
|
+
class Parser
|
3
|
+
def initialize(text = nil)
|
4
|
+
@text = text ? text.each_line.lazy : []
|
5
|
+
end
|
6
|
+
|
7
|
+
def parse
|
8
|
+
@text.inject([]) { |acc, line|
|
9
|
+
line = handle_bullet(line)
|
10
|
+
begin
|
11
|
+
handle_line(line, acc)
|
12
|
+
rescue
|
13
|
+
# pass
|
14
|
+
end
|
15
|
+
acc
|
16
|
+
}.lazy
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def handle_bullet(line)
|
22
|
+
# md to adoc, -|+ to *
|
23
|
+
line.gsub(/^(\s*)([\*\-\+]+)/) { |bullet|
|
24
|
+
level = $1.to_s.length
|
25
|
+
if level == 0 && $2 =~ /[\-\+]+/
|
26
|
+
"*"
|
27
|
+
elsif level > 1
|
28
|
+
"*" * (level / 2 + 1)
|
29
|
+
else
|
30
|
+
bullet.gsub(/-/, "*")
|
31
|
+
end
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def handle_line(line, acc)
|
36
|
+
if line =~ /^(\*+)\s/
|
37
|
+
level = $1.length
|
38
|
+
text = line.gsub($1, "")
|
39
|
+
if level == 1
|
40
|
+
acc << [:li, handle_text(text)]
|
41
|
+
elsif !acc.empty?
|
42
|
+
cur = ul = acc
|
43
|
+
# progression
|
44
|
+
# ** -> 2
|
45
|
+
# *** -> 5
|
46
|
+
# **** -> 8
|
47
|
+
# ***** -> 11
|
48
|
+
inspection = level * 3 - 4
|
49
|
+
inspection.times { cur = cur.last if cur }
|
50
|
+
case cur.first
|
51
|
+
when :ul
|
52
|
+
cur.last << [:li, handle_text(text)]
|
53
|
+
else
|
54
|
+
# current ul
|
55
|
+
(inspection - 2).times { ul = ul.last }
|
56
|
+
ul << [:li, [:ul, [[:li, handle_text(text)]]]]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def handle_text(line)
|
63
|
+
[:text, line.strip.chomp.gsub(/^\s*/, "")]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Lilac
|
2
|
+
class Renderer
|
3
|
+
def initialize(data = nil)
|
4
|
+
@data = data ? data : []
|
5
|
+
end
|
6
|
+
|
7
|
+
def render
|
8
|
+
@data.inject("") { |acc, (t, b)|
|
9
|
+
acc << build(t, b, 1)
|
10
|
+
acc
|
11
|
+
}.instance_eval { |rendered_list|
|
12
|
+
"<ul>#{rendered_list}</ul>"
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def build(tag, block, lv=1)
|
19
|
+
case tag
|
20
|
+
when :ul
|
21
|
+
block.map { |t, b|
|
22
|
+
build(t, b, lv)
|
23
|
+
}.join.instance_eval { |li|
|
24
|
+
"<ul>#{li}</ul>"
|
25
|
+
}
|
26
|
+
when :li
|
27
|
+
case block.first
|
28
|
+
when :text
|
29
|
+
build(:text, "<li>" + block.last.to_s + "</li>")
|
30
|
+
when :ul
|
31
|
+
block.last.map { |t, b|
|
32
|
+
build(t, b, lv + 1)
|
33
|
+
}.join.instance_eval { |li|
|
34
|
+
"<li><ul>#{li}</ul></li>"
|
35
|
+
}
|
36
|
+
end
|
37
|
+
else # text
|
38
|
+
block
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lilac.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "lilac/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "lilac"
|
7
|
+
spec.version = Lilac::VERSION
|
8
|
+
spec.authors = ["Yasuhiro Asaka"]
|
9
|
+
spec.email = ["grauwoelfchen@gmail.com"]
|
10
|
+
spec.summary = %q{Luxury Indented List Another Converter}
|
11
|
+
spec.description = %q{The Converter for various list text}
|
12
|
+
spec.homepage = ""
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
21
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
22
|
+
spec.add_development_dependency "minitest"
|
23
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class AsciidocTest < Minitest::Unit::TestCase
|
4
|
+
def test_asterisk_bullet_flat_list
|
5
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
6
|
+
* foo
|
7
|
+
* bar
|
8
|
+
* baz
|
9
|
+
TEXT
|
10
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
11
|
+
<ul>
|
12
|
+
<li>foo</li>
|
13
|
+
<li>bar</li>
|
14
|
+
<li>baz</li>
|
15
|
+
</ul>
|
16
|
+
LIST
|
17
|
+
list = Lilac::List.new(text)
|
18
|
+
assert_equal expected, list.to_html
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_hyphen_bullet_flat_list
|
22
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
23
|
+
- foo
|
24
|
+
- bar
|
25
|
+
- baz
|
26
|
+
TEXT
|
27
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
28
|
+
<ul>
|
29
|
+
<li>foo</li>
|
30
|
+
<li>bar</li>
|
31
|
+
<li>baz</li>
|
32
|
+
</ul>
|
33
|
+
LIST
|
34
|
+
list = Lilac::List.new(text)
|
35
|
+
assert_equal expected, list.to_html
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_mixed_bullet_flat_list
|
39
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
40
|
+
* foo
|
41
|
+
- bar
|
42
|
+
* baz
|
43
|
+
TEXT
|
44
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
45
|
+
<ul>
|
46
|
+
<li>foo</li>
|
47
|
+
<li>bar</li>
|
48
|
+
<li>baz</li>
|
49
|
+
</ul>
|
50
|
+
LIST
|
51
|
+
list = Lilac::List.new(text)
|
52
|
+
assert_equal expected, list.to_html
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_asterisk_bullet_2_level_depth_list
|
56
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
57
|
+
* foo
|
58
|
+
** bar
|
59
|
+
** baz
|
60
|
+
TEXT
|
61
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
62
|
+
<ul>
|
63
|
+
<li>foo</li>
|
64
|
+
<li>
|
65
|
+
<ul>
|
66
|
+
<li>bar</li>
|
67
|
+
<li>baz</li>
|
68
|
+
</ul>
|
69
|
+
</li>
|
70
|
+
</ul>
|
71
|
+
LIST
|
72
|
+
list = Lilac::List.new(text)
|
73
|
+
assert_equal expected, list.to_html
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_asterisk_bullet_3_level_depth_list
|
77
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
78
|
+
* foo
|
79
|
+
** bar
|
80
|
+
*** baz
|
81
|
+
TEXT
|
82
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
83
|
+
<ul>
|
84
|
+
<li>foo</li>
|
85
|
+
<li>
|
86
|
+
<ul>
|
87
|
+
<li>bar</li>
|
88
|
+
<li>
|
89
|
+
<ul>
|
90
|
+
<li>baz</li>
|
91
|
+
</ul>
|
92
|
+
</li>
|
93
|
+
</ul>
|
94
|
+
</li>
|
95
|
+
</ul>
|
96
|
+
LIST
|
97
|
+
list = Lilac::List.new(text)
|
98
|
+
assert_equal expected, list.to_html
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class MarkdownTest < Minitest::Unit::TestCase
|
4
|
+
def test_asterisk_bullet_flat_list
|
5
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
6
|
+
* foo
|
7
|
+
* bar
|
8
|
+
* baz
|
9
|
+
TEXT
|
10
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
11
|
+
<ul>
|
12
|
+
<li>foo</li>
|
13
|
+
<li>bar</li>
|
14
|
+
<li>baz</li>
|
15
|
+
</ul>
|
16
|
+
LIST
|
17
|
+
list = Lilac::List.new(text)
|
18
|
+
assert_equal expected, list.to_html
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_hyphen_bullet_flat_list
|
22
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
23
|
+
- foo
|
24
|
+
- bar
|
25
|
+
- baz
|
26
|
+
TEXT
|
27
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
28
|
+
<ul>
|
29
|
+
<li>foo</li>
|
30
|
+
<li>bar</li>
|
31
|
+
<li>baz</li>
|
32
|
+
</ul>
|
33
|
+
LIST
|
34
|
+
list = Lilac::List.new(text)
|
35
|
+
assert_equal expected, list.to_html
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_plus_bullet_flat_list
|
39
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
40
|
+
+ foo
|
41
|
+
+ bar
|
42
|
+
+ baz
|
43
|
+
TEXT
|
44
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
45
|
+
<ul>
|
46
|
+
<li>foo</li>
|
47
|
+
<li>bar</li>
|
48
|
+
<li>baz</li>
|
49
|
+
</ul>
|
50
|
+
LIST
|
51
|
+
list = Lilac::List.new(text)
|
52
|
+
assert_equal expected, list.to_html
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def test_asterisk_bullet_2_level_depth_list
|
57
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
58
|
+
* foo
|
59
|
+
* bar
|
60
|
+
* baz
|
61
|
+
TEXT
|
62
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
63
|
+
<ul>
|
64
|
+
<li>foo</li>
|
65
|
+
<li>
|
66
|
+
<ul>
|
67
|
+
<li>bar</li>
|
68
|
+
<li>baz</li>
|
69
|
+
</ul>
|
70
|
+
</li>
|
71
|
+
</ul>
|
72
|
+
LIST
|
73
|
+
list = Lilac::List.new(text)
|
74
|
+
assert_equal expected, list.to_html
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_asterisk_bullet_3_level_depth_list_creation
|
78
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
79
|
+
* foo
|
80
|
+
* bar
|
81
|
+
* baz
|
82
|
+
TEXT
|
83
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
84
|
+
<ul>
|
85
|
+
<li>foo</li>
|
86
|
+
<li>
|
87
|
+
<ul>
|
88
|
+
<li>bar</li>
|
89
|
+
<li>
|
90
|
+
<ul>
|
91
|
+
<li>baz</li>
|
92
|
+
</ul>
|
93
|
+
</li>
|
94
|
+
</ul>
|
95
|
+
</li>
|
96
|
+
</ul>
|
97
|
+
LIST
|
98
|
+
list = Lilac::List.new(text)
|
99
|
+
assert_equal expected, list.to_html
|
100
|
+
end
|
101
|
+
end
|
data/test/lilac_test.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "stringio"
|
2
|
+
require "test_helper"
|
3
|
+
|
4
|
+
class LilacTest < Minitest::Unit::TestCase
|
5
|
+
def test_output_from_cli_input
|
6
|
+
text = <<-TEXT.gsub(/^\s{4}/, "")
|
7
|
+
* foo
|
8
|
+
* bar
|
9
|
+
* baz
|
10
|
+
TEXT
|
11
|
+
cli = Lilac::Cli.new({}, text)
|
12
|
+
result = capture_stdout { cli.run }
|
13
|
+
expected = <<-LIST.gsub(/\n|\s/, "")
|
14
|
+
<ul>
|
15
|
+
<li>foo</li>
|
16
|
+
<li>bar</li>
|
17
|
+
<li>baz</li>
|
18
|
+
</ul>
|
19
|
+
LIST
|
20
|
+
assert_equal expected, result
|
21
|
+
end
|
22
|
+
|
23
|
+
def capture_stdout
|
24
|
+
origin = $stdout
|
25
|
+
$stdout = StringIO.new
|
26
|
+
yield
|
27
|
+
result = $stdout.string.strip
|
28
|
+
$stdout = origin
|
29
|
+
result
|
30
|
+
end
|
31
|
+
end
|
data/test/list_test.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class Lilac::ListTest < Minitest::Unit::TestCase
|
4
|
+
def test_should_returns_string
|
5
|
+
list = Lilac::List.new("* foo\n")
|
6
|
+
assert_instance_of String, list.to_html
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_should_prepare_parsed_data
|
10
|
+
list = Lilac::List.new("* foo\n")
|
11
|
+
list.send(:parse!)
|
12
|
+
assert_instance_of Enumerator::Lazy, list.instance_variable_get(:@data)
|
13
|
+
end
|
14
|
+
end
|
data/test/parser_test.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class Lilac::ParserTest < Minitest::Unit::TestCase
|
4
|
+
def test_should_returns_enumerator_lazy_object
|
5
|
+
parser = Lilac::Parser.new("* foo")
|
6
|
+
assert_instance_of Enumerator::Lazy, parser.parse
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_should_replace_hyphen_as_asterisk
|
10
|
+
parser = Lilac::Parser.new
|
11
|
+
assert_equal "* foo", parser.send(:handle_bullet, "- foo")
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_should_remove_asciidoc_hyphen_indent
|
15
|
+
parser = Lilac::Parser.new
|
16
|
+
assert_equal "* foo", parser.send(:handle_bullet, "--- foo")
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_should_not_replace_invalid_indent
|
20
|
+
parser = Lilac::Parser.new
|
21
|
+
assert_equal " * foo", parser.send(:handle_bullet, " * foo")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_should_keep_asterisk_bullet_without_indent
|
25
|
+
parser = Lilac::Parser.new
|
26
|
+
assert_equal "* foo", parser.send(:handle_bullet, "* foo")
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_replace_indent_by_2_spaces_as_2_asterisks
|
30
|
+
parser = Lilac::Parser.new
|
31
|
+
assert_equal "** foo", parser.send(:handle_bullet, " * foo")
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_should_replace_indent_of_4_spaces_as_3_asterisks
|
35
|
+
parser = Lilac::Parser.new
|
36
|
+
assert_equal "*** foo", parser.send(:handle_bullet, " * foo")
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_should_ignore_line_without_be_not_started_with_asterisk_bullet
|
40
|
+
parser = Lilac::Parser.new
|
41
|
+
acc = []
|
42
|
+
parser.send(:handle_line, "- foo", acc)
|
43
|
+
assert_equal [], acc
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_ignore_line_without_whitespace_after_bullet
|
47
|
+
parser = Lilac::Parser.new
|
48
|
+
acc = []
|
49
|
+
parser.send(:handle_line, "*foo", acc)
|
50
|
+
assert_equal [], acc
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_should_ignore_line_that_has_too_many_bullets
|
54
|
+
parser = Lilac::Parser.new
|
55
|
+
acc = []
|
56
|
+
parser.send(:handle_line, "** foo", acc)
|
57
|
+
assert_equal [], acc
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_should_extract_valid_1_level_depth_line
|
61
|
+
parser = Lilac::Parser.new
|
62
|
+
acc = []
|
63
|
+
parser.send(:handle_line, "* foo", acc)
|
64
|
+
expected = [
|
65
|
+
[:li, [:text, "foo"]]
|
66
|
+
]
|
67
|
+
assert_equal expected, acc
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_should_extract_valid_1_level_depth_multiple_lines
|
71
|
+
parser = Lilac::Parser.new
|
72
|
+
acc = [[:li, [:text, "foo"]]]
|
73
|
+
parser.send(:handle_line, "* bar", acc)
|
74
|
+
expected = [
|
75
|
+
[:li, [:text, "foo"]],
|
76
|
+
[:li, [:text, "bar"]]
|
77
|
+
]
|
78
|
+
assert_equal expected, acc
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_should_extract_valid_2_level_depth_lines
|
82
|
+
parser = Lilac::Parser.new
|
83
|
+
acc = [[:li, [:text, "foo"]]]
|
84
|
+
parser.send(:handle_line, "** bar", acc)
|
85
|
+
expected = [
|
86
|
+
[:li, [:text, "foo"]],
|
87
|
+
[:li, [:ul, [
|
88
|
+
[:li, [:text, "bar"]]
|
89
|
+
]]]
|
90
|
+
]
|
91
|
+
assert_equal expected, acc
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_should_extract_valid_3_level_depth_lines
|
95
|
+
parser = Lilac::Parser.new
|
96
|
+
acc = [
|
97
|
+
[:li, [:text, "foo"]],
|
98
|
+
[:li, [:ul, [
|
99
|
+
[:li, [:text, "bar"]]]]
|
100
|
+
]
|
101
|
+
]
|
102
|
+
parser.send(:handle_line, "*** baz", acc)
|
103
|
+
expected = [
|
104
|
+
[:li, [:text, "foo"]],
|
105
|
+
[:li, [:ul, [
|
106
|
+
[:li, [:text, "bar"]],
|
107
|
+
[:li, [:ul, [
|
108
|
+
[:li, [:text, "baz"]]
|
109
|
+
]]]
|
110
|
+
]]]
|
111
|
+
]
|
112
|
+
assert_equal expected, acc
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_should_remove_line_break
|
116
|
+
parser = Lilac::Parser.new
|
117
|
+
assert_equal [:text, "foo"], parser.send(:handle_text, "foo\n")
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_should_remove_whitespaces_in_both_side
|
121
|
+
parser = Lilac::Parser.new
|
122
|
+
assert_equal [:text, "foo"], parser.send(:handle_text, " foo \n")
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class Lilac::RendererTest < Minitest::Unit::TestCase
|
4
|
+
def test_should_return_html_string
|
5
|
+
data = [[:li, [:text, "foo"]]]
|
6
|
+
renderer = Lilac::Renderer.new(data)
|
7
|
+
assert_instance_of String, renderer.render
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_should_raise_error_without_enumerable_data
|
11
|
+
data = "invalid"
|
12
|
+
renderer = Lilac::Renderer.new(data)
|
13
|
+
assert_raises NoMethodError do
|
14
|
+
renderer.render
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_should_append_ul_tag
|
19
|
+
data = [[:li, [:text, "foo"]]]
|
20
|
+
renderer = Lilac::Renderer.new(data)
|
21
|
+
expected = "<ul><li>foo</li></ul>"
|
22
|
+
assert_equal expected, renderer.render
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_should_build_ul_tag
|
26
|
+
renderer = Lilac::Renderer.new
|
27
|
+
expected = "<ul><li>foo</li></ul>"
|
28
|
+
assert_equal expected, renderer.send(:build, :ul, [[:li, [:text, "foo"]]])
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_should_build_li_tag
|
32
|
+
renderer = Lilac::Renderer.new
|
33
|
+
expected = "<li>foo</li>"
|
34
|
+
assert_equal expected, renderer.send(:build, :li, [:text, "foo"])
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_should_build_plain_text
|
38
|
+
renderer = Lilac::Renderer.new
|
39
|
+
expected = "foo"
|
40
|
+
assert_equal expected, renderer.send(:build, :text, "foo")
|
41
|
+
end
|
42
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lilac
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Yasuhiro Asaka
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: The Converter for various list text
|
56
|
+
email:
|
57
|
+
- grauwoelfchen@gmail.com
|
58
|
+
executables:
|
59
|
+
- lilac
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- Gemfile
|
65
|
+
- LICENSE.txt
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- bin/lilac
|
69
|
+
- lib/lilac.rb
|
70
|
+
- lib/lilac/cli.rb
|
71
|
+
- lib/lilac/list.rb
|
72
|
+
- lib/lilac/parser.rb
|
73
|
+
- lib/lilac/renderer.rb
|
74
|
+
- lib/lilac/version.rb
|
75
|
+
- lilac.gemspec
|
76
|
+
- test/integration/asciidoc_test.rb
|
77
|
+
- test/integration/markdown_test.rb
|
78
|
+
- test/lilac_test.rb
|
79
|
+
- test/list_test.rb
|
80
|
+
- test/parser_test.rb
|
81
|
+
- test/renderer_test.rb
|
82
|
+
- test/test_helper.rb
|
83
|
+
homepage: ''
|
84
|
+
licenses:
|
85
|
+
- MIT
|
86
|
+
metadata: {}
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.2.2
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: Luxury Indented List Another Converter
|
107
|
+
test_files:
|
108
|
+
- test/integration/asciidoc_test.rb
|
109
|
+
- test/integration/markdown_test.rb
|
110
|
+
- test/lilac_test.rb
|
111
|
+
- test/list_test.rb
|
112
|
+
- test/parser_test.rb
|
113
|
+
- test/renderer_test.rb
|
114
|
+
- test/test_helper.rb
|