meteor 0.9.7.5 → 0.9.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/ChangeLog +4 -0
- data/Gemfile +4 -0
- data/README.md +37 -0
- data/Rakefile +4 -4
- data/demo/demo_html.rb +133 -0
- data/demo/demo_html5.rb +102 -0
- data/demo/demo_xhtml.rb +102 -0
- data/demo/demo_xhtml5.rb +107 -0
- data/demo/demo_xml.rb +123 -0
- data/demo/sample.html +40 -0
- data/demo/sample.xml +50 -0
- data/demo/sample_5.html +32 -0
- data/demo/sample_x.html +33 -0
- data/demo/sample_x5.html +33 -0
- data/lib/meteor.rb +1207 -1407
- data/meteor.gemspec +25 -0
- metadata +52 -30
- data/README +0 -30
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 79878cc14c8b93e9720ec698a24aa94195bae0ef
|
4
|
+
data.tar.gz: 295a3b24e45b67244a280bdebfe3454bcad79f78
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 53a2b9afe11e01ca2b83f6821a01b9c07102f23d0b484838023edd37445631b3f241d0b5e7cddc8c94435b0d0055766ff016e8797680e2890f9562814b91da86
|
7
|
+
data.tar.gz: 18019e1b871043796f52091f0efb8e64ecc3b7a2f7c554ef2e01bf7191b7c6a9a3f118c35e05984a930304eba8ca42ef7978b5e780f6daa4837a53047317f7e0
|
data/.gitignore
ADDED
data/ChangeLog
CHANGED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
Meteor
|
3
|
+
==================
|
4
|
+
A lightweight (X)HTML(5) & XML Parser
|
5
|
+
|
6
|
+
```shell
|
7
|
+
gem install meteor #gem installation
|
8
|
+
```
|
9
|
+
```shell
|
10
|
+
#archive installation
|
11
|
+
gem build meteor.gemspec
|
12
|
+
gem install meteor-*.gem
|
13
|
+
```
|
14
|
+
|
15
|
+
##Explanation
|
16
|
+
Sorry, written in Japanese.
|
17
|
+
|
18
|
+
軽量(簡易?)(X)HTML(5)パーサです。
|
19
|
+
XMLパーサとしても使用可能です。
|
20
|
+
パーサもどきかもしれません。
|
21
|
+
(X)HTML(5)、XMLの仕様の全てをサポートしてはいません、
|
22
|
+
日常的に必要と思われる範囲をサポートしています。
|
23
|
+
|
24
|
+
DOMのように全体をオブジェクトのツリー構造に変換するのではなく、
|
25
|
+
操作対象の要素のみをオブジェクトにする仕組みになっています。
|
26
|
+
(内部では正規表現を使っていますが、ユーザがそれを意識する
|
27
|
+
必要は全くありません。)
|
28
|
+
|
29
|
+
|
30
|
+
## License
|
31
|
+
Licensed under the LGPL V2.1.
|
32
|
+
|
33
|
+
##Author
|
34
|
+
Yasumasa Ashida (ys.ashida@gmail.com)
|
35
|
+
|
36
|
+
##Copyright
|
37
|
+
(c) 2008-2014 Yasumasa Ashida
|
data/Rakefile
CHANGED
@@ -27,7 +27,7 @@ RDOC_OPTS = [
|
|
27
27
|
"--charset", "utf-8",
|
28
28
|
"--opname", "index.html",
|
29
29
|
"--line-numbers",
|
30
|
-
"--main", "README",
|
30
|
+
"--main", "README.md",
|
31
31
|
"--inline-source",
|
32
32
|
]
|
33
33
|
|
@@ -45,7 +45,7 @@ spec = Gem::Specification.new do |s|
|
|
45
45
|
s.version = VERS
|
46
46
|
s.platform = Gem::Platform::RUBY
|
47
47
|
s.has_rdoc = false
|
48
|
-
s.extra_rdoc_files = ["README", "ChangeLog"]
|
48
|
+
s.extra_rdoc_files = ["README.md", "ChangeLog"]
|
49
49
|
s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
|
50
50
|
s.summary = DESCRIPTION
|
51
51
|
s.description = DESCRIPTION
|
@@ -62,7 +62,7 @@ spec = Gem::Specification.new do |s|
|
|
62
62
|
#s.add_dependency('activesupport', '>=1.3.1')
|
63
63
|
#s.required_ruby_version = '>= 1.8.2'
|
64
64
|
|
65
|
-
s.files = %w(README ChangeLog Rakefile) +
|
65
|
+
s.files = %w(README.md ChangeLog Rakefile) +
|
66
66
|
Dir.glob("{bin,doc,test,lib,templates,generator,extras,website,script}/**/*") +
|
67
67
|
Dir.glob("ext/**/*.{h,c,rb}") +
|
68
68
|
Dir.glob("examples/**/*.rb") +
|
@@ -96,7 +96,7 @@ Rake::RDocTask.new do |rdoc|
|
|
96
96
|
if ENV['DOC_FILES']
|
97
97
|
rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
|
98
98
|
else
|
99
|
-
rdoc.rdoc_files.include('README', 'ChangeLog')
|
99
|
+
rdoc.rdoc_files.include('README.md', 'ChangeLog')
|
100
100
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
101
101
|
rdoc.rdoc_files.include('ext/**/*.c')
|
102
102
|
end
|
data/demo/demo_html.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
#!bin ruby
|
2
|
+
# -* coding: UTF-8 -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'meteor'
|
6
|
+
|
7
|
+
#pf = Meteor::ParserFactory.new
|
8
|
+
#pf.bind(Meteor::HTML,'sample.html', 'UTF-8')
|
9
|
+
|
10
|
+
#root = pf.element('sample')
|
11
|
+
|
12
|
+
Meteor::ElementFactory.options= {:type => Meteor::HTML}
|
13
|
+
#Meteor::ElementFactory.bind(Meteor::HTML,'sample.html', 'UTF-8')
|
14
|
+
Meteor::ElementFactory.bind('sample.html')
|
15
|
+
|
16
|
+
root = Meteor::ElementFactory.element('sample')
|
17
|
+
|
18
|
+
start_time = Time.new.to_f
|
19
|
+
|
20
|
+
elm_hello = root.element('id'=>'hello')
|
21
|
+
#elm_hello = root.css('[id=hello]')
|
22
|
+
#elm_hello.attr('color'=>'red')
|
23
|
+
elm_hello['color'] = 'red'
|
24
|
+
|
25
|
+
#elm_hello.remove_attribute('color')
|
26
|
+
|
27
|
+
elm_hello2 = root.element('id','hello2')
|
28
|
+
#elm_hello2.content('Hello,Tester')
|
29
|
+
elm_hello2.content = 'Hello,Tester'
|
30
|
+
|
31
|
+
#elm_hello3 = ps.cxtag('hello3')
|
32
|
+
#elm_hello3.content = "Hello,Hello\ntt"
|
33
|
+
#elm_hello3.content = "Hello,Hello"
|
34
|
+
#puts elm_hello3.pattern
|
35
|
+
#puts elm_hello3.mixed_content
|
36
|
+
#puts elm_hello3.document
|
37
|
+
#puts elm_hello3.content
|
38
|
+
#puts elm_hello3.mixed_content
|
39
|
+
|
40
|
+
elm_text1 = root.element('input','id'=>'text1')
|
41
|
+
#elm_text1.attr('value'=>'めも')
|
42
|
+
#elm_text1['value'] = 'めも'
|
43
|
+
#elm_text1.attr = {'value' => 'メモ'}
|
44
|
+
#elm_text1.attr('disabled'=>true)
|
45
|
+
#elm_text1['disabled'] = true
|
46
|
+
elm_text1.attrs = {'value' => 'メモ','disabled' => true, 'readonly' => true}
|
47
|
+
#puts elm_text1.attrs
|
48
|
+
#elm_text1.remove_attr('disabled')
|
49
|
+
#map = elm_text1.attr_map
|
50
|
+
#map.names.each { |item|
|
51
|
+
# puts item
|
52
|
+
# puts map.fetch(item)
|
53
|
+
#}
|
54
|
+
|
55
|
+
#elm_radio1 = root.element('input','id'=>'radio1','type'=>'radio')
|
56
|
+
#elm_radio1 = root.css('input[id=radio1][type=radio]')
|
57
|
+
#elm_radio1 = root.find('#radio1')
|
58
|
+
#elm_radio1 = root.find('input#radio1')
|
59
|
+
#elm_radio1 = root.find('.test')
|
60
|
+
#elm_radio1 = root.find('input.test')
|
61
|
+
#elm_radio1 = root.find('[id=radio1][type=radio]')
|
62
|
+
##elm_radio1.attr('checked','true')
|
63
|
+
#elm_radio1['checked'] = 'true'
|
64
|
+
#puts elm_radio1.document
|
65
|
+
|
66
|
+
#elm_select1 = root.element('select','id'=>'select1')
|
67
|
+
#elm_select1 = root.element('select')
|
68
|
+
##elm_select1 = root.find('select')
|
69
|
+
#elm_select1.attr('multiple','true')
|
70
|
+
#elm_select1['multiple'] = true
|
71
|
+
##puts elm_select1.attr('multiple')
|
72
|
+
#puts elm_select1['multiple']
|
73
|
+
|
74
|
+
#elm_option1 = root.element('option','id'=>'option1')
|
75
|
+
##elm_option1.attr('selected'=>'true')
|
76
|
+
#elm_option1['selected'] = true
|
77
|
+
#ps.remove_attr(elm_option1,'selected')
|
78
|
+
#elm_option1.remove_attr('selected')
|
79
|
+
##puts elm_option1.attr('selected')
|
80
|
+
#puts elm_option1['selected']
|
81
|
+
#puts elm_text1.attr('readonly')
|
82
|
+
|
83
|
+
#elm_select2 = ps.element('select','id'=>'select2')
|
84
|
+
#elm_select2['multiple'] = 'true'
|
85
|
+
#elm_option2 = ps.element('option','id'=>'option2')
|
86
|
+
#co_ps = elm_option2.child()
|
87
|
+
#10.times { |i|
|
88
|
+
# co_ps.attr('value'=>i.to_s)
|
89
|
+
# #'<' +
|
90
|
+
# if i == 1 then
|
91
|
+
# co_ps.attr('selected'=>'true')
|
92
|
+
# else
|
93
|
+
# #co_ps.attr('selected'=>'false')
|
94
|
+
# end
|
95
|
+
# co_ps.content(i.to_s)
|
96
|
+
# co_ps.remove_attr('id')
|
97
|
+
# co_ps.flush
|
98
|
+
#}
|
99
|
+
|
100
|
+
elm_tr1 = root.element('tr','id'=>'loop')
|
101
|
+
#elm_tr1 = ps.find('tr[id=loop]')
|
102
|
+
elm_ = root.element(elm_tr1)
|
103
|
+
elm_dt1_ = elm_.element('id'=>'aa')
|
104
|
+
elm_dt2_ = elm_.element('id'=>'bb')
|
105
|
+
elm_dt3_ = elm_.element('id'=>'cc')
|
106
|
+
10.times do |i|
|
107
|
+
elm_['loop'] = i.to_s
|
108
|
+
elm_dt1 = elm_dt1_.clone
|
109
|
+
elm_dt2 = elm_dt2_.clone
|
110
|
+
elm_dt3 = elm_dt3_.clone
|
111
|
+
elm_dt1.content=i.to_s
|
112
|
+
elm_dt2.content=i.to_s
|
113
|
+
elm_dt3.content=i.to_s
|
114
|
+
#"< \n" +
|
115
|
+
elm_.flush
|
116
|
+
end
|
117
|
+
|
118
|
+
elms = root.elements('id' => 'sample')
|
119
|
+
#elms = root.find('div')
|
120
|
+
#elms = root.find('div[class=test]')
|
121
|
+
|
122
|
+
elms.each_with_index{ |elm_,i|
|
123
|
+
#puts elm_.document
|
124
|
+
elm_['style'] = i.to_s
|
125
|
+
}
|
126
|
+
|
127
|
+
root.flush
|
128
|
+
|
129
|
+
end_time = Time.new.to_f
|
130
|
+
|
131
|
+
puts root.document
|
132
|
+
|
133
|
+
puts '' + (end_time - start_time).to_s + ' sec'
|
data/demo/demo_html5.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
#!bin ruby
|
2
|
+
# -* coding: UTF-8 -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'meteor'
|
6
|
+
|
7
|
+
#pf = Meteor::ParserFactory.new
|
8
|
+
#pf.bind(Meteor::Parser::HTML5,'sample_5.html', 'UTF-8')
|
9
|
+
|
10
|
+
#root = pf.element('sample_5')
|
11
|
+
|
12
|
+
Meteor::ElementFactory.bind(Meteor::Parser::HTML5,"sample_5.html", 'UTF-8')
|
13
|
+
root = Meteor::ElementFactory.element('sample_5')
|
14
|
+
|
15
|
+
start_time = Time.new.to_f
|
16
|
+
|
17
|
+
elm_hello = root.element('id','hello')
|
18
|
+
#elm_hello.attr('color'=>'red')
|
19
|
+
elm_hello['color'] = 'red'
|
20
|
+
#elm_hello.remove_attribute('color')
|
21
|
+
|
22
|
+
elm_hello2 = root.element('id'=>'hello2')
|
23
|
+
#elm_hello2.content('Hello,Tester')
|
24
|
+
elm_hello2.content = 'Hello,Tester'
|
25
|
+
|
26
|
+
elm_text1 = root.element('id','text1')
|
27
|
+
#elm_text1.attr('value','めも')
|
28
|
+
elm_text1['value'] = 'めも'
|
29
|
+
#elm_text1.attr('disabled'=>true)
|
30
|
+
elm_text1['disabled'] = true
|
31
|
+
#elm_text1.attr('required'=>true)
|
32
|
+
elm_text1['required'] = true
|
33
|
+
|
34
|
+
#elm_text1.remove_attr('disabled')
|
35
|
+
#map = elm_text1.attr_map
|
36
|
+
#map.names.each { |item|
|
37
|
+
# puts item
|
38
|
+
# puts map.fetch(item)
|
39
|
+
#}
|
40
|
+
|
41
|
+
#elm_radio1 = root.element('input','id'=>'radio1','type'=>'radio')
|
42
|
+
##elm_radio1.attr(,'checked'=>'true')
|
43
|
+
#elm_radio1['checked'] = true
|
44
|
+
#puts elm_radio1.document
|
45
|
+
|
46
|
+
#elm_select1 = root.element('select','id'=>'select1')
|
47
|
+
#elm_select1 = root.element('select')
|
48
|
+
##elm_select1.attr('multiple'=>'true')
|
49
|
+
#elm_select1['multiple'] = true
|
50
|
+
##puts elm_select1.attr('multiple')
|
51
|
+
#puts elm_select1['multiple']
|
52
|
+
|
53
|
+
#elm_option1 = root.element('option','id'=>'option1')
|
54
|
+
##elm_option1.attr('selected'=>'true')
|
55
|
+
#elm_option1['selected'] = true
|
56
|
+
#elm_option1.remove_attr('selected')
|
57
|
+
##puts elm_option1.attr('selected')
|
58
|
+
#puts elm_option1['selected']
|
59
|
+
##puts elm_text1.attr('readonly')
|
60
|
+
#puts elm_text1['readonly']
|
61
|
+
|
62
|
+
#elm_select2 = ps.element('select','id'=>'select2')
|
63
|
+
#elm_select2['multiple'] = 'true'
|
64
|
+
#elm_option2 = ps.element('option','id'=>'option2')
|
65
|
+
#co_ps = elm_option2.element()
|
66
|
+
#10.times { |i|
|
67
|
+
# co_ps.attr('value',i.to_s)
|
68
|
+
# #'<' +
|
69
|
+
# if i == 1 then
|
70
|
+
# co_ps.attr('selected'=>'true')
|
71
|
+
# else
|
72
|
+
# #co_ps.attr('selected'=>'false')
|
73
|
+
# end
|
74
|
+
# co_ps.content(i.to_s)
|
75
|
+
# co_ps.remove_attr('id')
|
76
|
+
# co_ps.flush
|
77
|
+
#}
|
78
|
+
|
79
|
+
elm_tr1 = root.element('tr','id'=>'loop')
|
80
|
+
elm_ = root.element(elm_tr1)
|
81
|
+
elm_dt1_ = elm_.element('id'=>'aa')
|
82
|
+
elm_dt2_ = elm_.element('id'=>'bb')
|
83
|
+
elm_dt3_ = elm_.element('id'=>'cc')
|
84
|
+
10.times do |i|
|
85
|
+
elm_['loop'] = i.to_s
|
86
|
+
elm_dt1 = elm_dt1_.clone
|
87
|
+
elm_dt2 = elm_dt2_.clone
|
88
|
+
elm_dt3 = elm_dt3_.clone
|
89
|
+
elm_dt1.content=i.to_s
|
90
|
+
elm_dt2.content=i.to_s
|
91
|
+
elm_dt3.content=i.to_s
|
92
|
+
#"< \n" +
|
93
|
+
elm_.flush
|
94
|
+
end
|
95
|
+
|
96
|
+
root.flush
|
97
|
+
|
98
|
+
end_time = Time.new.to_f
|
99
|
+
|
100
|
+
puts root.document
|
101
|
+
|
102
|
+
puts '' + (end_time - start_time).to_s + ' sec'
|
data/demo/demo_xhtml.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
#!bin ruby
|
2
|
+
# -* coding: UTF-8 -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'meteor'
|
6
|
+
|
7
|
+
#pf = Meteor::ParserFactory.new
|
8
|
+
#pf.bind(Meteor::Parser::XHTML,"sample_x.html", "UTF-8")
|
9
|
+
|
10
|
+
#root = pf.element('sample_x')
|
11
|
+
|
12
|
+
Meteor::ElementFactory.bind(Meteor::Parser::XHTML,'sample_x.html', 'UTF-8')
|
13
|
+
root = Meteor::ElementFactory.element('sample_x')
|
14
|
+
|
15
|
+
startTime = Time.new.to_f
|
16
|
+
|
17
|
+
elm_hello = root.element("id","hello")
|
18
|
+
#elm_hello.attr("color"=>"red")
|
19
|
+
elm_hello['color'] = 'red'
|
20
|
+
#elm_hello.remove_attr('color')
|
21
|
+
|
22
|
+
elm_hello2 = root.element("id"=>"hello2")
|
23
|
+
#elm_hello2.content("Hello,Tester")
|
24
|
+
elm_hello2.content = "Hello,Tester"
|
25
|
+
#elm_hello2.remove
|
26
|
+
#elm_hello3 = root.cxtag("hello3")
|
27
|
+
##elm_hello3.content("Hello,Hello\ntt")
|
28
|
+
#elm_hello3.content = "Hello,Hello\ntt"
|
29
|
+
#puts elm_hello3.content
|
30
|
+
#puts elm_hello3.mixed_content
|
31
|
+
|
32
|
+
#elm_text1 = root.element("id"=>"text1")
|
33
|
+
##elm_text1.attr("value","めも")
|
34
|
+
#elm_text1['value'] = 'めも'
|
35
|
+
##elm_text1.attr("disabled"=>true)
|
36
|
+
#elm_text1['diaabled'] = true
|
37
|
+
#map = elm_text1.attr_map
|
38
|
+
#map.names.each { |item|
|
39
|
+
# puts item
|
40
|
+
# puts map.fetch(item)
|
41
|
+
#}
|
42
|
+
|
43
|
+
elm_radio1 = root.element("input","id"=>"radio1","type"=>"radio")
|
44
|
+
##elm_radio1.attribute("checked"=>"true")
|
45
|
+
elm_radio1['checked'] = true
|
46
|
+
|
47
|
+
#elm_select1 = root.element("select","id"=>"select1")
|
48
|
+
#elm_select1 = root.element("select")
|
49
|
+
##elm_select1.attr("multiple"=>true)
|
50
|
+
#elm_select1('multiple') = true
|
51
|
+
##puts elm_select1.attr("multiple")
|
52
|
+
#puts elm_select1['multiple']
|
53
|
+
#elm_option1 = root.element("option","id"=>"option1")
|
54
|
+
##elm_option1.attr("selected"=>"true")
|
55
|
+
#elm_option1['selected'] = true
|
56
|
+
#puts elm_option1.attr("selected")
|
57
|
+
#puts elm_text1.attr("readonly")
|
58
|
+
|
59
|
+
#elm_select2 = root.element("select","id"=>"select2")
|
60
|
+
#elm_select2["multiple"] = "true"
|
61
|
+
#elm_option2 = root.element("option","id"=>"option2")
|
62
|
+
#co_ps = elm_option2.child()
|
63
|
+
#10.times { |i|
|
64
|
+
# if i == 1 then
|
65
|
+
# #co_ps.attr("selected"=>"true")
|
66
|
+
# co_ps['selected'] = true
|
67
|
+
# else
|
68
|
+
# #co_ps.attr("selected"=>"false")
|
69
|
+
# co_ps['selected'] = false
|
70
|
+
# end
|
71
|
+
# #co_ps.attr("value"=>i.to_s)
|
72
|
+
# co_ps['value'] = i.to_s
|
73
|
+
# co_ps.remove_attr("id")
|
74
|
+
# #co_ps.content(i.to_s)
|
75
|
+
# co_ps.content = i.to_s
|
76
|
+
# co_ps.flush
|
77
|
+
#}
|
78
|
+
|
79
|
+
elm_tr1 = root.element('tr','id'=>'loop')
|
80
|
+
elm_ = elm_tr1.element
|
81
|
+
elm_dt1_ = elm_.element('id'=>'aa')
|
82
|
+
elm_dt2_ = elm_.element('id'=>'bb')
|
83
|
+
elm_dt3_ = elm_.element('id'=>'cc')
|
84
|
+
10.times { |i|
|
85
|
+
elm_['loop'] = i.to_s
|
86
|
+
elm_dt1 = elm_dt1_.clone
|
87
|
+
elm_dt2 = elm_dt2_.clone
|
88
|
+
elm_dt3 = elm_dt3_.clone
|
89
|
+
#elm_dt1.content("<>\"' \n" << i.to_s)
|
90
|
+
elm_dt1.content=i.to_s
|
91
|
+
elm_dt2.content=i.to_s
|
92
|
+
elm_dt3.content=i.to_s
|
93
|
+
elm_.flush
|
94
|
+
}
|
95
|
+
|
96
|
+
root.flush
|
97
|
+
|
98
|
+
endTime = Time.new.to_f
|
99
|
+
|
100
|
+
puts root.document
|
101
|
+
|
102
|
+
puts '' + (endTime - startTime).to_s + ' sec'
|