greenpepper-ruby 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/greenpepperize +71 -0
- data/bin/greenpepperrails +33 -0
- data/bin/greenpepperruby +15 -0
- data/data/greenpepper.rake +37 -0
- data/data/helper.rb +32 -0
- data/data/tags +6 -0
- data/lib/greenpepper/argumentparser.rb +161 -0
- data/lib/greenpepper/common/loadpath.rb +7 -0
- data/lib/greenpepper/context/htmlcontext.rb +26 -0
- data/lib/greenpepper/converter.rb +347 -0
- data/lib/greenpepper/core.rb +152 -0
- data/lib/greenpepper/example/collectionexample.rb +305 -0
- data/lib/greenpepper/example/dowithexample.rb +192 -0
- data/lib/greenpepper/example/exampleheader.rb +41 -0
- data/lib/greenpepper/example/examplewithfixture.rb +73 -0
- data/lib/greenpepper/example/executionresults.rb +160 -0
- data/lib/greenpepper/example/fieldaccessor.rb +36 -0
- data/lib/greenpepper/example/freetextexample.rb +51 -0
- data/lib/greenpepper/example/importexample.rb +39 -0
- data/lib/greenpepper/example/nameresolver.rb +69 -0
- data/lib/greenpepper/example/ruleforexample.rb +117 -0
- data/lib/greenpepper/example/setupexample.rb +79 -0
- data/lib/greenpepper/example/silentexample.rb +14 -0
- data/lib/greenpepper/example/unknownexample.rb +17 -0
- data/lib/greenpepper/exception/greenpepperexception.rb +57 -0
- data/lib/greenpepper/executionunit.rb +39 -0
- data/lib/greenpepper/factory/collectionexamplefactory.rb +59 -0
- data/lib/greenpepper/factory/dowithexamplefactory.rb +71 -0
- data/lib/greenpepper/factory/examplefactory.rb +14 -0
- data/lib/greenpepper/factory/freetextexamplefactory.rb +29 -0
- data/lib/greenpepper/factory/htmlexamplefactory.rb +49 -0
- data/lib/greenpepper/factory/importexamplefactory.rb +27 -0
- data/lib/greenpepper/factory/ruleforexamplefactory.rb +46 -0
- data/lib/greenpepper/factory/setupexamplefactory.rb +31 -0
- data/lib/greenpepper/factory/silentexamplefactory.rb +21 -0
- data/lib/greenpepper/factory/unknownexamplefactory.rb +16 -0
- data/lib/greenpepper/freetext.rb +164 -0
- data/lib/greenpepper/grammar/array.treetop +51 -0
- data/lib/greenpepper/grammar/arrayparser.rb +14 -0
- data/lib/greenpepper/greenpepperconfig.rb +19 -0
- data/lib/greenpepper/greenpeppertask.rb +60 -0
- data/lib/greenpepper/logger.rb +45 -0
- data/lib/greenpepper/parser/freetextparser.rb +96 -0
- data/lib/greenpepper/parser/htmlparser.rb +70 -0
- data/lib/greenpepper/parser/scenario.rb +25 -0
- data/lib/greenpepper/parser/table.rb +37 -0
- data/lib/greenpepper/parser/wikiparser.rb +26 -0
- data/lib/greenpepper/pass/freetextpass.rb +24 -0
- data/lib/greenpepper/pass/greenpepperpass.rb +92 -0
- data/lib/greenpepper/pass/tablepass.rb +38 -0
- data/lib/greenpepper/railsargumentparser.rb +46 -0
- data/lib/greenpepper/redpeppertask.rb +89 -0
- data/lib/greenpepper/repository/atlassianrepository.rb +100 -0
- data/lib/greenpepper/writer/consolewriter.rb +21 -0
- data/lib/greenpepper/writer/freetextresult.rb +233 -0
- data/lib/greenpepper/writer/freetextwriter.rb +44 -0
- data/lib/greenpepper/writer/html.rb +14 -0
- data/lib/greenpepper/writer/htmldocwriter.rb +82 -0
- data/lib/greenpepper/writer/htmlresult.rb +192 -0
- data/lib/greenpepper/writer/htmlwriter.rb +112 -0
- data/lib/greenpepper/writer/output.rb +26 -0
- data/lib/greenpepper/writer/result.rb +35 -0
- data/lib/greenpepper/writer/xmlwriter.rb +32 -0
- data/test/coreseedstest.rb +39 -0
- data/test/greenpepper/argumentparsertest.rb +162 -0
- data/test/greenpepper/common/loadpathtest.rb +24 -0
- data/test/greenpepper/common/stattest.rb +186 -0
- data/test/greenpepper/convertertest.rb +371 -0
- data/test/greenpepper/coretest.rb +159 -0
- data/test/greenpepper/example/collectionexampletest.rb +484 -0
- data/test/greenpepper/example/dowithexampletest.rb +148 -0
- data/test/greenpepper/example/exampletest.rb +28 -0
- data/test/greenpepper/example/freetextexampletest.rb +151 -0
- data/test/greenpepper/example/importexampletest.rb +79 -0
- data/test/greenpepper/example/nameresolvertest.rb +56 -0
- data/test/greenpepper/example/ruleforexampletest.rb +225 -0
- data/test/greenpepper/example/setupexampletest.rb +140 -0
- data/test/greenpepper/example/silentexampletest.rb +17 -0
- data/test/greenpepper/example/unknownexampletest.rb +17 -0
- data/test/greenpepper/factory/collectionexamplefactorytest.rb +51 -0
- data/test/greenpepper/factory/dowithexamplefactorytest.rb +48 -0
- data/test/greenpepper/factory/examplefactorytest.rb +88 -0
- data/test/greenpepper/factory/freetextexamplefactorytest.rb +54 -0
- data/test/greenpepper/factory/importexamplefactorytest.rb +40 -0
- data/test/greenpepper/factory/ruleforexamplefactorytest.rb +55 -0
- data/test/greenpepper/factory/setupexamplefactorytest.rb +29 -0
- data/test/greenpepper/factory/silentexamplefactorytest.rb +38 -0
- data/test/greenpepper/freetexttest.rb +222 -0
- data/test/greenpepper/grammar/arrayparsertest.rb +45 -0
- data/test/greenpepper/loggertest.rb +26 -0
- data/test/greenpepper/parser/freetextparsertest.rb +124 -0
- data/test/greenpepper/parser/htmlparsertest.rb +77 -0
- data/test/greenpepper/parser/wikiparsertest.rb +21 -0
- data/test/greenpepper/pass/freetextpasstest.rb +54 -0
- data/test/greenpepper/pass/greenpepperpasstest.rb +47 -0
- data/test/greenpepper/pass/tablepasstest.rb +23 -0
- data/test/greenpepper/repository/atlassionrepositorytest.rb +85 -0
- data/test/greenpepper/writer/freetextwritertest.rb +301 -0
- data/test/greenpepper/writer/htmlcollectionwritertest.rb +145 -0
- data/test/greenpepper/writer/htmldowithwritertest.rb +87 -0
- data/test/greenpepper/writer/htmlruleforwritertest.rb +147 -0
- data/test/greenpepper/writer/htmlsetupwritertest.rb +107 -0
- data/test/greenpepper/writer/htmlstatresulttest.rb +118 -0
- data/test/greenpepper/writer/htmlwriterpositiontest.rb +53 -0
- data/test/greenpepper/writer/writertest.rb +33 -0
- data/test/greenpepper/writer/xmlwritertest.rb +34 -0
- data/test/integration/collectionexampleintegrationtest.rb +64 -0
- data/test/integration/errorhandlingintegrationtest.rb +68 -0
- data/test/integration/freetextexampleintegrationtest.rb +75 -0
- data/test/integration/greenpepperexecutableintegrationtest.rb +22 -0
- data/test/integration/importexampleintegrationtest.rb +41 -0
- data/test/integration/interpretationordertest.rb +48 -0
- data/test/integration/ruleforexampleintegrationtest.rb +102 -0
- data/test/integration/securityintegrationtest.rb +30 -0
- data/test/integration/setupexampleintegrationtest.rb +31 -0
- data/test/integration/silentexampleintegrationtest.rb +29 -0
- data/test/task/greenpeppertasktest.rb +96 -0
- data/test/task/redpeppertasktest.rb +120 -0
- data/vendor/accents.rb +85 -0
- metadata +234 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
grammar ArrayGrammar
|
2
|
+
rule root
|
3
|
+
space '['? string ']'? space {
|
4
|
+
def text
|
5
|
+
array = Array.new
|
6
|
+
string.text(array)
|
7
|
+
end
|
8
|
+
}
|
9
|
+
/
|
10
|
+
string
|
11
|
+
end
|
12
|
+
|
13
|
+
rule string
|
14
|
+
value ',' value2:(string)? {
|
15
|
+
def text(array)
|
16
|
+
value.text(array)
|
17
|
+
value2.text(array)
|
18
|
+
end
|
19
|
+
}
|
20
|
+
/
|
21
|
+
value
|
22
|
+
end
|
23
|
+
|
24
|
+
rule value
|
25
|
+
space texte:('\'' txt '\'' / '"' txt '"') space {
|
26
|
+
def text(array)
|
27
|
+
array << texte.text_value if !texte.text_value.empty?
|
28
|
+
array
|
29
|
+
end
|
30
|
+
}
|
31
|
+
/
|
32
|
+
space texte:txt_without_commas space {
|
33
|
+
def text(array)
|
34
|
+
array << texte.text_value if !texte.text_value.empty?
|
35
|
+
array
|
36
|
+
end
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
rule txt_without_commas
|
41
|
+
[^\[|\]|'\'|'"'|',']*
|
42
|
+
end
|
43
|
+
|
44
|
+
rule txt
|
45
|
+
[^\[\]'\''"']*
|
46
|
+
end
|
47
|
+
|
48
|
+
rule space
|
49
|
+
[\s]*
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
=begin
|
2
|
+
authors: Edouard Murat
|
3
|
+
date: March 28, 2009
|
4
|
+
=end
|
5
|
+
require 'rubygems'
|
6
|
+
require 'treetop'
|
7
|
+
require 'greenpepper/grammar/array'
|
8
|
+
|
9
|
+
module ArrayGrammarModule
|
10
|
+
@parser = ArrayGrammarParser.new
|
11
|
+
def ArrayGrammarModule.parse(s)
|
12
|
+
array = @parser.parse(s).text
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module GreenPepper
|
2
|
+
class GreenPepperConfig
|
3
|
+
include Singleton
|
4
|
+
#GreenPepperTask
|
5
|
+
attr_accessor :spec_dir, :result_dir, :greenpepper_path
|
6
|
+
|
7
|
+
#RedPepperTask
|
8
|
+
attr_accessor :server, :path
|
9
|
+
|
10
|
+
def self.configure
|
11
|
+
yield GreenPepperConfig.instance
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.maybe_set(instance, symbol, config)
|
15
|
+
value = config.instance_variable_get(symbol)
|
16
|
+
instance.instance_variable_set symbol, value if value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
=begin
|
3
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
4
|
+
date: November 8, 2009
|
5
|
+
=end
|
6
|
+
|
7
|
+
require 'rake'
|
8
|
+
require 'rake/tasklib'
|
9
|
+
require 'greenpepper/greenpepperconfig'
|
10
|
+
|
11
|
+
module GreenPepper
|
12
|
+
class GreenPepperTask < Rake::TaskLib
|
13
|
+
attr_accessor :spec_dir, :spec_name, :result_dir, :greenpepper_path
|
14
|
+
|
15
|
+
def initialize(name)
|
16
|
+
@name = name
|
17
|
+
|
18
|
+
@spec_dir = 'greenpepper/specifications'
|
19
|
+
@spec_name = '**/*.html'
|
20
|
+
@result_dir = 'greenpepper/results'
|
21
|
+
@greenpepper_path = nil
|
22
|
+
|
23
|
+
yield self if block_given?
|
24
|
+
load_config
|
25
|
+
define
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def define
|
30
|
+
task @name do
|
31
|
+
begin
|
32
|
+
core_path = 'greenpepper/core'
|
33
|
+
core_path = File.join @greenpepper_path, core_path if @greenpepper_path
|
34
|
+
require core_path
|
35
|
+
rescue Exception => e
|
36
|
+
raise "Could not find GreenPepper core (greenpepper/core.rb)." +
|
37
|
+
" Please specify GreenPepper path in GreenPepperTask variable" +
|
38
|
+
" 'greenpepper_path'."
|
39
|
+
end
|
40
|
+
core = GreenPepper::GreenPepperCore.new
|
41
|
+
pattern = File.join @spec_dir, @spec_name
|
42
|
+
files = Dir.glob pattern
|
43
|
+
files.each{ |file|
|
44
|
+
# TODO Support sub folders in result
|
45
|
+
output = File.join @result_dir, File.basename(file)
|
46
|
+
args = [file, output]
|
47
|
+
puts "Specification: #{output}"
|
48
|
+
core.run args
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def load_config
|
54
|
+
config = GreenPepperConfig.instance
|
55
|
+
GreenPepperConfig.maybe_set self, "@spec_dir", config
|
56
|
+
GreenPepperConfig.maybe_set self, "@result_dir", config
|
57
|
+
GreenPepperConfig.maybe_set self, "@greenpepper_path", config
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
=begin
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
3
|
+
date: March 30, 2009
|
4
|
+
=end
|
5
|
+
module GreenPepper
|
6
|
+
|
7
|
+
#Very very simple logger.
|
8
|
+
class Logger
|
9
|
+
def initialize(output)
|
10
|
+
@output = output
|
11
|
+
|
12
|
+
log_file = get_log_path
|
13
|
+
|
14
|
+
@output_file = File.open(log_file, 'a')
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_log_path
|
18
|
+
if /win32/ === RUBY_PLATFORM
|
19
|
+
"C:/temp/greenpepperruby.log"
|
20
|
+
else
|
21
|
+
"/tmp/greenpepperruby.log"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
#Prints to the output
|
26
|
+
def error(message)
|
27
|
+
@output.puts message
|
28
|
+
end
|
29
|
+
|
30
|
+
#Print to log file
|
31
|
+
def log(message)
|
32
|
+
@output_file.puts message if @output_file
|
33
|
+
end
|
34
|
+
|
35
|
+
def log_error(message)
|
36
|
+
error message
|
37
|
+
log message
|
38
|
+
end
|
39
|
+
|
40
|
+
#Close the log file
|
41
|
+
def close
|
42
|
+
@output_file.close
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
=begin
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
3
|
+
date: October 3, 2009
|
4
|
+
=end
|
5
|
+
|
6
|
+
module GreenPepper
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'libxml'
|
10
|
+
require 'greenpepper/parser/scenario'
|
11
|
+
require 'greenpepper/executionunit'
|
12
|
+
require 'greenpepper/context/htmlcontext'
|
13
|
+
|
14
|
+
class FreeTextParser
|
15
|
+
|
16
|
+
def extract_content(document, filename = 'UNKNOWN')
|
17
|
+
doc = load_doc document, filename
|
18
|
+
extract_scenarios_from_html(doc)
|
19
|
+
end
|
20
|
+
|
21
|
+
def replace_scenarios(document, html_results)
|
22
|
+
doc = load_doc document
|
23
|
+
pres = find_free_text_pre doc
|
24
|
+
if pres.size != html_results.size
|
25
|
+
raise GreenPepperError.new("Mismatch in result size.")
|
26
|
+
end
|
27
|
+
|
28
|
+
pres.each_with_index{ |pre, index|
|
29
|
+
new = (LibXML::XML::Parser.string(
|
30
|
+
"<div>#{html_results[index]}</div>",
|
31
|
+
:encoding => LibXML::XML::Encoding::UTF_8,
|
32
|
+
:options => LibXML::XML::HTMLParser::Options::NOBLANKS).parse).root.copy(true)
|
33
|
+
replace_node pre, new
|
34
|
+
}
|
35
|
+
|
36
|
+
doc.root.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def load_doc(document, filename = 'UNKNOWN')
|
41
|
+
begin
|
42
|
+
doc = (LibXML::XML::HTMLParser.string document,
|
43
|
+
:encoding => LibXML::XML::Encoding::UTF_8,
|
44
|
+
:options => LibXML::XML::HTMLParser::Options::NOBLANKS).parse
|
45
|
+
rescue LibXML::XML::Error => exception
|
46
|
+
message = "An error occured while using LibXML : " +
|
47
|
+
"Invalid element at #{filename}:#{exception.line}"
|
48
|
+
raise GreenPepperLibXmlError.new(message)
|
49
|
+
end
|
50
|
+
doc
|
51
|
+
end
|
52
|
+
|
53
|
+
def replace_node(old, new)
|
54
|
+
if old.prev?
|
55
|
+
prev = old.prev
|
56
|
+
prev.next = new
|
57
|
+
elsif old.parent.first
|
58
|
+
# Make new the first child of the parent
|
59
|
+
old.parent.first.prev = new
|
60
|
+
else
|
61
|
+
old.parent << new
|
62
|
+
end
|
63
|
+
old.remove!
|
64
|
+
end
|
65
|
+
|
66
|
+
def extract_scenarios_from_html(doc)
|
67
|
+
execution_units = []
|
68
|
+
pres = find_free_text_pre doc
|
69
|
+
pres.each{ |pre_element|
|
70
|
+
scenario_regex = /Scenario\s?:\s*(.*)$/
|
71
|
+
lines = pre_element.content.strip.split("\n").collect{|line| line.strip}
|
72
|
+
|
73
|
+
raise GreenPepperNoScenarioInTag.new unless scenario_regex === lines[0]
|
74
|
+
|
75
|
+
scenario = Scenario.new lines[0].match(scenario_regex).to_a[1]
|
76
|
+
scenario.add_lines lines[1..-1]
|
77
|
+
|
78
|
+
context = ExampleContext.new pre_element.line_num
|
79
|
+
|
80
|
+
unit = ExecutionUnit.new scenario, context
|
81
|
+
execution_units << unit
|
82
|
+
}
|
83
|
+
|
84
|
+
execution_units
|
85
|
+
end
|
86
|
+
|
87
|
+
def find_free_text_pre(doc)
|
88
|
+
pres = []
|
89
|
+
doc.find("//pre").each{ |pre_element|
|
90
|
+
pre_classes = pre_element["class"].split(" ")
|
91
|
+
pres << pre_element if pre_classes.index("greenpepper-freetext")
|
92
|
+
}
|
93
|
+
pres
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'libxml'
|
3
|
+
require 'greenpepper/context/htmlcontext'
|
4
|
+
require 'greenpepper/parser/table'
|
5
|
+
require 'greenpepper/exception/greenpepperexception'
|
6
|
+
require 'greenpepper/executionunit'
|
7
|
+
|
8
|
+
module GreenPepper
|
9
|
+
|
10
|
+
class HtmlParser
|
11
|
+
|
12
|
+
attr_reader :html_string
|
13
|
+
|
14
|
+
def parse_file(filename)
|
15
|
+
file_content = ""
|
16
|
+
File.open(filename, "r") { |f| file_content = f.read }
|
17
|
+
extract_content file_content, filename
|
18
|
+
end
|
19
|
+
|
20
|
+
def extract_content(text, filename = "UNKNOWN")
|
21
|
+
begin
|
22
|
+
# TODO Remove this in favor of proper character encoding
|
23
|
+
# support. This is a hack to address a bug where the Confluence server
|
24
|
+
# would return non ascii characters.
|
25
|
+
text.gsub! /[\x80-\xff]/, ""
|
26
|
+
|
27
|
+
doc = (LibXML::XML::HTMLParser.string text).parse
|
28
|
+
ex_units = extract_tables(doc)
|
29
|
+
rescue LibXML::XML::Error => exception
|
30
|
+
message = "An error occured while using LibXML : " +
|
31
|
+
"Invalid element at #{filename}:#{exception.line}"
|
32
|
+
raise GreenPepperLibXmlError.new(message)
|
33
|
+
end
|
34
|
+
|
35
|
+
ex_units
|
36
|
+
end
|
37
|
+
|
38
|
+
def extract_tables(doc)
|
39
|
+
execution_units = []
|
40
|
+
|
41
|
+
table_parser = HtmlTableParser.new
|
42
|
+
|
43
|
+
doc.find("//table").each_with_index{ |table_element, table_index|
|
44
|
+
table = table_parser.parse(table_element)
|
45
|
+
context = HtmlContext.new table_element.line_num, table_index
|
46
|
+
|
47
|
+
ex_unit = ExecutionUnit.new table, context
|
48
|
+
|
49
|
+
execution_units << ex_unit
|
50
|
+
}
|
51
|
+
execution_units
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class HtmlTableParser
|
56
|
+
def parse(table_element)
|
57
|
+
table = Table.new
|
58
|
+
table_element.find('.//tr').each{ |row|
|
59
|
+
cells = Array.new
|
60
|
+
row.find('td | th').each { |cell|
|
61
|
+
content = cell.content
|
62
|
+
content = "" if content == "\302\240" #Clear " "
|
63
|
+
cells.push content.strip
|
64
|
+
}
|
65
|
+
table.push_row cells
|
66
|
+
}
|
67
|
+
table
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end #module GreenPepper
|
@@ -0,0 +1,25 @@
|
|
1
|
+
=begin
|
2
|
+
Author: Simon Mathieu (simon.math@gmail.com)
|
3
|
+
Pascal Ouellet (pas.ouellet@gmail.com)
|
4
|
+
Date: October 5, 2009
|
5
|
+
=end
|
6
|
+
|
7
|
+
module GreenPepper
|
8
|
+
|
9
|
+
class Scenario
|
10
|
+
attr_reader :fixture_name, :lines
|
11
|
+
def initialize(fixture_name)
|
12
|
+
@lines = []
|
13
|
+
@fixture_name = fixture_name
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_line(line)
|
17
|
+
@lines << line
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_lines(lines)
|
21
|
+
@lines = @lines + lines
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
=begin
|
2
|
+
author: Pascal Ouellet (pas.ouellet@gmail.com)
|
3
|
+
date: March 6, 2009
|
4
|
+
=end
|
5
|
+
module GreenPepper
|
6
|
+
|
7
|
+
class Table
|
8
|
+
def initialize
|
9
|
+
@table = Array.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](row)
|
13
|
+
@table[row]
|
14
|
+
end
|
15
|
+
|
16
|
+
def push_row(row)
|
17
|
+
@table.push row.clone
|
18
|
+
end
|
19
|
+
|
20
|
+
def merge_with(to_merge)
|
21
|
+
@table = @table + to_merge.table
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def ==(rho)
|
26
|
+
return false unless rho.is_a? Table
|
27
|
+
@table == rho.table
|
28
|
+
end
|
29
|
+
|
30
|
+
def each_row
|
31
|
+
@table.each{|row| yield row }
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
attr_reader :table
|
36
|
+
end
|
37
|
+
end #module GreenPepper
|
@@ -0,0 +1,26 @@
|
|
1
|
+
=begin
|
2
|
+
Author: Simon Mathieu (simon.math@gmail.com)
|
3
|
+
Date: April 12, 2009
|
4
|
+
=end
|
5
|
+
|
6
|
+
require 'greenpepper/parser/table'
|
7
|
+
require 'greenpepper/parser/htmlparser'
|
8
|
+
require 'rubygems'
|
9
|
+
require 'redcloth'
|
10
|
+
require 'libxml'
|
11
|
+
|
12
|
+
module GreenPepper
|
13
|
+
|
14
|
+
class WikiTableParser
|
15
|
+
def parse(wiki_table_string)
|
16
|
+
s = wiki_table_string.split("\n")
|
17
|
+
s = s.collect{|x| x.strip}
|
18
|
+
s = s.join("\n")
|
19
|
+
html = RedCloth.new(s).to_html
|
20
|
+
doc = (LibXML::XML::HTMLParser.string html).parse.root
|
21
|
+
html_parser = HtmlTableParser.new
|
22
|
+
html_parser.parse doc
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|