meteor 0.9.13 → 0.9.14
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 +4 -4
- data/ChangeLog +4 -0
- data/Gemfile.lock +3 -3
- data/demo/html.rb +49 -39
- data/demo/html4.rb +40 -33
- data/demo/ml/sample.xml +36 -38
- data/demo/ml/sample_html.html +7 -2
- data/demo/ml/sample_html4.html +9 -2
- data/demo/ml/sample_xhtml.html +7 -2
- data/demo/ml/sample_xhtml4.html +10 -3
- data/demo/xhtml.rb +41 -30
- data/demo/xhtml4.rb +35 -26
- data/demo/xml.rb +25 -20
- data/lib/meteor/attribute_map.rb +8 -6
- data/lib/meteor/core/kernel.rb +288 -260
- data/lib/meteor/core/util/pattern_cache.rb +16 -15
- data/lib/meteor/element.rb +65 -63
- data/lib/meteor/exception/no_such_element_exception.rb +15 -15
- data/lib/meteor/ml/html/parser_impl.rb +58 -33
- data/lib/meteor/ml/html4/parser_impl.rb +118 -90
- data/lib/meteor/ml/xhtml/parser_impl.rb +33 -29
- data/lib/meteor/ml/xhtml4/parser_impl.rb +98 -90
- data/lib/meteor/ml/xml/parser_impl.rb +35 -25
- data/lib/meteor/parser_factory.rb +125 -125
- data/lib/meteor.rb +2 -2
- metadata +2 -2
|
@@ -11,43 +11,49 @@ module Meteor
|
|
|
11
11
|
# KAIGYO_CODE = "\r?\n|\r"
|
|
12
12
|
# KAIGYO_CODE = "\r\n|\n|\r"
|
|
13
13
|
KAIGYO_CODE = ["\r\n", "\n", "\r"]
|
|
14
|
-
BR =
|
|
14
|
+
BR = "<br>"
|
|
15
15
|
|
|
16
16
|
# @@match_tag = "br|hr|img|input|meta|base"
|
|
17
|
-
|
|
17
|
+
#[Array] void elemets (空要素)
|
|
18
|
+
@@match_tag = ["br", "hr", "img", "input", "meta", "base"]
|
|
18
19
|
# @@match_tag_2 = "textarea|option|pre"
|
|
19
|
-
|
|
20
|
+
#[Array] elements where line breaks do not need to be converted to <br> (改行を<br>に変換する必要のない要素)
|
|
21
|
+
@@match_tag_2 = ["textarea", "option", "pre"]
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
#[Array] non-nestable elements (入れ子にできない要素)
|
|
24
|
+
@@match_tag_sng = ["texarea", "select", "option", "form", "fieldset"]
|
|
22
25
|
|
|
23
|
-
|
|
26
|
+
#[Array] boolean elements (論理値で指定する属性)
|
|
27
|
+
@@attr_logic = ["disabled", "readonly", "checked", "selected", "multiple"]
|
|
24
28
|
|
|
25
29
|
# DISABLE_ELEMENT = "input|textarea|select|optgroup"
|
|
26
|
-
|
|
30
|
+
#[Array] elements with the disabled attribute (disabled属性のある要素)
|
|
31
|
+
DISABLE_ELEMENT = ["input", "textarea", "select", "optgroup"]
|
|
27
32
|
# READONLY_TYPE = "text|password"
|
|
28
|
-
|
|
33
|
+
#[Array] the type of an input element with a readonly attribute (readonly属性のあるinput要素のタイプ)
|
|
34
|
+
READONLY_TYPE = ["text", "password"]
|
|
29
35
|
|
|
30
|
-
SELECTED_M =
|
|
36
|
+
SELECTED_M = "\\sselected\\s|\\sselected$|\\sSELECTED\\s|\\sSELECTED$"
|
|
31
37
|
# SELECTED_M = [' selected ',' selected',' SELECTED ',' SELECTED']
|
|
32
|
-
SELECTED_R =
|
|
33
|
-
CHECKED_M =
|
|
38
|
+
SELECTED_R = "selected\\s|selected$|SELECTED\\s|SELECTED$"
|
|
39
|
+
CHECKED_M = "\\schecked\\s|\\schecked$|\\sCHECKED\\s|\\sCHECKED$"
|
|
34
40
|
# CHECKED_M = [' checked ',' checked',' CHECKED ',' CHECKED']
|
|
35
|
-
CHECKED_R =
|
|
36
|
-
DISABLED_M =
|
|
41
|
+
CHECKED_R = "checked\\s|checked$|CHECKED\\s|CHECKED$"
|
|
42
|
+
DISABLED_M = "\\sdisabled\\s|\\sdisabled$|\\sDISABLED\\s|\\sDISABLED$"
|
|
37
43
|
# DISABLED_M = [' disabled ',' disiabled',' DISABLED ',' DISABLED']
|
|
38
|
-
DISABLED_R =
|
|
39
|
-
READONLY_M =
|
|
44
|
+
DISABLED_R = "disabled\\s|disabled$|DISABLED\\s|DISABLED$"
|
|
45
|
+
READONLY_M = "\\sreadonly\\s|\\sreadonly$|\\sREADONLY\\s|\\sREADONLY$"
|
|
40
46
|
# READONLY_M = [' readonly ',' readonly',' READONLY ',' READONLY']
|
|
41
|
-
READONLY_R =
|
|
42
|
-
MULTIPLE_M =
|
|
47
|
+
READONLY_R = "readonly\\s|readonly$|READONLY\\s|READONLY$"
|
|
48
|
+
MULTIPLE_M = "\\smultiple\\s|\\smultiple$|\\sMULTIPLE\\s|\\sMULTIPLE$"
|
|
43
49
|
# MULTIPLE_M = [' multiple ',' multiple',' MULTIPLE ',' MULTIPLE']
|
|
44
|
-
MULTIPLE_R =
|
|
50
|
+
MULTIPLE_R = "multiple\\s|multiple$|MULTIPLE\\s|MULTIPLE$"
|
|
45
51
|
|
|
46
52
|
# @@pattern_true = Regexp.new("true")
|
|
47
53
|
# @@pattern_false = Regexp.new("false")
|
|
48
54
|
|
|
49
|
-
PATTERN_UNESCAPE =
|
|
50
|
-
GET_ATTRS_MAP2 =
|
|
55
|
+
PATTERN_UNESCAPE = "&(amp|quot|apos|gt|lt|nbsp);"
|
|
56
|
+
GET_ATTRS_MAP2 = "\\s(disabled|readonly|checked|selected|multiple)"
|
|
51
57
|
|
|
52
58
|
@@pattern_selected_m = Regexp.new(SELECTED_M)
|
|
53
59
|
@@pattern_selected_r = Regexp.new(SELECTED_R)
|
|
@@ -67,24 +73,24 @@ module Meteor
|
|
|
67
73
|
# @@pattern_match_tag2 = Regexp.new(@@match_tag_2)
|
|
68
74
|
|
|
69
75
|
TABLE_FOR_ESCAPE_ = {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
+
"&" => "&",
|
|
77
|
+
"\"" => """,
|
|
78
|
+
"'" => "'",
|
|
79
|
+
"<" => "<",
|
|
80
|
+
">" => ">",
|
|
81
|
+
" " => " "
|
|
76
82
|
}
|
|
77
83
|
|
|
78
84
|
TABLE_FOR_ESCAPE_CONTENT_ = {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
"&" => "&",
|
|
86
|
+
"\"" => """,
|
|
87
|
+
"'" => "'",
|
|
88
|
+
"<" => "<",
|
|
89
|
+
">" => ">",
|
|
90
|
+
" " => " ",
|
|
91
|
+
"\r\n" => "<br>",
|
|
92
|
+
"\r" => "<br>",
|
|
93
|
+
"\n" => "<br>"
|
|
88
94
|
}
|
|
89
95
|
|
|
90
96
|
PATTERN_ESCAPE = "[&\"'<> ]"
|
|
@@ -104,12 +110,12 @@ module Meteor
|
|
|
104
110
|
super()
|
|
105
111
|
@doc_type = Parser::HTML4
|
|
106
112
|
case args.length
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
when ZERO
|
|
114
|
+
# initialize_0
|
|
115
|
+
when ONE
|
|
116
|
+
initialize_1(args[0])
|
|
117
|
+
else
|
|
118
|
+
raise ArgumentError
|
|
113
119
|
end
|
|
114
120
|
end
|
|
115
121
|
|
|
@@ -168,21 +174,21 @@ module Meteor
|
|
|
168
174
|
def analyze_content_type
|
|
169
175
|
@error_check = false
|
|
170
176
|
|
|
171
|
-
element_3(
|
|
177
|
+
element_3("meta", "http-equiv", "Content-Type")
|
|
172
178
|
|
|
173
179
|
if !@elm_
|
|
174
|
-
element_3(
|
|
180
|
+
element_3("meta", "http-equiv", "Content-Type")
|
|
175
181
|
end
|
|
176
182
|
|
|
177
183
|
@error_check = true
|
|
178
184
|
|
|
179
185
|
if @elm_
|
|
180
|
-
content = @elm_.attr(
|
|
181
|
-
content_arr = content&.split(
|
|
182
|
-
@root.content_type = content_arr&.at(0) ||
|
|
183
|
-
@root.charset = content_arr&.at(1)&.split(
|
|
186
|
+
content = @elm_.attr("content")
|
|
187
|
+
content_arr = content&.split(";")
|
|
188
|
+
@root.content_type = content_arr&.at(0) || ""
|
|
189
|
+
@root.charset = content_arr&.at(1)&.split("=")&.at(1) || ""
|
|
184
190
|
else
|
|
185
|
-
@root.content_type =
|
|
191
|
+
@root.content_type = ""
|
|
186
192
|
end
|
|
187
193
|
end
|
|
188
194
|
|
|
@@ -213,7 +219,7 @@ module Meteor
|
|
|
213
219
|
# case of void element (空要素の場合(<->内容あり要素の場合))
|
|
214
220
|
if is_match(@@match_tag, name)
|
|
215
221
|
# void element search pattern (空要素検索用パターン)
|
|
216
|
-
@pattern_cc = String.new(
|
|
222
|
+
@pattern_cc = String.new("") << "<" << @_name << "(|\\s[^<>]*)>"
|
|
217
223
|
# @pattern_cc = "<#{@_name}(|\\s[^<>]*)>"
|
|
218
224
|
@pattern = Meteor::Core::Util::PatternCache.get(@pattern_cc)
|
|
219
225
|
@res = @pattern.match(@root.document)
|
|
@@ -221,8 +227,9 @@ module Meteor
|
|
|
221
227
|
element_without_1(name)
|
|
222
228
|
else
|
|
223
229
|
if @error_check
|
|
224
|
-
puts
|
|
230
|
+
puts(Meteor::Exception::NoSuchElementException.new(name).message)
|
|
225
231
|
end
|
|
232
|
+
|
|
226
233
|
@elm_ = nil
|
|
227
234
|
end
|
|
228
235
|
else
|
|
@@ -239,8 +246,9 @@ module Meteor
|
|
|
239
246
|
element_with_1(name)
|
|
240
247
|
else
|
|
241
248
|
if @error_check
|
|
242
|
-
puts
|
|
249
|
+
puts(Meteor::Exception::NoSuchElementException.new(name).message)
|
|
243
250
|
end
|
|
251
|
+
|
|
244
252
|
@elm_ = nil
|
|
245
253
|
end
|
|
246
254
|
end
|
|
@@ -290,8 +298,9 @@ module Meteor
|
|
|
290
298
|
element_without_3(name)
|
|
291
299
|
else
|
|
292
300
|
if @error_check
|
|
293
|
-
puts
|
|
301
|
+
puts(Meteor::Exception::NoSuchElementException.new(name, attr_name, attr_value).message)
|
|
294
302
|
end
|
|
303
|
+
|
|
295
304
|
@elm_ = nil
|
|
296
305
|
end
|
|
297
306
|
else
|
|
@@ -313,8 +322,9 @@ module Meteor
|
|
|
313
322
|
element_with_3_1(name)
|
|
314
323
|
else
|
|
315
324
|
if @error_check
|
|
316
|
-
puts
|
|
325
|
+
puts(Meteor::Exception::NoSuchElementException.new(name, attr_name, attr_value).message)
|
|
317
326
|
end
|
|
327
|
+
|
|
318
328
|
@elm_ = nil
|
|
319
329
|
end
|
|
320
330
|
end
|
|
@@ -325,7 +335,7 @@ module Meteor
|
|
|
325
335
|
private :element_3
|
|
326
336
|
|
|
327
337
|
def element_without_3(name)
|
|
328
|
-
element_without_3_1(name,
|
|
338
|
+
element_without_3_1(name, "\"[^<>]*)>")
|
|
329
339
|
end
|
|
330
340
|
|
|
331
341
|
private :element_without_3
|
|
@@ -351,8 +361,9 @@ module Meteor
|
|
|
351
361
|
element_3(@res[1], attr_name, attr_value)
|
|
352
362
|
else
|
|
353
363
|
if @error_check
|
|
354
|
-
puts
|
|
364
|
+
puts(Meteor::Exception::NoSuchElementException.new(attr_name, attr_value).message)
|
|
355
365
|
end
|
|
366
|
+
|
|
356
367
|
@elm_ = nil
|
|
357
368
|
end
|
|
358
369
|
|
|
@@ -392,8 +403,13 @@ module Meteor
|
|
|
392
403
|
element_without_5(name)
|
|
393
404
|
else
|
|
394
405
|
if @error_check
|
|
395
|
-
puts
|
|
406
|
+
puts(
|
|
407
|
+
Meteor::Exception::NoSuchElementException
|
|
408
|
+
.new(name, attr_name1, attr_value1, attr_name2, attr_value2)
|
|
409
|
+
.message
|
|
410
|
+
)
|
|
396
411
|
end
|
|
412
|
+
|
|
397
413
|
@elm_ = nil
|
|
398
414
|
end
|
|
399
415
|
else
|
|
@@ -418,8 +434,13 @@ module Meteor
|
|
|
418
434
|
element_with_5_1(name)
|
|
419
435
|
else
|
|
420
436
|
if @error_check
|
|
421
|
-
puts
|
|
437
|
+
puts(
|
|
438
|
+
Meteor::Exception::NoSuchElementException
|
|
439
|
+
.new(name, attr_name1, attr_value1, attr_name2, attr_value2)
|
|
440
|
+
.message
|
|
441
|
+
)
|
|
422
442
|
end
|
|
443
|
+
|
|
423
444
|
@elm_ = nil
|
|
424
445
|
end
|
|
425
446
|
end
|
|
@@ -430,7 +451,7 @@ module Meteor
|
|
|
430
451
|
private :element_5
|
|
431
452
|
|
|
432
453
|
def element_without_5(name)
|
|
433
|
-
element_without_5_1(name,
|
|
454
|
+
element_without_5_1(name, "\")[^<>]*)>")
|
|
434
455
|
end
|
|
435
456
|
|
|
436
457
|
private :element_without_5
|
|
@@ -462,8 +483,11 @@ module Meteor
|
|
|
462
483
|
element_5(@res[1], attr_name1, attr_value1, attr_name2, attr_value2)
|
|
463
484
|
else
|
|
464
485
|
if @error_check
|
|
465
|
-
puts
|
|
486
|
+
puts(
|
|
487
|
+
Meteor::Exception::NoSuchElementException.new(attr_name1, attr_value1, attr_name2, attr_value2).message
|
|
488
|
+
)
|
|
466
489
|
end
|
|
490
|
+
|
|
467
491
|
@elm_ = nil
|
|
468
492
|
end
|
|
469
493
|
|
|
@@ -473,15 +497,16 @@ module Meteor
|
|
|
473
497
|
private :element_4
|
|
474
498
|
|
|
475
499
|
def edit_attrs_(elm, attr_name, attr_value)
|
|
476
|
-
if is_match(
|
|
500
|
+
if is_match("selected", attr_name) && is_match("option", elm.name)
|
|
477
501
|
edit_attrs_5(elm, attr_name, attr_value, @@pattern_selected_m, @@pattern_selected_r)
|
|
478
|
-
elsif is_match(
|
|
502
|
+
elsif is_match("multiple", attr_name) && is_match("select", elm.name)
|
|
479
503
|
edit_attrs_5(elm, attr_name, attr_value, @@pattern_multiple_m, @@pattern_multiple_r)
|
|
480
|
-
elsif is_match(
|
|
504
|
+
elsif is_match("disabled", attr_name) && is_match(DISABLE_ELEMENT, elm.name)
|
|
481
505
|
edit_attrs_5(elm, attr_name, attr_value, @@pattern_disabled_m, @@pattern_disabled_r)
|
|
482
|
-
elsif is_match(
|
|
506
|
+
elsif is_match("checked", attr_name) && is_match("input", elm.name) && is_match("radio", get_type(elm))
|
|
483
507
|
edit_attrs_5(elm, attr_name, attr_value, @@pattern_checked_m, @@pattern_checked_r)
|
|
484
|
-
elsif is_match(
|
|
508
|
+
elsif is_match("readonly", attr_name) &&
|
|
509
|
+
(is_match("textarea", elm.name) || (is_match("input", elm.name) && is_match(READONLY_TYPE, get_type(elm))))
|
|
485
510
|
edit_attrs_5(elm, attr_name, attr_value, @@pattern_readonly_m, @@pattern_readonly_r)
|
|
486
511
|
else
|
|
487
512
|
super(elm, attr_name, attr_value)
|
|
@@ -495,37 +520,39 @@ module Meteor
|
|
|
495
520
|
@res = match_p.match(elm.attributes)
|
|
496
521
|
|
|
497
522
|
if !@res
|
|
498
|
-
if !
|
|
499
|
-
elm.attributes = String.new(
|
|
523
|
+
if !"".eql?(elm.attributes) && !"".eql?(elm.attributes.strip)
|
|
524
|
+
elm.attributes = String.new("") << " " << elm.attributes.strip
|
|
500
525
|
else
|
|
501
|
-
elm.attributes = String.new(
|
|
526
|
+
elm.attributes = String.new("")
|
|
502
527
|
end
|
|
503
|
-
|
|
528
|
+
|
|
529
|
+
elm.attributes << " " << attr_name
|
|
504
530
|
# else
|
|
505
531
|
end
|
|
506
532
|
elsif false.equal?(attr_value) || is_match("false", attr_value)
|
|
507
|
-
elm.attributes.sub!(replace,
|
|
533
|
+
elm.attributes.sub!(replace, "")
|
|
508
534
|
end
|
|
509
535
|
end
|
|
510
536
|
|
|
511
537
|
private :edit_attrs_5
|
|
512
538
|
|
|
513
539
|
def edit_document_1(elm)
|
|
514
|
-
edit_document_2(elm,
|
|
540
|
+
edit_document_2(elm, ">")
|
|
515
541
|
end
|
|
516
542
|
|
|
517
543
|
private :edit_document_1
|
|
518
544
|
|
|
519
545
|
def get_attr_value_(elm, attr_name)
|
|
520
|
-
if is_match(
|
|
546
|
+
if is_match("selected", attr_name) && is_match("option", elm.name)
|
|
521
547
|
get_attr_value_r(elm, @@pattern_selected_m)
|
|
522
|
-
elsif is_match(
|
|
548
|
+
elsif is_match("multiple", attr_name) && is_match("select", elm.name)
|
|
523
549
|
get_attr_value_r(elm, @@pattern_multiple_m)
|
|
524
|
-
elsif is_match(
|
|
550
|
+
elsif is_match("disabled", attr_name) && is_match(DISABLE_ELEMENT, elm.name)
|
|
525
551
|
get_attr_value_r(elm, @@pattern_disabled_m)
|
|
526
|
-
elsif is_match(
|
|
552
|
+
elsif is_match("checked", attr_name) && is_match("input", elm.name) && is_match("radio", get_type(elm))
|
|
527
553
|
get_attr_value_r(elm, @@pattern_checked_m)
|
|
528
|
-
elsif is_match(
|
|
554
|
+
elsif is_match("readonly", attr_name) &&
|
|
555
|
+
(is_match("textarea", elm.name) || (is_match("input", elm.name) && is_match(READONLY_TYPE, get_type(elm))))
|
|
529
556
|
get_attr_value_r(elm, @@pattern_readonly_m)
|
|
530
557
|
else
|
|
531
558
|
super(elm, attr_name)
|
|
@@ -536,11 +563,12 @@ module Meteor
|
|
|
536
563
|
|
|
537
564
|
def get_type(elm)
|
|
538
565
|
if !elm.type_value
|
|
539
|
-
elm.type_value = get_attr_value_(elm,
|
|
566
|
+
elm.type_value = get_attr_value_(elm, "type")
|
|
540
567
|
if !elm.type_value
|
|
541
568
|
elm.type_value = get_attr_value_(elm, "TYPE")
|
|
542
569
|
end
|
|
543
570
|
end
|
|
571
|
+
|
|
544
572
|
elm.type_value
|
|
545
573
|
end
|
|
546
574
|
|
|
@@ -606,13 +634,13 @@ module Meteor
|
|
|
606
634
|
def remove_attrs_(elm, attr_name)
|
|
607
635
|
if !is_match(@@attr_logic, attr_name)
|
|
608
636
|
# attribute search pattern (属性検索用パターン)
|
|
609
|
-
@pattern = Meteor::Core::Util::PatternCache.get(String.new(
|
|
637
|
+
@pattern = Meteor::Core::Util::PatternCache.get(String.new("") << attr_name << "=\"[^\"]*\"\\s?")
|
|
610
638
|
# @pattern = Meteor::Core::Util::PatternCache.get("#{attr_name}=\"[^\"]*\"\\s?")
|
|
611
|
-
elm.attributes.sub!(@pattern,
|
|
639
|
+
elm.attributes.sub!(@pattern, "")
|
|
612
640
|
else
|
|
613
641
|
# attribute search pattern (属性検索用パターン)
|
|
614
642
|
@pattern = Meteor::Core::Util::PatternCache.get(attr_name)
|
|
615
|
-
elm.attributes.sub!(@pattern,
|
|
643
|
+
elm.attributes.sub!(@pattern, "")
|
|
616
644
|
end
|
|
617
645
|
end
|
|
618
646
|
|
|
@@ -644,18 +672,18 @@ module Meteor
|
|
|
644
672
|
# 「&」<-「&」
|
|
645
673
|
content.gsub(@@pattern_unescape) do
|
|
646
674
|
case $1
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
675
|
+
when "amp"
|
|
676
|
+
"&"
|
|
677
|
+
when "quot"
|
|
678
|
+
"\""
|
|
679
|
+
when "apos"
|
|
680
|
+
"'"
|
|
681
|
+
when "gt"
|
|
682
|
+
">"
|
|
683
|
+
when "lt"
|
|
684
|
+
"<"
|
|
685
|
+
when "nbsp"
|
|
686
|
+
" "
|
|
659
687
|
end
|
|
660
688
|
end
|
|
661
689
|
|
|
@@ -8,16 +8,19 @@ module Meteor
|
|
|
8
8
|
# XHTML parser (XHTMLパーサ)
|
|
9
9
|
#
|
|
10
10
|
class ParserImpl < Meteor::Ml::Xhtml4::ParserImpl
|
|
11
|
-
|
|
11
|
+
#[Array] 論理値で指定する属性
|
|
12
|
+
ATTR_LOGIC = ["disabled", "readonly", "checked", "selected", "multiple", "required"]
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
#[Array] disabled属性のある要素
|
|
15
|
+
DISABLE_ELEMENT = ["input", "textarea", "select", "optgroup", "fieldset"]
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
#[Array] required属性のある要素
|
|
18
|
+
REQUIRE_ELEMENT = ["input", "textarea"]
|
|
16
19
|
|
|
17
|
-
REQUIRED_M =
|
|
18
|
-
REQUIRED_M1 =
|
|
19
|
-
REQUIRED_R =
|
|
20
|
-
REQUIRED_U =
|
|
20
|
+
REQUIRED_M = "\\srequired=\"[^\"]*\"\\s|\\srequired=\"[^\"]*\"$"
|
|
21
|
+
REQUIRED_M1 = "\\srequired=\"([^\"]*)\"\\s|\\srequired=\"([^\"]*)\"$"
|
|
22
|
+
REQUIRED_R = "required=\"[^\"]*\""
|
|
23
|
+
REQUIRED_U = "required=\"required\""
|
|
21
24
|
|
|
22
25
|
@@pattern_required_m = Regexp.new(REQUIRED_M)
|
|
23
26
|
@@pattern_required_m1 = Regexp.new(REQUIRED_M1)
|
|
@@ -34,12 +37,12 @@ module Meteor
|
|
|
34
37
|
@@attr_logic = ATTR_LOGIC
|
|
35
38
|
@doc_type = Parser::XHTML
|
|
36
39
|
case args.length
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
when ZERO
|
|
41
|
+
# initialize_0
|
|
42
|
+
when ONE
|
|
43
|
+
initialize_1(args[0])
|
|
44
|
+
else
|
|
45
|
+
raise ArgumentError
|
|
43
46
|
end
|
|
44
47
|
end
|
|
45
48
|
|
|
@@ -71,10 +74,10 @@ module Meteor
|
|
|
71
74
|
def analyze_content_type
|
|
72
75
|
@error_check = false
|
|
73
76
|
|
|
74
|
-
element_3(
|
|
77
|
+
element_3("meta", "charset", "[a-zA-Z-]+", false)
|
|
75
78
|
|
|
76
79
|
if !@elm_
|
|
77
|
-
element_3(
|
|
80
|
+
element_3("meta", "charset", "[a-zA-Z-]+", false)
|
|
78
81
|
end
|
|
79
82
|
|
|
80
83
|
@error_check = true
|
|
@@ -88,44 +91,45 @@ module Meteor
|
|
|
88
91
|
@root.charset = "utf-8"
|
|
89
92
|
end
|
|
90
93
|
|
|
91
|
-
@root.content_type =
|
|
94
|
+
@root.content_type = "text/html"
|
|
92
95
|
end
|
|
93
96
|
|
|
94
97
|
private :analyze_content_type
|
|
95
98
|
|
|
96
99
|
def edit_attrs_(elm, attr_name, attr_value)
|
|
97
|
-
if is_match(
|
|
100
|
+
if is_match("selected", attr_name) && is_match("option", elm.name)
|
|
98
101
|
edit_attrs_5(elm, attr_value, @@pattern_selected_m, @@pattern_selected_r, SELECTED_U)
|
|
99
|
-
elsif is_match(
|
|
102
|
+
elsif is_match("multiple", attr_name) && is_match("select", elm.name)
|
|
100
103
|
edit_attrs_5(elm, attr_value, @@pattern_multiple_m, @@pattern_multiple_r, MULTIPLE_U)
|
|
101
|
-
elsif is_match(
|
|
104
|
+
elsif is_match("disabled", attr_name) && is_match(DISABLE_ELEMENT, elm.name)
|
|
102
105
|
edit_attrs_5(elm, attr_value, @@pattern_disabled_m, @@pattern_disabled_r, DISABLED_U)
|
|
103
|
-
elsif is_match(
|
|
106
|
+
elsif is_match("checked", attr_name) && is_match("input", elm.name) && is_match("radio", get_type(elm))
|
|
104
107
|
edit_attrs_5(elm, attr_value, @@pattern_checked_m, @@pattern_checked_r, CHECKED_U)
|
|
105
|
-
elsif is_match(
|
|
108
|
+
elsif is_match("readonly", attr_name) &&
|
|
109
|
+
(is_match("textarea", elm.name) || (is_match("input", elm.name) && is_match(READONLY_TYPE, get_type(elm))))
|
|
106
110
|
edit_attrs_5(elm, attr_value, @@pattern_readonly_m, @@pattern_readonly_r, READONLY_U)
|
|
107
|
-
elsif is_match(
|
|
111
|
+
elsif is_match("required", attr_name) && is_match(REQUIRE_ELEMENT, elm.name)
|
|
108
112
|
edit_attrs_5(elm, attr_value, @@pattern_required_m, @@pattern_required_r, REQUIRED_U)
|
|
109
113
|
else
|
|
110
114
|
super(elm, attr_name, attr_value)
|
|
111
115
|
end
|
|
112
|
-
|
|
113
116
|
end
|
|
114
117
|
|
|
115
118
|
private :edit_attrs_
|
|
116
119
|
|
|
117
120
|
def get_attr_value_(elm, attr_name)
|
|
118
|
-
if is_match(
|
|
121
|
+
if is_match("selected", attr_name) && is_match("option", elm.name)
|
|
119
122
|
get_attr_value_r(elm, attr_name, @@pattern_selected_m1)
|
|
120
|
-
elsif is_match(
|
|
123
|
+
elsif is_match("multiple", attr_name) && is_match("select", elm.name)
|
|
121
124
|
get_attr_value_r(elm, attr_name, @@pattern_multiple_m1)
|
|
122
|
-
elsif is_match(
|
|
125
|
+
elsif is_match("disabled", attr_name) && is_match(DISABLE_ELEMENT, elm.name)
|
|
123
126
|
get_attr_value_r(elm, attr_name, @@pattern_disabled_m1)
|
|
124
|
-
elsif is_match(
|
|
127
|
+
elsif is_match("checked", attr_name) && is_match("input", elm.name) && is_match("radio", get_type(elm))
|
|
125
128
|
get_attr_value_r(elm, attr_name, @@pattern_checked_m1)
|
|
126
|
-
elsif is_match(
|
|
129
|
+
elsif is_match("readonly", attr_name) &&
|
|
130
|
+
(is_match("textarea", elm.name) || (is_match("input", elm.name) && is_match(READONLY_TYPE, get_type(elm))))
|
|
127
131
|
get_attr_value_r(elm, attr_name, @@pattern_readonly_m1)
|
|
128
|
-
elsif is_match(
|
|
132
|
+
elsif is_match("required", attr_name) && is_match(REQUIRE_ELEMENT, elm.name)
|
|
129
133
|
get_attr_value_r(elm, attr_name, @@pattern_required_m1)
|
|
130
134
|
else
|
|
131
135
|
super(elm, attr_name)
|