nokogiri 1.4.7 → 1.5.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (164) hide show
  1. data/CHANGELOG.ja.rdoc +8 -83
  2. data/CHANGELOG.rdoc +6 -80
  3. data/Manifest.txt +4 -74
  4. data/README.ja.rdoc +5 -1
  5. data/README.rdoc +8 -22
  6. data/Rakefile +79 -60
  7. data/bin/nokogiri +1 -6
  8. data/deps.rip +5 -0
  9. data/ext/nokogiri/extconf.rb +32 -53
  10. data/ext/nokogiri/nokogiri.c +0 -2
  11. data/ext/nokogiri/nokogiri.h +0 -9
  12. data/ext/nokogiri/xml_document.c +0 -14
  13. data/ext/nokogiri/xml_dtd.c +2 -2
  14. data/ext/nokogiri/xml_io.c +7 -32
  15. data/ext/nokogiri/xml_node.c +31 -103
  16. data/ext/nokogiri/xml_node_set.c +8 -8
  17. data/ext/nokogiri/xml_reader.c +1 -20
  18. data/ext/nokogiri/xml_sax_parser.c +3 -5
  19. data/ext/nokogiri/xml_sax_parser_context.c +0 -40
  20. data/ext/nokogiri/xml_xpath_context.c +2 -35
  21. data/ext/nokogiri/xslt_stylesheet.c +6 -124
  22. data/lib/nokogiri.rb +7 -3
  23. data/lib/nokogiri/css.rb +3 -6
  24. data/lib/nokogiri/css/generated_parser.rb +669 -0
  25. data/lib/nokogiri/css/generated_tokenizer.rb +145 -0
  26. data/lib/nokogiri/css/parser.rb +70 -665
  27. data/lib/nokogiri/css/parser.y +1 -6
  28. data/lib/nokogiri/css/tokenizer.rb +3 -148
  29. data/lib/nokogiri/css/tokenizer.rex +1 -1
  30. data/lib/nokogiri/css/xpath_visitor.rb +14 -16
  31. data/lib/nokogiri/decorators/slop.rb +3 -5
  32. data/lib/nokogiri/html.rb +3 -2
  33. data/lib/nokogiri/html/document.rb +18 -134
  34. data/lib/nokogiri/html/document_fragment.rb +21 -26
  35. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  36. data/lib/nokogiri/html/sax/parser.rb +2 -6
  37. data/lib/nokogiri/version.rb +4 -9
  38. data/lib/nokogiri/xml/attribute_decl.rb +1 -1
  39. data/lib/nokogiri/xml/builder.rb +1 -1
  40. data/lib/nokogiri/xml/document.rb +3 -27
  41. data/lib/nokogiri/xml/document_fragment.rb +2 -9
  42. data/lib/nokogiri/xml/dtd.rb +1 -12
  43. data/lib/nokogiri/xml/element_decl.rb +1 -1
  44. data/lib/nokogiri/xml/entity_decl.rb +1 -1
  45. data/lib/nokogiri/xml/node.rb +75 -172
  46. data/lib/nokogiri/xml/node/save_options.rb +0 -10
  47. data/lib/nokogiri/xml/node_set.rb +3 -28
  48. data/lib/nokogiri/xml/parse_options.rb +0 -8
  49. data/lib/nokogiri/xml/reader.rb +6 -44
  50. data/lib/nokogiri/xml/sax/document.rb +5 -9
  51. data/lib/nokogiri/xml/schema.rb +1 -7
  52. data/lib/nokogiri/xslt.rb +5 -9
  53. data/tasks/cross_compile.rb +12 -27
  54. data/tasks/test.rb +0 -0
  55. data/test/css/test_parser.rb +19 -40
  56. data/test/css/test_tokenizer.rb +0 -8
  57. data/test/helper.rb +1 -4
  58. data/test/html/sax/test_parser.rb +21 -47
  59. data/test/html/sax/test_parser_context.rb +2 -2
  60. data/test/html/test_document.rb +3 -58
  61. data/test/html/test_document_encoding.rb +0 -53
  62. data/test/html/test_document_fragment.rb +13 -82
  63. data/test/html/test_element_description.rb +4 -2
  64. data/test/html/test_node.rb +0 -9
  65. data/test/test_memory_leak.rb +2 -57
  66. data/test/test_nokogiri.rb +14 -20
  67. data/test/test_reader.rb +7 -47
  68. data/test/test_xslt_transforms.rb +5 -8
  69. data/test/xml/sax/test_parser.rb +17 -34
  70. data/test/xml/sax/test_parser_context.rb +0 -50
  71. data/test/xml/sax/test_push_parser.rb +1 -18
  72. data/test/xml/test_attr.rb +4 -31
  73. data/test/xml/test_attribute_decl.rb +7 -3
  74. data/test/xml/test_builder.rb +5 -5
  75. data/test/xml/test_cdata.rb +3 -3
  76. data/test/xml/test_document.rb +18 -15
  77. data/test/xml/test_document_fragment.rb +20 -19
  78. data/test/xml/test_dtd.rb +13 -18
  79. data/test/xml/test_element_content.rb +1 -1
  80. data/test/xml/test_element_decl.rb +1 -1
  81. data/test/xml/test_entity_decl.rb +12 -10
  82. data/test/xml/test_namespace.rb +7 -5
  83. data/test/xml/test_node.rb +15 -54
  84. data/test/xml/test_node_reparenting.rb +42 -85
  85. data/test/xml/test_node_set.rb +2 -61
  86. data/test/xml/test_schema.rb +0 -5
  87. data/test/xml/test_text.rb +2 -11
  88. data/test/xml/test_unparented_node.rb +1 -1
  89. data/test/xml/test_xpath.rb +7 -43
  90. metadata +131 -155
  91. data/.gemtest +0 -0
  92. data/ext/nokogiri/depend +0 -358
  93. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  94. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  95. data/lib/nokogiri/css/parser_extras.rb +0 -91
  96. data/lib/nokogiri/ffi/encoding_handler.rb +0 -42
  97. data/lib/nokogiri/ffi/html/document.rb +0 -28
  98. data/lib/nokogiri/ffi/html/element_description.rb +0 -81
  99. data/lib/nokogiri/ffi/html/entity_lookup.rb +0 -16
  100. data/lib/nokogiri/ffi/html/sax/parser_context.rb +0 -38
  101. data/lib/nokogiri/ffi/io_callbacks.rb +0 -42
  102. data/lib/nokogiri/ffi/libxml.rb +0 -420
  103. data/lib/nokogiri/ffi/structs/common_node.rb +0 -38
  104. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +0 -24
  105. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +0 -13
  106. data/lib/nokogiri/ffi/structs/xml_alloc.rb +0 -16
  107. data/lib/nokogiri/ffi/structs/xml_attr.rb +0 -20
  108. data/lib/nokogiri/ffi/structs/xml_attribute.rb +0 -27
  109. data/lib/nokogiri/ffi/structs/xml_buffer.rb +0 -16
  110. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +0 -11
  111. data/lib/nokogiri/ffi/structs/xml_document.rb +0 -117
  112. data/lib/nokogiri/ffi/structs/xml_dtd.rb +0 -28
  113. data/lib/nokogiri/ffi/structs/xml_element.rb +0 -26
  114. data/lib/nokogiri/ffi/structs/xml_element_content.rb +0 -17
  115. data/lib/nokogiri/ffi/structs/xml_entity.rb +0 -32
  116. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +0 -12
  117. data/lib/nokogiri/ffi/structs/xml_node.rb +0 -28
  118. data/lib/nokogiri/ffi/structs/xml_node_set.rb +0 -53
  119. data/lib/nokogiri/ffi/structs/xml_notation.rb +0 -11
  120. data/lib/nokogiri/ffi/structs/xml_ns.rb +0 -15
  121. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +0 -20
  122. data/lib/nokogiri/ffi/structs/xml_parser_input.rb +0 -19
  123. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +0 -14
  124. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +0 -51
  125. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +0 -124
  126. data/lib/nokogiri/ffi/structs/xml_schema.rb +0 -13
  127. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +0 -31
  128. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +0 -12
  129. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +0 -38
  130. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +0 -35
  131. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +0 -20
  132. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +0 -13
  133. data/lib/nokogiri/ffi/weak_bucket.rb +0 -40
  134. data/lib/nokogiri/ffi/xml/attr.rb +0 -41
  135. data/lib/nokogiri/ffi/xml/attribute_decl.rb +0 -27
  136. data/lib/nokogiri/ffi/xml/cdata.rb +0 -19
  137. data/lib/nokogiri/ffi/xml/comment.rb +0 -18
  138. data/lib/nokogiri/ffi/xml/document.rb +0 -174
  139. data/lib/nokogiri/ffi/xml/document_fragment.rb +0 -21
  140. data/lib/nokogiri/ffi/xml/dtd.rb +0 -67
  141. data/lib/nokogiri/ffi/xml/element_content.rb +0 -43
  142. data/lib/nokogiri/ffi/xml/element_decl.rb +0 -19
  143. data/lib/nokogiri/ffi/xml/entity_decl.rb +0 -36
  144. data/lib/nokogiri/ffi/xml/entity_reference.rb +0 -19
  145. data/lib/nokogiri/ffi/xml/namespace.rb +0 -44
  146. data/lib/nokogiri/ffi/xml/node.rb +0 -559
  147. data/lib/nokogiri/ffi/xml/node_set.rb +0 -150
  148. data/lib/nokogiri/ffi/xml/processing_instruction.rb +0 -20
  149. data/lib/nokogiri/ffi/xml/reader.rb +0 -236
  150. data/lib/nokogiri/ffi/xml/relax_ng.rb +0 -85
  151. data/lib/nokogiri/ffi/xml/sax/parser.rb +0 -143
  152. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +0 -79
  153. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +0 -51
  154. data/lib/nokogiri/ffi/xml/schema.rb +0 -109
  155. data/lib/nokogiri/ffi/xml/syntax_error.rb +0 -98
  156. data/lib/nokogiri/ffi/xml/text.rb +0 -18
  157. data/lib/nokogiri/ffi/xml/xpath.rb +0 -9
  158. data/lib/nokogiri/ffi/xml/xpath_context.rb +0 -153
  159. data/lib/nokogiri/ffi/xslt/stylesheet.rb +0 -77
  160. data/test/decorators/test_slop.rb +0 -16
  161. data/test/ffi/test_document.rb +0 -35
  162. data/test/files/encoding.html +0 -82
  163. data/test/files/encoding.xhtml +0 -84
  164. data/test/xslt/test_custom_functions.rb +0 -94
