bluefeather 0.10
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/Rakefile.rb +168 -0
- data/bin/bluefeather +4 -0
- data/doc/author-and-license.bfdoc +16 -0
- data/doc/base.css +135 -0
- data/doc/basic-usage.bfdoc +265 -0
- data/doc/black.css +130 -0
- data/doc/class-reference.bfdoc +105 -0
- data/doc/difference.bfdoc +63 -0
- data/doc/en/author-and-license.bfdoc +20 -0
- data/doc/en/base.css +136 -0
- data/doc/en/basic-usage.bfdoc +266 -0
- data/doc/en/black.css +130 -0
- data/doc/en/class-reference.bfdoc +6 -0
- data/doc/en/difference.bfdoc +72 -0
- data/doc/en/format-extension.bfdoc +324 -0
- data/doc/en/index.bfdoc +41 -0
- data/doc/en/metadata-reference.bfdoc +7 -0
- data/doc/format-extension.bfdoc +325 -0
- data/doc/index.bfdoc +36 -0
- data/doc/metadata-reference.bfdoc +86 -0
- data/lib/bluefeather.rb +1872 -0
- data/lib/bluefeather/cui.rb +207 -0
- data/license/gpl-2.0.txt +339 -0
- data/license/gpl.ja.txt +416 -0
- data/original-tests/00_Class.tests.rb +42 -0
- data/original-tests/05_Markdown.tests.rb +1530 -0
- data/original-tests/10_Bug.tests.rb +44 -0
- data/original-tests/15_Contrib.tests.rb +130 -0
- data/original-tests/bftestcase.rb +278 -0
- data/original-tests/data/antsugar.txt +34 -0
- data/original-tests/data/ml-announce.txt +17 -0
- data/original-tests/data/re-overflow.txt +67 -0
- data/original-tests/data/re-overflow2.txt +281 -0
- data/readme_en.txt +37 -0
- data/readme_ja.txt +33 -0
- data/spec/auto-link.rb +100 -0
- data/spec/code-block.rb +91 -0
- data/spec/dl.rb +182 -0
- data/spec/escape-char.rb +18 -0
- data/spec/footnote.rb +34 -0
- data/spec/header-id.rb +38 -0
- data/spec/lib/common.rb +103 -0
- data/spec/table.rb +70 -0
- data/spec/toc.rb +64 -0
- data/spec/warning.rb +61 -0
- metadata +99 -0
data/spec/lib/common.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
begin
|
2
|
+
require 'rubygems'
|
3
|
+
rescue
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'pathname'
|
7
|
+
$LOAD_PATH.unshift Pathname.new(__FILE__).dirname.parent.parent + 'lib/'
|
8
|
+
|
9
|
+
require 'bluefeather'
|
10
|
+
require 'hpricot'
|
11
|
+
|
12
|
+
module HpricotMatcher
|
13
|
+
class HaveElement
|
14
|
+
def initialize(selector)
|
15
|
+
@selector = selector
|
16
|
+
end
|
17
|
+
|
18
|
+
def description
|
19
|
+
"have element"
|
20
|
+
end
|
21
|
+
|
22
|
+
def matches?(target)
|
23
|
+
@target = target
|
24
|
+
|
25
|
+
return !(@target.search(@selector).empty?)
|
26
|
+
end
|
27
|
+
|
28
|
+
def failure_message
|
29
|
+
%Q|expected an element selected by '#{@selector}', got no element\n(html: #{@target.to_s.inspect})|
|
30
|
+
end
|
31
|
+
|
32
|
+
def negative_failure_message
|
33
|
+
%Q|expected no element selected by '#{@selector}', got an element\n(html: #{@target.to_s.inspect})|
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class HaveElements
|
38
|
+
def initialize(number, selector)
|
39
|
+
@number, @selector = number, selector
|
40
|
+
end
|
41
|
+
|
42
|
+
def description
|
43
|
+
"have elements"
|
44
|
+
end
|
45
|
+
|
46
|
+
def matches?(target)
|
47
|
+
@target = target
|
48
|
+
|
49
|
+
@found_number = @target.search(@selector).size
|
50
|
+
return @found_number == @number
|
51
|
+
end
|
52
|
+
|
53
|
+
def failure_message
|
54
|
+
%Q|expected #{@number} elements selected by '#{@selector}', got #{@found_number} elements\n(html: #{@target.to_s.inspect})|
|
55
|
+
end
|
56
|
+
|
57
|
+
def negative_failure_message
|
58
|
+
%Q|not expected #{@number} elements selected by '#{@selector}', got #{@found_number} elements\n(html: #{@target.to_s.inspect})|
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
# ex) doc.should have_element('div table')
|
65
|
+
def have_element(selector)
|
66
|
+
HpricotMatcher::HaveElement.new(selector)
|
67
|
+
end
|
68
|
+
|
69
|
+
alias have_element_as have_element
|
70
|
+
|
71
|
+
# ex) doc.should have_elements(3, 'p')
|
72
|
+
def have_elements(number, selector)
|
73
|
+
HpricotMatcher::HaveElements.new(number, selector)
|
74
|
+
end
|
75
|
+
|
76
|
+
alias have_elements_as have_elements
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
=begin
|
81
|
+
# new matcher
|
82
|
+
class String
|
83
|
+
def to_xml
|
84
|
+
REXML::Document.new("<xml>#{self}</xml>")
|
85
|
+
end
|
86
|
+
|
87
|
+
def xml_as?(other)
|
88
|
+
a = REXML::Document.new("<xml>#{self}</xml>")
|
89
|
+
b = REXML::Document.new("<xml>#{other}</xml>")
|
90
|
+
|
91
|
+
a == b
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# comparable
|
96
|
+
module REXML
|
97
|
+
class Element
|
98
|
+
def ==(other)
|
99
|
+
text == other.text and attributes == other.attributes and children == other.children
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
=end
|
data/spec/table.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require(Pathname.new(__FILE__).parent + 'lib/common.rb')
|
3
|
+
|
4
|
+
|
5
|
+
describe 'Simple Table:' do
|
6
|
+
before(:each) do
|
7
|
+
@bf = BlueFeather::Parser.new
|
8
|
+
|
9
|
+
@html = @bf.parse_text(@src)
|
10
|
+
@doc = Hpricot(@html)
|
11
|
+
end
|
12
|
+
|
13
|
+
share_as :StandardTable do
|
14
|
+
specify "regexp matching" do
|
15
|
+
@src.should =~ BlueFeather::Parser::TableRegexp
|
16
|
+
end
|
17
|
+
|
18
|
+
specify "table overview" do
|
19
|
+
@doc.should have_elements(1, 'table')
|
20
|
+
end
|
21
|
+
|
22
|
+
specify "size 3x3" do
|
23
|
+
@doc.should have_elements(3, 'tr')
|
24
|
+
@doc.should have_elements(1, 'thead tr')
|
25
|
+
@doc.should have_elements(2, 'tbody tr')
|
26
|
+
@doc.should have_elements(3, 'thead tr th')
|
27
|
+
@doc.should have_elements(6, 'tbody tr td')
|
28
|
+
end
|
29
|
+
|
30
|
+
specify "alignment" do
|
31
|
+
@doc.search('tr').each do |tr|
|
32
|
+
cells = tr.search('th, td')
|
33
|
+
cells[0]['style'].should be_nil
|
34
|
+
cells[1]['style'].should == 'text-align: right'
|
35
|
+
cells[2]['style'].should == 'text-align: center'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
describe 'no-doubleline' do
|
42
|
+
include StandardTable
|
43
|
+
|
44
|
+
before(:all) do
|
45
|
+
@src = "|h1|h2|h3\n|-|-:|:-:\n|d11|d21|d31\n|d12|d22|d32"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
describe 'doubleline: ' do
|
52
|
+
include StandardTable
|
53
|
+
|
54
|
+
before(:all) do
|
55
|
+
@src = "|h1|h2|h3|\n|-|-:|:-:|\n|d11|d21|d31|\n|d12|d22|d32|"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'inner space:' do
|
60
|
+
include StandardTable
|
61
|
+
|
62
|
+
before(:all) do
|
63
|
+
@src = "| h1 | h2 | h3 \n| - | -: | :-: \n| d11 | d21 | d31\n| d12 | d22 | d32"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
end
|
data/spec/toc.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require(Pathname.new(__FILE__).parent + 'lib/common.rb')
|
3
|
+
|
4
|
+
|
5
|
+
describe 'TOC:' do
|
6
|
+
before(:each) do
|
7
|
+
@bf = BlueFeather::Parser.new
|
8
|
+
@html = @bf.parse_text(@src)
|
9
|
+
@doc = Hpricot(@html)
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
describe 'basic:' do
|
14
|
+
before(:all) do
|
15
|
+
@src = <<-MARKDOWN
|
16
|
+
{toc}
|
17
|
+
|
18
|
+
# h1 #
|
19
|
+
## h2a ##
|
20
|
+
## h2b ##
|
21
|
+
### h3a ###
|
22
|
+
### h3b ###
|
23
|
+
### h3c ###
|
24
|
+
## h2c ##
|
25
|
+
MARKDOWN
|
26
|
+
end
|
27
|
+
|
28
|
+
specify 'overview' do
|
29
|
+
@doc.should have_element('ul')
|
30
|
+
@doc.should have_elements(1, 'h1')
|
31
|
+
@doc.should have_elements(3, 'h2')
|
32
|
+
@doc.should have_elements(3, 'h3')
|
33
|
+
end
|
34
|
+
|
35
|
+
specify 'list structure' do
|
36
|
+
toc = @doc.at('ul')
|
37
|
+
toc['class'] = 'toc'
|
38
|
+
|
39
|
+
@doc.should have_elements(3, 'ul.toc > li')
|
40
|
+
@doc.should have_elements(1, 'ul.toc > li > ul')
|
41
|
+
@doc.should have_elements(3, 'ul.toc > li > ul > li')
|
42
|
+
end
|
43
|
+
|
44
|
+
specify 'list content' do
|
45
|
+
toc = @doc.at('ul')
|
46
|
+
toc['class'] = 'toc'
|
47
|
+
|
48
|
+
items1 = @doc.search('ul.toc > li')
|
49
|
+
items1[0].inner_text.should == 'h2a'
|
50
|
+
items1[2].inner_text.should == 'h2c'
|
51
|
+
|
52
|
+
items2 = @doc.search('ul.toc > li > ul > li')
|
53
|
+
items2[0].inner_text.should == 'h3a'
|
54
|
+
items2[1].inner_text.should == 'h3b'
|
55
|
+
items2[2].inner_text.should == 'h3c'
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
end
|
data/spec/warning.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'bluefeather'
|
2
|
+
|
3
|
+
describe 'Warning:' do
|
4
|
+
before(:all) do
|
5
|
+
@bf = BlueFeather::Parser.new
|
6
|
+
end
|
7
|
+
|
8
|
+
specify "header level" do
|
9
|
+
html, rs = @bf.parse_text_with_render_state('###### h6')
|
10
|
+
rs.warnings.size.should == 0
|
11
|
+
|
12
|
+
html, rs = @bf.parse_text_with_render_state('####### h7')
|
13
|
+
rs.warnings.size.should == 1
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
specify "header id" do
|
18
|
+
html, rs = @bf.parse_text_with_render_state('# header # {#legal}')
|
19
|
+
rs.warnings.size.should == 0
|
20
|
+
|
21
|
+
html, rs = @bf.parse_text_with_render_state('# header # {#99illegal}')
|
22
|
+
rs.warnings.size.should == 1
|
23
|
+
|
24
|
+
html, rs = @bf.parse_text_with_render_state('# header # {#ille?gal}')
|
25
|
+
rs.warnings.size.should == 1
|
26
|
+
end
|
27
|
+
|
28
|
+
specify "link id reference" do
|
29
|
+
html, rs = @bf.parse_text_with_render_state("[markdown][]\n\n[markdown]: -")
|
30
|
+
rs.warnings.size.should == 0
|
31
|
+
|
32
|
+
html, rs = @bf.parse_text_with_render_state("[unknown][]\n\n[markdown]: -")
|
33
|
+
rs.warnings.size.should == 1
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
specify "footnote id" do
|
39
|
+
html, rs = @bf.parse_text_with_render_state('[^markdown]: -')
|
40
|
+
rs.warnings.size.should == 0
|
41
|
+
|
42
|
+
html, rs = @bf.parse_text_with_render_state('[^mark?down]: -')
|
43
|
+
rs.warnings.size.should == 1
|
44
|
+
end
|
45
|
+
|
46
|
+
specify "footnote reference" do
|
47
|
+
html, rs = @bf.parse_text_with_render_state("[^1]\n\n[^1]: -")
|
48
|
+
rs.warnings.size.should == 0
|
49
|
+
|
50
|
+
html, rs = @bf.parse_text_with_render_state("[^unknown]")
|
51
|
+
rs.warnings.size.should == 1
|
52
|
+
end
|
53
|
+
|
54
|
+
specify "toc parameter" do
|
55
|
+
html, rs = @bf.parse_text_with_render_state("{toc:h2..}")
|
56
|
+
rs.warnings.size.should == 0
|
57
|
+
|
58
|
+
html, rs = @bf.parse_text_with_render_state("{toc:h21..}")
|
59
|
+
rs.warnings.size.should == 1
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bluefeather
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.10"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dice
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-24 00:00:00 +09:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: BlueFeather is software for converting text written by extended Markdown to html. It is pair of command-line tool and pure Ruby library.
|
17
|
+
email: tetradice@gmail.com
|
18
|
+
executables:
|
19
|
+
- bluefeather
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- readme_en.txt
|
26
|
+
- readme_ja.txt
|
27
|
+
- Rakefile.rb
|
28
|
+
- bin/bluefeather
|
29
|
+
- lib/bluefeather.rb
|
30
|
+
- lib/bluefeather/cui.rb
|
31
|
+
- license/gpl-2.0.txt
|
32
|
+
- license/gpl.ja.txt
|
33
|
+
- spec/auto-link.rb
|
34
|
+
- spec/code-block.rb
|
35
|
+
- spec/dl.rb
|
36
|
+
- spec/escape-char.rb
|
37
|
+
- spec/footnote.rb
|
38
|
+
- spec/header-id.rb
|
39
|
+
- spec/lib
|
40
|
+
- spec/lib/common.rb
|
41
|
+
- spec/table.rb
|
42
|
+
- spec/toc.rb
|
43
|
+
- spec/warning.rb
|
44
|
+
- original-tests/00_Class.tests.rb
|
45
|
+
- original-tests/05_Markdown.tests.rb
|
46
|
+
- original-tests/10_Bug.tests.rb
|
47
|
+
- original-tests/15_Contrib.tests.rb
|
48
|
+
- original-tests/bftestcase.rb
|
49
|
+
- original-tests/data
|
50
|
+
- original-tests/data/antsugar.txt
|
51
|
+
- original-tests/data/ml-announce.txt
|
52
|
+
- original-tests/data/re-overflow.txt
|
53
|
+
- original-tests/data/re-overflow2.txt
|
54
|
+
- doc/author-and-license.bfdoc
|
55
|
+
- doc/base.css
|
56
|
+
- doc/basic-usage.bfdoc
|
57
|
+
- doc/black.css
|
58
|
+
- doc/class-reference.bfdoc
|
59
|
+
- doc/difference.bfdoc
|
60
|
+
- doc/en/author-and-license.bfdoc
|
61
|
+
- doc/en/base.css
|
62
|
+
- doc/en/basic-usage.bfdoc
|
63
|
+
- doc/en/black.css
|
64
|
+
- doc/en/class-reference.bfdoc
|
65
|
+
- doc/en/difference.bfdoc
|
66
|
+
- doc/en/format-extension.bfdoc
|
67
|
+
- doc/en/index.bfdoc
|
68
|
+
- doc/en/metadata-reference.bfdoc
|
69
|
+
- doc/format-extension.bfdoc
|
70
|
+
- doc/index.bfdoc
|
71
|
+
- doc/metadata-reference.bfdoc
|
72
|
+
has_rdoc: false
|
73
|
+
homepage: http://ruby.morphball.net/bluefeather/
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 1.8.1
|
84
|
+
version:
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
90
|
+
version:
|
91
|
+
requirements: []
|
92
|
+
|
93
|
+
rubyforge_project: bluefeather
|
94
|
+
rubygems_version: 1.3.1
|
95
|
+
signing_key:
|
96
|
+
specification_version: 2
|
97
|
+
summary: Extend Markdown Converter
|
98
|
+
test_files: []
|
99
|
+
|