@@ -0,0 +1,145 @@
1
+ #--
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by rex 1.0.4
4
+ # from lexical definition file "lib/nokogiri/css/tokenizer.rex".
5
+ #++
6
+
7
+ module Nokogiri
8
+ module CSS
9
+ class GeneratedTokenizer < GeneratedParser
10
+ require 'strscan'
11
+
12
+ class ScanError < StandardError ; end
13
+
14
+ attr_reader :lineno
15
+ attr_reader :filename
16
+ attr_accessor :state
17
+
18
+ def scan_setup(str)
19
+ @ss = StringScanner.new(str)
20
+ @lineno = 1
21
+ @state = nil
22
+ end
23
+
24
+ def action(&block)
25
+ yield
26
+ end
27
+
28
+ def scan_str(str)
29
+ scan_setup(str)
30
+ do_parse
31
+ end
32
+
33
+ def load_file( filename )
34
+ @filename = filename
35
+ open(filename, "r") do |f|
36
+ scan_setup(f.read)
37
+ end
38
+ end
39
+
40
+ def scan_file( filename )
41
+ load_file(filename)
42
+ do_parse
43
+ end
44
+
45
+
46
+ def next_token
47
+ return if @ss.eos?
48
+
49
+ text = @ss.peek(1)
50
+ @lineno += 1 if text == "\n"
51
+ token = case @state
52
+ when nil
53
+ case
54
+ when (text = @ss.scan(/has\([\s]*/))
55
+ action { [:HAS, text] }
56
+
57
+ when (text = @ss.scan(/[-@]?([_A-Za-z]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])([_A-Za-z0-9-]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])*\([\s]*/))
58
+ action { [:FUNCTION, text] }
59
+
60
+ when (text = @ss.scan(/[-@]?([_A-Za-z]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])([_A-Za-z0-9-]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])*/))
61
+ action { [:IDENT, text] }
62
+
63
+ when (text = @ss.scan(/\#([_A-Za-z0-9-]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])+/))
64
+ action { [:HASH, text] }
65
+
66
+ when (text = @ss.scan(/[\s]*~=[\s]*/))
67
+ action { [:INCLUDES, text] }
68
+
69
+ when (text = @ss.scan(/[\s]*\|=[\s]*/))
70
+ action { [:DASHMATCH, text] }
71
+
72
+ when (text = @ss.scan(/[\s]*\^=[\s]*/))
73
+ action { [:PREFIXMATCH, text] }
74
+
75
+ when (text = @ss.scan(/[\s]*\$=[\s]*/))
76
+ action { [:SUFFIXMATCH, text] }
77
+
78
+ when (text = @ss.scan(/[\s]*\*=[\s]*/))
79
+ action { [:SUBSTRINGMATCH, text] }
80
+
81
+ when (text = @ss.scan(/[\s]*!=[\s]*/))
82
+ action { [:NOT_EQUAL, text] }
83
+
84
+ when (text = @ss.scan(/[\s]*=[\s]*/))
85
+ action { [:EQUAL, text] }
86
+
87
+ when (text = @ss.scan(/[\s]*\)/))
88
+ action { [:RPAREN, text] }
89
+
90
+ when (text = @ss.scan(/[\s]*\[[\s]*/))
91
+ action { [:LSQUARE, text] }
92
+
93
+ when (text = @ss.scan(/[\s]*\]/))
94
+ action { [:RSQUARE, text] }
95
+
96
+ when (text = @ss.scan(/[\s]*\+[\s]*/))
97
+ action { [:PLUS, text] }
98
+
99
+ when (text = @ss.scan(/[\s]*>[\s]*/))
100
+ action { [:GREATER, text] }
101
+
102
+ when (text = @ss.scan(/[\s]*,[\s]*/))
103
+ action { [:COMMA, text] }
104
+
105
+ when (text = @ss.scan(/[\s]*~[\s]*/))
106
+ action { [:TILDE, text] }
107
+
108
+ when (text = @ss.scan(/\:not\([\s]*/))
109
+ action { [:NOT, text] }
110
+
111
+ when (text = @ss.scan(/-?([0-9]+|[0-9]*\.[0-9]+)/))
112
+ action { [:NUMBER, text] }
113
+
114
+ when (text = @ss.scan(/[\s]*\/\/[\s]*/))
115
+ action { [:DOUBLESLASH, text] }
116
+
117
+ when (text = @ss.scan(/[\s]*\/[\s]*/))
118
+ action { [:SLASH, text] }
119
+
120
+ when (text = @ss.scan(/U\+[0-9a-f?]{1,6}(-[0-9a-f]{1,6})?/))
121
+ action {[:UNICODE_RANGE, text] }
122
+
123
+ when (text = @ss.scan(/[\s]+/))
124
+ action { [:S, text] }
125
+
126
+ when (text = @ss.scan(/"([^\n\r\f"]|\n|\r\n|\r|\f|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])*"|'([^\n\r\f']|\n|\r\n|\r|\f|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])*'/))
127
+ action { [:STRING, text] }
128
+
129
+ when (text = @ss.scan(/./))
130
+ action { [text, text] }
131
+
132
+ else
133
+ text = @ss.string[@ss.pos .. -1]
134
+ raise ScanError, "can not match: '" + text + "'"
135
+ end # if
136
+
137
+ else
138
+ raise ScanError, "undefined state: '" + state.to_s + "'"
139
+ end # case state
140
+ token
141
+ end # def next_token
142
+
143
+ end # class
144
+ end
145
+ end
@@ -1,677 +1,82 @@
1
- #
2
- # DO NOT MODIFY!!!!
3
- # This file is automatically generated by Racc 1.4.6
4
- # from Racc grammer file "".
5
- #
1
+ require 'thread'
6
2
 
7
- require 'racc/parser.rb'
8
-
9
-
10
- require 'nokogiri/css/parser_extras'
11
3
  module Nokogiri
12
4
  module CSS
13
- class Parser < Racc::Parser
14
- ##### State transition tables begin ###
15
-
16
- racc_action_table = [
17
- 12, 21, 46, 47, 20, 45, 22, 12, 65, 9,
18
- 78, 20, 76, 22, 12, 42, 9, 85, 20, 13,
19
- 90, 89, 11, 9, 14, 7, 13, 10, 15, 11,
20
- 81, 14, 7, 13, 10, 15, 11, 20, 14, 7,
21
- 12, 10, 15, 77, 20, 11, 80, 79, 20, 9,
22
- 84, 15, 20, 9, 79, 11, 20, 82, 7, 13,
23
- 20, 15, 11, 26, 14, 7, 11, 10, 15, 7,
24
- 11, 10, 15, 7, 11, 26, 15, 7, 11, 12,
25
- 15, 7, 86, 20, 15, 58, 88, 20, 39, 83,
26
- 41, 12, 46, 50, 82, 49, 46, 50, 13, 49,
27
- 53, 11, -23, 14, 7, 11, 91, 15, 7, 38,
28
- 13, 15, 73, 74, 93, 14, 37, 73, 74, 46,
29
- 50, 26, 49, 69, 70, 71, 96, 72, 69, 70,
30
- 71, 68, 72, 30, 31, 33, 68, 46, 50, 97,
31
- 49, nil, nil, 32, nil, 35, 34 ]
32
-
33
- racc_action_check = [
34
- 0, 1, 12, 12, 0, 12, 51, 36, 38, 0,
35
- 44, 36, 41, 1, 22, 12, 36, 51, 22, 0,
36
- 67, 67, 0, 22, 0, 0, 36, 0, 0, 36,
37
- 46, 36, 36, 22, 36, 36, 22, 62, 22, 22,
38
- 14, 22, 22, 43, 14, 4, 45, 45, 26, 14,
39
- 48, 4, 18, 26, 49, 62, 17, 50, 62, 14,
40
- 3, 62, 14, 24, 14, 14, 26, 14, 14, 26,
41
- 18, 26, 26, 18, 17, 3, 18, 17, 3, 11,
42
- 17, 3, 61, 16, 3, 21, 66, 19, 11, 47,
43
- 11, 15, 13, 13, 47, 13, 82, 82, 11, 82,
44
- 15, 16, 9, 11, 16, 19, 75, 16, 19, 8,
45
- 15, 19, 39, 39, 80, 15, 7, 40, 40, 81,
46
- 81, 5, 81, 39, 39, 39, 83, 39, 40, 40,
47
- 40, 39, 40, 6, 6, 6, 40, 79, 79, 93,
48
- 79, nil, nil, 6, nil, 6, 6 ]
49
-
50
- racc_action_pointer = [
51
- -2, 1, nil, 54, 21, 100, 126, 105, 81, 74,
52
- nil, 77, -8, 82, 38, 89, 77, 50, 46, 81,
53
- nil, 85, 12, nil, 42, nil, 42, nil, nil, nil,
54
- nil, nil, nil, nil, nil, nil, 5, nil, -3, 109,
55
- 114, -13, nil, 20, -13, 35, 18, 82, 27, 42,
56
- 45, -6, nil, nil, nil, nil, nil, nil, nil, nil,
57
- nil, 59, 31, nil, nil, nil, 61, 10, nil, nil,
58
- nil, nil, nil, nil, nil, 81, nil, nil, nil, 127,
59
- 107, 109, 86, 113, nil, nil, nil, nil, nil, nil,
60
- nil, nil, nil, 126, nil, nil, nil, nil ]
61
-
62
- racc_action_default = [
63
- -24, -69, -2, -45, -12, -16, -18, -69, -69, -21,
64
- -22, -69, -69, -69, -24, -69, -50, -51, -52, -53,
65
- -54, -69, -24, -9, -44, -11, -24, -13, -14, -15,
66
- -3, -4, -5, -6, -7, -8, -24, -19, -69, -57,
67
- -57, -69, -28, -69, -69, -36, -37, -38, -69, -36,
68
- -38, -69, -42, -43, -46, -47, -48, -49, 98, -1,
69
- -10, -69, -66, -68, -17, -20, -69, -69, -58, -59,
70
- -60, -61, -62, -63, -64, -69, -27, -29, -30, -69,
71
- -41, -69, -69, -69, -31, -32, -65, -67, -25, -55,
72
- -56, -26, -33, -69, -34, -35, -40, -39 ]
73
-
74
- racc_goto_table = [
75
- 43, 48, 24, 25, 40, 29, 59, 1, 52, 66,
76
- 75, 23, 27, 28, 62, 54, 55, 56, 57, 36,
77
- 64, 51, 44, 61, 60, 63, nil, nil, nil, nil,
78
- nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
79
- nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
80
- nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
81
- nil, 87, nil, nil, nil, nil, nil, 92, nil, 94,
82
- 95 ]
83
-
84
- racc_goto_check = [
85
- 15, 15, 7, 8, 9, 8, 2, 1, 9, 14,
86
- 14, 6, 10, 11, 5, 7, 7, 7, 7, 3,
87
- 2, 1, 16, 19, 8, 7, nil, nil, nil, nil,
88
- nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
89
- nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
90
- nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
91
- nil, 7, nil, nil, nil, nil, nil, 15, nil, 15,
92
- 15 ]
93
-
94
- racc_goto_pointer = [
95
- nil, 7, -16, 13, nil, -12, 8, -1, 0, -7,
96
- 8, 9, nil, nil, -30, -12, 10, nil, nil, -3 ]
97
-
98
- racc_goto_default = [
99
- nil, nil, 2, nil, 6, 3, nil, 5, nil, 4,
100
- 19, 18, 17, 8, nil, nil, nil, 16, 67, nil ]
101
-
102
- racc_reduce_table = [
103
- 0, 0, :racc_error,
104
- 3, 32, :_reduce_1,
105
- 1, 32, :_reduce_2,
106
- 1, 34, :_reduce_3,
107
- 1, 34, :_reduce_4,
108
- 1, 34, :_reduce_5,
109
- 1, 34, :_reduce_6,
110
- 1, 34, :_reduce_7,
111
- 1, 34, :_reduce_8,
112
- 2, 35, :_reduce_9,
113
- 3, 35, :_reduce_10,
114
- 2, 35, :_reduce_11,
115
- 1, 35, :_reduce_none,
116
- 2, 35, :_reduce_13,
117
- 2, 35, :_reduce_14,
118
- 2, 35, :_reduce_15,
119
- 1, 35, :_reduce_16,
120
- 3, 33, :_reduce_17,
121
- 1, 33, :_reduce_none,
122
- 2, 43, :_reduce_19,
123
- 3, 36, :_reduce_20,
124
- 1, 36, :_reduce_21,
125
- 1, 36, :_reduce_22,
126
- 1, 44, :_reduce_23,
127
- 0, 44, :_reduce_none,
128
- 4, 42, :_reduce_25,
129
- 4, 42, :_reduce_26,
130
- 3, 42, :_reduce_27,
131
- 2, 40, :_reduce_28,
132
- 3, 40, :_reduce_29,
133
- 3, 40, :_reduce_30,
134
- 3, 40, :_reduce_31,
135
- 3, 40, :_reduce_32,
136
- 3, 46, :_reduce_33,
137
- 3, 46, :_reduce_34,
138
- 3, 46, :_reduce_35,
139
- 1, 46, :_reduce_none,
140
- 1, 46, :_reduce_none,
141
- 1, 46, :_reduce_38,
142
- 4, 47, :_reduce_39,
143
- 3, 47, :_reduce_40,
144
- 2, 47, :_reduce_41,
145
- 2, 41, :_reduce_42,
146
- 2, 41, :_reduce_43,
147
- 1, 37, :_reduce_none,
148
- 0, 37, :_reduce_none,
149
- 2, 38, :_reduce_46,
150
- 2, 38, :_reduce_47,
151
- 2, 38, :_reduce_48,
152
- 2, 38, :_reduce_49,
153
- 1, 38, :_reduce_none,
154
- 1, 38, :_reduce_none,
155
- 1, 38, :_reduce_none,
156
- 1, 38, :_reduce_none,
157
- 1, 48, :_reduce_54,
158
- 2, 45, :_reduce_55,
159
- 2, 45, :_reduce_56,
160
- 0, 45, :_reduce_none,
161
- 1, 49, :_reduce_58,
162
- 1, 49, :_reduce_59,
163
- 1, 49, :_reduce_60,
164
- 1, 49, :_reduce_61,
165
- 1, 49, :_reduce_62,
166
- 1, 49, :_reduce_63,
167
- 1, 49, :_reduce_64,
168
- 3, 39, :_reduce_65,
169
- 1, 50, :_reduce_none,
170
- 2, 50, :_reduce_none,
171
- 1, 50, :_reduce_none ]
172
-
173
- racc_reduce_n = 69
174
-
175
- racc_shift_n = 98
176
-
177
- racc_token_table = {
178
- false => 0,
179
- :error => 1,
180
- :FUNCTION => 2,
181
- :INCLUDES => 3,
182
- :DASHMATCH => 4,
183
- :LBRACE => 5,
184
- :HASH => 6,
185
- :PLUS => 7,
186
- :GREATER => 8,
187
- :S => 9,
188
- :STRING => 10,
189
- :IDENT => 11,
190
- :COMMA => 12,
191
- :NUMBER => 13,
192
- :PREFIXMATCH => 14,
193
- :SUFFIXMATCH => 15,
194
- :SUBSTRINGMATCH => 16,
195
- :TILDE => 17,
196
- :NOT_EQUAL => 18,
197
- :SLASH => 19,
198
- :DOUBLESLASH => 20,
199
- :NOT => 21,
200
- :EQUAL => 22,
201
- :RPAREN => 23,
202
- :LSQUARE => 24,
203
- :RSQUARE => 25,
204
- :HAS => 26,
205
- "." => 27,
206
- "|" => 28,
207
- "*" => 29,
208
- ":" => 30 }
209
-
210
- racc_nt_base = 31
211
-
212
- racc_use_result_var = true
213
-
214
- Racc_arg = [
215
- racc_action_table,
216
- racc_action_check,
217
- racc_action_default,
218
- racc_action_pointer,
219
- racc_goto_table,
220
- racc_goto_check,
221
- racc_goto_default,
222
- racc_goto_pointer,
223
- racc_nt_base,
224
- racc_reduce_table,
225
- racc_token_table,
226
- racc_shift_n,
227
- racc_reduce_n,
228
- racc_use_result_var ]
229
-
230
- Racc_token_to_s_table = [
231
- "$end",
232
- "error",
233
- "FUNCTION",
234
- "INCLUDES",
235
- "DASHMATCH",
236
- "LBRACE",
237
- "HASH",
238
- "PLUS",
239
- "GREATER",
240
- "S",
241
- "STRING",
242
- "IDENT",
243
- "COMMA",
244
- "NUMBER",
245
- "PREFIXMATCH",
246
- "SUFFIXMATCH",
247
- "SUBSTRINGMATCH",
248
- "TILDE",
249
- "NOT_EQUAL",
250
- "SLASH",
251
- "DOUBLESLASH",
252
- "NOT",
253
- "EQUAL",
254
- "RPAREN",
255
- "LSQUARE",
256
- "RSQUARE",
257
- "HAS",
258
- "\".\"",
259
- "\"|\"",
260
- "\"*\"",
261
- "\":\"",
262
- "$start",
263
- "selector",
264
- "simple_selector_1toN",
265
- "combinator",
266
- "simple_selector",
267
- "element_name",
268
- "hcap_0toN",
269
- "hcap_1toN",
270
- "negation",
271
- "function",
272
- "pseudo",
273
- "attrib",
274
- "class",
275
- "namespace",
276
- "attrib_val_0or1",
277
- "expr",
278
- "an_plus_b",
279
- "attribute_id",
280
- "eql_incl_dash",
281
- "negation_arg" ]
282
-
283
- Racc_debug_parser = false
284
-
285
- ##### State transition tables end #####
286
-
287
- # reduce 0 omitted
288
-
289
- def _reduce_1(val, _values, result)
290
- result = [val.first, val.last].flatten
291
-
292
- result
293
- end
294
-
295
- def _reduce_2(val, _values, result)
296
- result = val.flatten
297
- result
298
- end
299
-
300
- def _reduce_3(val, _values, result)
301
- result = :DIRECT_ADJACENT_SELECTOR
302
- result
303
- end
304
-
305
- def _reduce_4(val, _values, result)
306
- result = :CHILD_SELECTOR
307
- result
308
- end
309
-
310
- def _reduce_5(val, _values, result)
311
- result = :PRECEDING_SELECTOR
312
- result
313
- end
314
-
315
- def _reduce_6(val, _values, result)
316
- result = :DESCENDANT_SELECTOR
317
- result
318
- end
319
-
320
- def _reduce_7(val, _values, result)
321
- result = :DESCENDANT_SELECTOR
322
- result
323
- end
324
-
325
- def _reduce_8(val, _values, result)
326
- result = :CHILD_SELECTOR
327
- result
328
- end
329
-
330
- def _reduce_9(val, _values, result)
331
- result = if val[1].nil?
332
- val.first
333
- else
334
- Node.new(:CONDITIONAL_SELECTOR, [val.first, val[1]])
335
- end
336
-
337
- result
338
- end
339
-
340
- def _reduce_10(val, _values, result)
341
- result = Node.new(:CONDITIONAL_SELECTOR,
342
- [
343
- val.first,
344
- Node.new(:COMBINATOR, [val[1], val.last])
345
- ]
346
- )
347
-
348
- result
349
- end
350
-
351
- def _reduce_11(val, _values, result)
352
- result = Node.new(:CONDITIONAL_SELECTOR, val)
353
-
354
- result
355
- end
356
-
357
- # reduce 12 omitted
358
-
359
- def _reduce_13(val, _values, result)
360
- result = Node.new(:CONDITIONAL_SELECTOR, val)
361
-
362
- result
363
- end
364
-
365
- def _reduce_14(val, _values, result)
366
- result = Node.new(:CONDITIONAL_SELECTOR, val)
367
-
368
- result
369
- end
370
-
371
- def _reduce_15(val, _values, result)
372
- result = Node.new(:CONDITIONAL_SELECTOR,
373
- [
374
- Node.new(:ELEMENT_NAME, ['*']),
375
- Node.new(:COMBINATOR, val)
376
- ]
377
- )
378
-
379
- result
380
- end
381
-
382
- def _reduce_16(val, _values, result)
383
- result = Node.new(:CONDITIONAL_SELECTOR,
384
- [Node.new(:ELEMENT_NAME, ['*']), val.first]
385
- )
386
-
387
- result
388
- end
389
-
390
- def _reduce_17(val, _values, result)
391
- result = Node.new(val[1], [val.first, val.last])
392
-
393
- result
394
- end
395
-
396
- # reduce 18 omitted
397
-
398
- def _reduce_19(val, _values, result)
399
- result = Node.new(:CLASS_CONDITION, [val[1]])
400
- result
401
- end
402
-
403
- def _reduce_20(val, _values, result)
404
- result = Node.new(:ELEMENT_NAME,
405
- [[val.first, val.last].compact.join(':')]
406
- )
407
-
408
- result
409
- end
410
-
411
- def _reduce_21(val, _values, result)
412
- name = @namespaces.key?('xmlns') ? "xmlns:#{val.first}" : val.first
413
- result = Node.new(:ELEMENT_NAME, [name])
414
-
415
- result
416
- end
417
-
418
- def _reduce_22(val, _values, result)
419
- result = Node.new(:ELEMENT_NAME, val)
420
- result
421
- end
422
-
423
- def _reduce_23(val, _values, result)
424
- result = val[0]
425
- result
426
- end
427
-
428
- # reduce 24 omitted
429
-
430
- def _reduce_25(val, _values, result)
431
- result = Node.new(:ATTRIBUTE_CONDITION,
432
- [Node.new(:ELEMENT_NAME, [val[1]])] + (val[2] || [])
433
- )
434
-
435
- result
436
- end
437
-
438
- def _reduce_26(val, _values, result)
439
- result = Node.new(:ATTRIBUTE_CONDITION,
440
- [val[1]] + (val[2] || [])
441
- )
442
-
443
- result
444
- end
445
-
446
- def _reduce_27(val, _values, result)
447
- # Non standard, but hpricot supports it.
448
- result = Node.new(:PSEUDO_CLASS,
449
- [Node.new(:FUNCTION, ['nth-child(', val[1]])]
450
- )
451
-
452
- result
453
- end
454
-
455
- def _reduce_28(val, _values, result)
456
- result = Node.new(:FUNCTION, [val.first.strip])
457
-
458
- result
459
- end
460
-
461
- def _reduce_29(val, _values, result)
462
- result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
463
-
464
- result
465
- end
466
-
467
- def _reduce_30(val, _values, result)
468
- result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
469
-
470
- result
471
- end
472
-
473
- def _reduce_31(val, _values, result)
474
- result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
475
-
476
- result
477
- end
478
-
479
- def _reduce_32(val, _values, result)
480
- result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
481
-
482
- result
483
- end
484
-
485
- def _reduce_33(val, _values, result)
486
- result = [val.first, val.last]
487
- result
488
- end
489
-
490
- def _reduce_34(val, _values, result)
491
- result = [val.first, val.last]
492
- result
493
- end
494
-
495
- def _reduce_35(val, _values, result)
496
- result = [val.first, val.last]
497
- result
498
- end
499
-
500
- # reduce 36 omitted
501
-
502
- # reduce 37 omitted
503
-
504
- def _reduce_38(val, _values, result)
505
- if val[0] == 'even'
506
- val = ["2","n","+","0"]
507
- result = Node.new(:AN_PLUS_B, val)
508
- elsif val[0] == 'odd'
509
- val = ["2","n","+","1"]
510
- result = Node.new(:AN_PLUS_B, val)
511
- else
512
- # This is not CSS standard. It allows us to support this:
513
- # assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)'))
514
- # assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)'))
515
- # assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)'))
516
- result = val
5
+ class Parser < GeneratedTokenizer
6
+ @cache_on = true
7
+ @cache = {}
8
+ @mutex = Mutex.new
9
+
10
+ class << self
11
+ # Turn on CSS parse caching
12
+ attr_accessor :cache_on
13
+ alias :cache_on? :cache_on
14
+ alias :set_cache :cache_on=
15
+
16
+ # Get the css selector in +string+ from the cache
17
+ def [] string
18
+ return unless @cache_on
19
+ @mutex.synchronize { @cache[string] }
517
20
  end
518
-
519
- result
520
- end
521
21
 
522
- def _reduce_39(val, _values, result)
523
- if val[1] == 'n'
524
- result = Node.new(:AN_PLUS_B, val)
525
- else
526
- raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
22
+ # Set the css selector in +string+ in the cache to +value+
23
+ def []= string, value
24
+ return value unless @cache_on
25
+ @mutex.synchronize { @cache[string] = value }
527
26
  end
528
-
529
- result
530
- end
531
27
 
532
- def _reduce_40(val, _values, result)
533
- # n+3, -n+3
534
- if val[0] == 'n'
535
- val.unshift("1")
536
- result = Node.new(:AN_PLUS_B, val)
537
- elsif val[0] == '-n'
538
- val[0] = 'n'
539
- val.unshift("-1")
540
- result = Node.new(:AN_PLUS_B, val)
541
- else
542
- raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
28
+ # Clear the cache
29
+ def clear_cache
30
+ @mutex.synchronize { @cache = {} }
543
31
  end
544
-
545
- result
546
- end
547
32
 
548
- def _reduce_41(val, _values, result)
549
- if val[1] == 'n'
550
- val << "+"
551
- val << "0"
552
- result = Node.new(:AN_PLUS_B, val)
553
- else
554
- raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
33
+ # Execute +block+ without cache
34
+ def without_cache &block
35
+ tmp = @cache_on
36
+ @cache_on = false
37
+ block.call
38
+ @cache_on = tmp
555
39
  end
556
-
557
- result
558
- end
559
-
560
- def _reduce_42(val, _values, result)
561
- result = Node.new(:PSEUDO_CLASS, [val[1]])
562
-
563
- result
564
- end
565
-
566
- def _reduce_43(val, _values, result)
567
- result = Node.new(:PSEUDO_CLASS, [val[1]])
568
- result
569
- end
570
-
571
- # reduce 44 omitted
572
-
573
- # reduce 45 omitted
574
-
575
- def _reduce_46(val, _values, result)
576
- result = Node.new(:COMBINATOR, val)
577
-
578
- result
579
- end
580
-
581
- def _reduce_47(val, _values, result)
582
- result = Node.new(:COMBINATOR, val)
583
-
584
- result
585
- end
586
-
587
- def _reduce_48(val, _values, result)
588
- result = Node.new(:COMBINATOR, val)
589
-
590
- result
591
- end
592
-
593
- def _reduce_49(val, _values, result)
594
- result = Node.new(:COMBINATOR, val)
595
-
596
- result
597
- end
598
-
599
- # reduce 50 omitted
600
-
601
- # reduce 51 omitted
602
-
603
- # reduce 52 omitted
604
-
605
- # reduce 53 omitted
606
-
607
- def _reduce_54(val, _values, result)
608
- result = Node.new(:ID, val)
609
- result
610
- end
611
-
612
- def _reduce_55(val, _values, result)
613
- result = [val.first, val[1]]
614
- result
615
- end
616
-
617
- def _reduce_56(val, _values, result)
618
- result = [val.first, val[1]]
619
- result
620
- end
621
-
622
- # reduce 57 omitted
623
-
624
- def _reduce_58(val, _values, result)
625
- result = :equal
626
- result
627
- end
628
-
629
- def _reduce_59(val, _values, result)
630
- result = :prefix_match
631
- result
632
- end
633
40
 
634
- def _reduce_60(val, _values, result)
635
- result = :suffix_match
636
- result
637
- end
638
-
639
- def _reduce_61(val, _values, result)
640
- result = :substring_match
641
- result
642
- end
643
-
644
- def _reduce_62(val, _values, result)
645
- result = :not_equal
646
- result
647
- end
648
-
649
- def _reduce_63(val, _values, result)
650
- result = :includes
651
- result
652
- end
653
-
654
- def _reduce_64(val, _values, result)
655
- result = :dash_match
656
- result
657
- end
658
-
659
- def _reduce_65(val, _values, result)
660
- result = Node.new(:NOT, [val[1]])
661
-
662
- result
663
- end
664
-
665
- # reduce 66 omitted
666
-
667
- # reduce 67 omitted
668
-
669
- # reduce 68 omitted
670
-
671
- def _reduce_none(val, _values, result)
672
- val[0]
41
+ ###
42
+ # Parse this CSS selector in +selector+. Returns an AST.
43
+ def parse selector
44
+ @warned ||= false
45
+ unless @warned
46
+ $stderr.puts('Nokogiri::CSS::Parser.parse is deprecated, call Nokogiri::CSS.parse(), this will be removed August 1st or version 1.4.0 (whichever is first)')
47
+ @warned = true
48
+ end
49
+ new.parse selector
50
+ end
51
+ end
52
+
53
+ # Create a new CSS parser with respect to +namespaces+
54
+ def initialize namespaces = {}
55
+ @namespaces = namespaces
56
+ super()
57
+ end
58
+ alias :parse :scan_str
59
+
60
+ # Get the xpath for +string+ using +options+
61
+ def xpath_for string, options={}
62
+ key = "#{string}#{options[:ns]}#{options[:prefix]}"
63
+ v = self.class[key]
64
+ return v if v
65
+
66
+ args = [
67
+ options[:prefix] || '//',
68
+ options[:visitor] || XPathVisitor.new
69
+ ]
70
+ self.class[key] = parse(string).map { |ast|
71
+ ast.to_xpath(*args)
72
+ }
73
+ end
74
+
75
+ # On CSS parser error, raise an exception
76
+ def on_error error_token_id, error_value, value_stack
77
+ after = value_stack.compact.last
78
+ raise SyntaxError.new("unexpected '#{error_value}' after '#{after}'")
79
+ end
80
+ end
81
+ end
673
82
  end
674
-
675
- end # class Parser
676
- end # module CSS
677
- end # module Nokogiri