nokogiri 1.10.9 → 1.12.5
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.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/LICENSE-DEPENDENCIES.md +1173 -884
- data/LICENSE.md +1 -1
- data/README.md +176 -96
- data/dependencies.yml +12 -12
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +716 -414
- data/ext/nokogiri/gumbo.c +584 -0
- data/ext/nokogiri/html4_document.c +166 -0
- data/ext/nokogiri/html4_element_description.c +294 -0
- data/ext/nokogiri/html4_entity_lookup.c +37 -0
- data/ext/nokogiri/html4_sax_parser_context.c +120 -0
- data/ext/nokogiri/html4_sax_push_parser.c +95 -0
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +228 -91
- data/ext/nokogiri/nokogiri.h +191 -89
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +15 -15
- data/ext/nokogiri/xml_attribute_decl.c +18 -18
- data/ext/nokogiri/xml_cdata.c +13 -18
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +267 -195
- data/ext/nokogiri/xml_document_fragment.c +13 -15
- data/ext/nokogiri/xml_dtd.c +54 -48
- data/ext/nokogiri/xml_element_content.c +31 -26
- data/ext/nokogiri/xml_element_decl.c +22 -22
- data/ext/nokogiri/xml_encoding_handler.c +28 -17
- data/ext/nokogiri/xml_entity_decl.c +32 -30
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +60 -51
- data/ext/nokogiri/xml_node.c +493 -407
- data/ext/nokogiri/xml_node_set.c +174 -162
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +197 -172
- data/ext/nokogiri/xml_relax_ng.c +52 -28
- data/ext/nokogiri/xml_sax_parser.c +112 -112
- data/ext/nokogiri/xml_sax_parser_context.c +105 -86
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- data/ext/nokogiri/xml_schema.c +96 -46
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +13 -17
- data/ext/nokogiri/xml_xpath_context.c +158 -73
- data/ext/nokogiri/xslt_stylesheet.c +158 -164
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +101 -0
- data/gumbo-parser/THANKS +27 -0
- data/gumbo-parser/src/Makefile +34 -0
- data/gumbo-parser/src/README.md +41 -0
- data/gumbo-parser/src/ascii.c +75 -0
- data/gumbo-parser/src/ascii.h +115 -0
- data/gumbo-parser/src/attribute.c +42 -0
- data/gumbo-parser/src/attribute.h +17 -0
- data/gumbo-parser/src/char_ref.c +22225 -0
- data/gumbo-parser/src/char_ref.h +29 -0
- data/gumbo-parser/src/char_ref.rl +2154 -0
- data/gumbo-parser/src/error.c +626 -0
- data/gumbo-parser/src/error.h +148 -0
- data/gumbo-parser/src/foreign_attrs.c +104 -0
- data/gumbo-parser/src/foreign_attrs.gperf +27 -0
- data/gumbo-parser/src/gumbo.h +943 -0
- data/gumbo-parser/src/insertion_mode.h +33 -0
- data/gumbo-parser/src/macros.h +91 -0
- data/gumbo-parser/src/parser.c +4886 -0
- data/gumbo-parser/src/parser.h +41 -0
- data/gumbo-parser/src/replacement.h +33 -0
- data/gumbo-parser/src/string_buffer.c +103 -0
- data/gumbo-parser/src/string_buffer.h +68 -0
- data/gumbo-parser/src/string_piece.c +48 -0
- data/gumbo-parser/src/svg_attrs.c +174 -0
- data/gumbo-parser/src/svg_attrs.gperf +77 -0
- data/gumbo-parser/src/svg_tags.c +137 -0
- data/gumbo-parser/src/svg_tags.gperf +55 -0
- data/gumbo-parser/src/tag.c +222 -0
- data/gumbo-parser/src/tag_lookup.c +382 -0
- data/gumbo-parser/src/tag_lookup.gperf +169 -0
- data/gumbo-parser/src/tag_lookup.h +13 -0
- data/gumbo-parser/src/token_buffer.c +79 -0
- data/gumbo-parser/src/token_buffer.h +71 -0
- data/gumbo-parser/src/token_type.h +17 -0
- data/gumbo-parser/src/tokenizer.c +3463 -0
- data/gumbo-parser/src/tokenizer.h +112 -0
- data/gumbo-parser/src/tokenizer_states.h +339 -0
- data/gumbo-parser/src/utf8.c +245 -0
- data/gumbo-parser/src/utf8.h +164 -0
- data/gumbo-parser/src/util.c +68 -0
- data/gumbo-parser/src/util.h +30 -0
- data/gumbo-parser/src/vector.c +111 -0
- data/gumbo-parser/src/vector.h +45 -0
- data/lib/nokogiri/css/node.rb +1 -0
- data/lib/nokogiri/css/parser.rb +64 -63
- data/lib/nokogiri/css/parser.y +3 -3
- data/lib/nokogiri/css/parser_extras.rb +39 -36
- data/lib/nokogiri/css/syntax_error.rb +2 -1
- data/lib/nokogiri/css/tokenizer.rb +1 -0
- data/lib/nokogiri/css/xpath_visitor.rb +73 -43
- data/lib/nokogiri/css.rb +15 -14
- data/lib/nokogiri/decorators/slop.rb +1 -0
- data/lib/nokogiri/extension.rb +31 -0
- data/lib/nokogiri/gumbo.rb +14 -0
- data/lib/nokogiri/html.rb +32 -27
- data/lib/nokogiri/{html → html4}/builder.rb +3 -2
- data/lib/nokogiri/{html → html4}/document.rb +17 -30
- data/lib/nokogiri/{html → html4}/document_fragment.rb +18 -17
- data/lib/nokogiri/{html → html4}/element_description.rb +2 -1
- data/lib/nokogiri/{html → html4}/element_description_defaults.rb +2 -1
- data/lib/nokogiri/{html → html4}/entity_lookup.rb +2 -1
- data/lib/nokogiri/{html → html4}/sax/parser.rb +12 -14
- data/lib/nokogiri/html4/sax/parser_context.rb +19 -0
- data/lib/nokogiri/{html → html4}/sax/push_parser.rb +6 -5
- data/lib/nokogiri/html4.rb +40 -0
- data/lib/nokogiri/html5/document.rb +74 -0
- data/lib/nokogiri/html5/document_fragment.rb +80 -0
- data/lib/nokogiri/html5/node.rb +93 -0
- data/lib/nokogiri/html5.rb +473 -0
- data/lib/nokogiri/jruby/dependencies.rb +20 -0
- data/lib/nokogiri/syntax_error.rb +1 -0
- data/lib/nokogiri/version/constant.rb +5 -0
- data/lib/nokogiri/version/info.rb +215 -0
- data/lib/nokogiri/version.rb +3 -109
- data/lib/nokogiri/xml/attr.rb +1 -0
- data/lib/nokogiri/xml/attribute_decl.rb +1 -0
- data/lib/nokogiri/xml/builder.rb +41 -2
- data/lib/nokogiri/xml/cdata.rb +1 -0
- data/lib/nokogiri/xml/character_data.rb +1 -0
- data/lib/nokogiri/xml/document.rb +138 -41
- data/lib/nokogiri/xml/document_fragment.rb +5 -6
- data/lib/nokogiri/xml/dtd.rb +1 -0
- data/lib/nokogiri/xml/element_content.rb +1 -0
- data/lib/nokogiri/xml/element_decl.rb +1 -0
- data/lib/nokogiri/xml/entity_decl.rb +1 -0
- data/lib/nokogiri/xml/entity_reference.rb +1 -0
- data/lib/nokogiri/xml/namespace.rb +1 -0
- data/lib/nokogiri/xml/node/save_options.rb +2 -1
- data/lib/nokogiri/xml/node.rb +629 -293
- data/lib/nokogiri/xml/node_set.rb +1 -0
- data/lib/nokogiri/xml/notation.rb +1 -0
- data/lib/nokogiri/xml/parse_options.rb +12 -3
- data/lib/nokogiri/xml/pp/character_data.rb +1 -0
- data/lib/nokogiri/xml/pp/node.rb +1 -0
- data/lib/nokogiri/xml/pp.rb +3 -2
- data/lib/nokogiri/xml/processing_instruction.rb +1 -0
- data/lib/nokogiri/xml/reader.rb +9 -12
- data/lib/nokogiri/xml/relax_ng.rb +7 -2
- data/lib/nokogiri/xml/sax/document.rb +25 -30
- data/lib/nokogiri/xml/sax/parser.rb +1 -0
- data/lib/nokogiri/xml/sax/parser_context.rb +1 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +1 -0
- data/lib/nokogiri/xml/sax.rb +5 -4
- data/lib/nokogiri/xml/schema.rb +13 -4
- data/lib/nokogiri/xml/searchable.rb +25 -16
- data/lib/nokogiri/xml/syntax_error.rb +1 -0
- data/lib/nokogiri/xml/text.rb +1 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
- data/lib/nokogiri/xml/xpath.rb +4 -5
- data/lib/nokogiri/xml/xpath_context.rb +1 -0
- data/lib/nokogiri/xml.rb +36 -36
- data/lib/nokogiri/xslt/stylesheet.rb +2 -1
- data/lib/nokogiri/xslt.rb +17 -16
- data/lib/nokogiri.rb +32 -51
- data/lib/xsd/xmlparser/nokogiri.rb +1 -0
- data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
- data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +0 -0
- data/patches/libxml2/{0004-libxml2.la-is-in-top_builddir.patch → 0003-libxml2.la-is-in-top_builddir.patch} +1 -1
- data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
- data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
- data/patches/libxml2/0006-update-automake-files-for-arm64.patch +2511 -0
- data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
- data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
- data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
- data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
- metadata +139 -161
- data/ext/nokogiri/html_document.c +0 -170
- data/ext/nokogiri/html_document.h +0 -10
- data/ext/nokogiri/html_element_description.c +0 -279
- data/ext/nokogiri/html_element_description.h +0 -10
- data/ext/nokogiri/html_entity_lookup.c +0 -32
- data/ext/nokogiri/html_entity_lookup.h +0 -8
- data/ext/nokogiri/html_sax_parser_context.c +0 -116
- data/ext/nokogiri/html_sax_parser_context.h +0 -11
- data/ext/nokogiri/html_sax_push_parser.c +0 -87
- data/ext/nokogiri/html_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_attr.h +0 -9
- data/ext/nokogiri/xml_attribute_decl.h +0 -9
- data/ext/nokogiri/xml_cdata.h +0 -9
- data/ext/nokogiri/xml_comment.h +0 -9
- data/ext/nokogiri/xml_document.h +0 -23
- data/ext/nokogiri/xml_document_fragment.h +0 -10
- data/ext/nokogiri/xml_dtd.h +0 -10
- data/ext/nokogiri/xml_element_content.h +0 -10
- data/ext/nokogiri/xml_element_decl.h +0 -9
- data/ext/nokogiri/xml_encoding_handler.h +0 -8
- data/ext/nokogiri/xml_entity_decl.h +0 -10
- data/ext/nokogiri/xml_entity_reference.h +0 -9
- data/ext/nokogiri/xml_io.c +0 -61
- data/ext/nokogiri/xml_io.h +0 -11
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
- data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
- data/ext/nokogiri/xml_namespace.h +0 -14
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -12
- data/ext/nokogiri/xml_processing_instruction.h +0 -9
- data/ext/nokogiri/xml_reader.h +0 -10
- data/ext/nokogiri/xml_relax_ng.h +0 -9
- data/ext/nokogiri/xml_sax_parser.h +0 -39
- data/ext/nokogiri/xml_sax_parser_context.h +0 -10
- data/ext/nokogiri/xml_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_schema.h +0 -9
- data/ext/nokogiri/xml_syntax_error.h +0 -13
- data/ext/nokogiri/xml_text.h +0 -9
- data/ext/nokogiri/xml_xpath_context.h +0 -10
- data/ext/nokogiri/xslt_stylesheet.h +0 -14
- data/lib/nokogiri/html/sax/parser_context.rb +0 -16
- data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
- data/patches/libxml2/0005-Fix-infinite-loop-in-xmlStringLenDecodeEntities.patch +0 -32
- data/ports/archives/libxml2-2.9.10.tar.gz +0 -0
data/lib/nokogiri/css/parser.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
#
|
2
3
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by Racc 1.
|
4
|
-
# from Racc
|
4
|
+
# This file is automatically generated by Racc 1.5.2
|
5
|
+
# from Racc grammar file "".
|
5
6
|
#
|
6
7
|
|
7
8
|
require 'racc/parser.rb'
|
8
9
|
|
9
10
|
|
10
|
-
|
11
|
+
require_relative "parser_extras"
|
11
12
|
|
12
13
|
module Nokogiri
|
13
14
|
module CSS
|
@@ -333,42 +334,42 @@ Racc_debug_parser = false
|
|
333
334
|
|
334
335
|
def _reduce_1(val, _values, result)
|
335
336
|
result = [val.first, val.last].flatten
|
336
|
-
|
337
|
+
|
337
338
|
result
|
338
339
|
end
|
339
340
|
|
340
341
|
def _reduce_2(val, _values, result)
|
341
|
-
result = val.flatten
|
342
|
+
result = val.flatten
|
342
343
|
result
|
343
344
|
end
|
344
345
|
|
345
346
|
def _reduce_3(val, _values, result)
|
346
|
-
result = [val.last].flatten
|
347
|
+
result = [val.last].flatten
|
347
348
|
result
|
348
349
|
end
|
349
350
|
|
350
351
|
def _reduce_4(val, _values, result)
|
351
|
-
result = :DIRECT_ADJACENT_SELECTOR
|
352
|
+
result = :DIRECT_ADJACENT_SELECTOR
|
352
353
|
result
|
353
354
|
end
|
354
355
|
|
355
356
|
def _reduce_5(val, _values, result)
|
356
|
-
result = :CHILD_SELECTOR
|
357
|
+
result = :CHILD_SELECTOR
|
357
358
|
result
|
358
359
|
end
|
359
360
|
|
360
361
|
def _reduce_6(val, _values, result)
|
361
|
-
result = :FOLLOWING_SELECTOR
|
362
|
+
result = :FOLLOWING_SELECTOR
|
362
363
|
result
|
363
364
|
end
|
364
365
|
|
365
366
|
def _reduce_7(val, _values, result)
|
366
|
-
result = :DESCENDANT_SELECTOR
|
367
|
+
result = :DESCENDANT_SELECTOR
|
367
368
|
result
|
368
369
|
end
|
369
370
|
|
370
371
|
def _reduce_8(val, _values, result)
|
371
|
-
result = :CHILD_SELECTOR
|
372
|
+
result = :CHILD_SELECTOR
|
372
373
|
result
|
373
374
|
end
|
374
375
|
|
@@ -378,7 +379,7 @@ def _reduce_9(val, _values, result)
|
|
378
379
|
else
|
379
380
|
Node.new(:CONDITIONAL_SELECTOR, [val.first, val[1]])
|
380
381
|
end
|
381
|
-
|
382
|
+
|
382
383
|
result
|
383
384
|
end
|
384
385
|
|
@@ -386,13 +387,13 @@ end
|
|
386
387
|
|
387
388
|
def _reduce_11(val, _values, result)
|
388
389
|
result = Node.new(:CONDITIONAL_SELECTOR, val)
|
389
|
-
|
390
|
+
|
390
391
|
result
|
391
392
|
end
|
392
393
|
|
393
394
|
def _reduce_12(val, _values, result)
|
394
395
|
result = Node.new(:CONDITIONAL_SELECTOR, val)
|
395
|
-
|
396
|
+
|
396
397
|
result
|
397
398
|
end
|
398
399
|
|
@@ -400,39 +401,39 @@ def _reduce_13(val, _values, result)
|
|
400
401
|
result = Node.new(:CONDITIONAL_SELECTOR,
|
401
402
|
[Node.new(:ELEMENT_NAME, ['*']), val.first]
|
402
403
|
)
|
403
|
-
|
404
|
+
|
404
405
|
result
|
405
406
|
end
|
406
407
|
|
407
408
|
def _reduce_14(val, _values, result)
|
408
409
|
result = Node.new(val.first, [nil, val.last])
|
409
|
-
|
410
|
+
|
410
411
|
result
|
411
412
|
end
|
412
413
|
|
413
414
|
def _reduce_15(val, _values, result)
|
414
415
|
result = Node.new(val[1], [val.first, val.last])
|
415
|
-
|
416
|
+
|
416
417
|
result
|
417
418
|
end
|
418
419
|
|
419
420
|
def _reduce_16(val, _values, result)
|
420
421
|
result = Node.new(:DESCENDANT_SELECTOR, [val.first, val.last])
|
421
|
-
|
422
|
+
|
422
423
|
result
|
423
424
|
end
|
424
425
|
|
425
426
|
# reduce 17 omitted
|
426
427
|
|
427
428
|
def _reduce_18(val, _values, result)
|
428
|
-
result = Node.new(:CLASS_CONDITION, [unescape_css_identifier(val[1])])
|
429
|
+
result = Node.new(:CLASS_CONDITION, [unescape_css_identifier(val[1])])
|
429
430
|
result
|
430
431
|
end
|
431
432
|
|
432
433
|
# reduce 19 omitted
|
433
434
|
|
434
435
|
def _reduce_20(val, _values, result)
|
435
|
-
result = Node.new(:ELEMENT_NAME, val)
|
436
|
+
result = Node.new(:ELEMENT_NAME, val)
|
436
437
|
result
|
437
438
|
end
|
438
439
|
|
@@ -440,19 +441,19 @@ def _reduce_21(val, _values, result)
|
|
440
441
|
result = Node.new(:ELEMENT_NAME,
|
441
442
|
[[val.first, val.last].compact.join(':')]
|
442
443
|
)
|
443
|
-
|
444
|
+
|
444
445
|
result
|
445
446
|
end
|
446
447
|
|
447
448
|
def _reduce_22(val, _values, result)
|
448
449
|
name = @namespaces.key?('xmlns') ? "xmlns:#{val.first}" : val.first
|
449
450
|
result = Node.new(:ELEMENT_NAME, [name])
|
450
|
-
|
451
|
+
|
451
452
|
result
|
452
453
|
end
|
453
454
|
|
454
455
|
def _reduce_23(val, _values, result)
|
455
|
-
result = val[0]
|
456
|
+
result = val[0]
|
456
457
|
result
|
457
458
|
end
|
458
459
|
|
@@ -462,7 +463,7 @@ def _reduce_25(val, _values, result)
|
|
462
463
|
result = Node.new(:ATTRIBUTE_CONDITION,
|
463
464
|
[val[1]] + (val[2] || [])
|
464
465
|
)
|
465
|
-
|
466
|
+
|
466
467
|
result
|
467
468
|
end
|
468
469
|
|
@@ -470,16 +471,16 @@ def _reduce_26(val, _values, result)
|
|
470
471
|
result = Node.new(:ATTRIBUTE_CONDITION,
|
471
472
|
[val[1]] + (val[2] || [])
|
472
473
|
)
|
473
|
-
|
474
|
+
|
474
475
|
result
|
475
476
|
end
|
476
477
|
|
477
478
|
def _reduce_27(val, _values, result)
|
478
|
-
#
|
479
|
+
# non-standard, from hpricot
|
479
480
|
result = Node.new(:PSEUDO_CLASS,
|
480
481
|
[Node.new(:FUNCTION, ['nth-child(', val[1]])]
|
481
482
|
)
|
482
|
-
|
483
|
+
|
483
484
|
result
|
484
485
|
end
|
485
486
|
|
@@ -487,7 +488,7 @@ def _reduce_28(val, _values, result)
|
|
487
488
|
result = Node.new(:ELEMENT_NAME,
|
488
489
|
[[val.first, val.last].compact.join(':')]
|
489
490
|
)
|
490
|
-
|
491
|
+
|
491
492
|
result
|
492
493
|
end
|
493
494
|
|
@@ -495,52 +496,52 @@ def _reduce_29(val, _values, result)
|
|
495
496
|
# Default namespace is not applied to attributes.
|
496
497
|
# So we don't add prefix "xmlns:" as in namespaced_ident.
|
497
498
|
result = Node.new(:ELEMENT_NAME, [val.first])
|
498
|
-
|
499
|
+
|
499
500
|
result
|
500
501
|
end
|
501
502
|
|
502
503
|
def _reduce_30(val, _values, result)
|
503
504
|
result = Node.new(:FUNCTION, [val.first.strip])
|
504
|
-
|
505
|
+
|
505
506
|
result
|
506
507
|
end
|
507
508
|
|
508
509
|
def _reduce_31(val, _values, result)
|
509
510
|
result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
|
510
|
-
|
511
|
+
|
511
512
|
result
|
512
513
|
end
|
513
514
|
|
514
515
|
def _reduce_32(val, _values, result)
|
515
516
|
result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
|
516
|
-
|
517
|
+
|
517
518
|
result
|
518
519
|
end
|
519
520
|
|
520
521
|
def _reduce_33(val, _values, result)
|
521
522
|
result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
|
522
|
-
|
523
|
+
|
523
524
|
result
|
524
525
|
end
|
525
526
|
|
526
527
|
def _reduce_34(val, _values, result)
|
527
528
|
result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
|
528
|
-
|
529
|
+
|
529
530
|
result
|
530
531
|
end
|
531
532
|
|
532
533
|
def _reduce_35(val, _values, result)
|
533
|
-
result = [val.first, val.last]
|
534
|
+
result = [val.first, val.last]
|
534
535
|
result
|
535
536
|
end
|
536
537
|
|
537
538
|
def _reduce_36(val, _values, result)
|
538
|
-
result = [val.first, val.last]
|
539
|
+
result = [val.first, val.last]
|
539
540
|
result
|
540
541
|
end
|
541
542
|
|
542
543
|
def _reduce_37(val, _values, result)
|
543
|
-
result = [val.first, val.last]
|
544
|
+
result = [val.first, val.last]
|
544
545
|
result
|
545
546
|
end
|
546
547
|
|
@@ -557,13 +558,13 @@ def _reduce_40(val, _values, result)
|
|
557
558
|
when 'n'
|
558
559
|
result = Node.new(:NTH, ['1','n','+','0'])
|
559
560
|
else
|
560
|
-
#
|
561
|
+
# non-standard to support custom functions:
|
561
562
|
# assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)'))
|
562
563
|
# assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)'))
|
563
564
|
# assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)'))
|
564
565
|
result = val
|
565
566
|
end
|
566
|
-
|
567
|
+
|
567
568
|
result
|
568
569
|
end
|
569
570
|
|
@@ -573,7 +574,7 @@ def _reduce_41(val, _values, result)
|
|
573
574
|
else
|
574
575
|
raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
|
575
576
|
end
|
576
|
-
|
577
|
+
|
577
578
|
result
|
578
579
|
end
|
579
580
|
|
@@ -589,7 +590,7 @@ def _reduce_42(val, _values, result)
|
|
589
590
|
else
|
590
591
|
raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
|
591
592
|
end
|
592
|
-
|
593
|
+
|
593
594
|
result
|
594
595
|
end
|
595
596
|
|
@@ -609,18 +610,18 @@ def _reduce_43(val, _values, result)
|
|
609
610
|
else
|
610
611
|
raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
|
611
612
|
end
|
612
|
-
|
613
|
+
|
613
614
|
result
|
614
615
|
end
|
615
616
|
|
616
617
|
def _reduce_44(val, _values, result)
|
617
618
|
result = Node.new(:PSEUDO_CLASS, [val[1]])
|
618
|
-
|
619
|
+
|
619
620
|
result
|
620
621
|
end
|
621
622
|
|
622
623
|
def _reduce_45(val, _values, result)
|
623
|
-
result = Node.new(:PSEUDO_CLASS, [val[1]])
|
624
|
+
result = Node.new(:PSEUDO_CLASS, [val[1]])
|
624
625
|
result
|
625
626
|
end
|
626
627
|
|
@@ -630,31 +631,31 @@ end
|
|
630
631
|
|
631
632
|
def _reduce_48(val, _values, result)
|
632
633
|
result = Node.new(:COMBINATOR, val)
|
633
|
-
|
634
|
+
|
634
635
|
result
|
635
636
|
end
|
636
637
|
|
637
638
|
def _reduce_49(val, _values, result)
|
638
639
|
result = Node.new(:COMBINATOR, val)
|
639
|
-
|
640
|
+
|
640
641
|
result
|
641
642
|
end
|
642
643
|
|
643
644
|
def _reduce_50(val, _values, result)
|
644
645
|
result = Node.new(:COMBINATOR, val)
|
645
|
-
|
646
|
+
|
646
647
|
result
|
647
648
|
end
|
648
649
|
|
649
650
|
def _reduce_51(val, _values, result)
|
650
651
|
result = Node.new(:COMBINATOR, val)
|
651
|
-
|
652
|
+
|
652
653
|
result
|
653
654
|
end
|
654
655
|
|
655
656
|
def _reduce_52(val, _values, result)
|
656
657
|
result = Node.new(:COMBINATOR, val)
|
657
|
-
|
658
|
+
|
658
659
|
result
|
659
660
|
end
|
660
661
|
|
@@ -669,65 +670,65 @@ end
|
|
669
670
|
# reduce 57 omitted
|
670
671
|
|
671
672
|
def _reduce_58(val, _values, result)
|
672
|
-
result = Node.new(:ID, [unescape_css_identifier(val.first)])
|
673
|
+
result = Node.new(:ID, [unescape_css_identifier(val.first)])
|
673
674
|
result
|
674
675
|
end
|
675
676
|
|
676
677
|
def _reduce_59(val, _values, result)
|
677
|
-
result = [val.first, unescape_css_identifier(val[1])]
|
678
|
+
result = [val.first, unescape_css_identifier(val[1])]
|
678
679
|
result
|
679
680
|
end
|
680
681
|
|
681
682
|
def _reduce_60(val, _values, result)
|
682
|
-
result = [val.first, unescape_css_string(val[1])]
|
683
|
+
result = [val.first, unescape_css_string(val[1])]
|
683
684
|
result
|
684
685
|
end
|
685
686
|
|
686
687
|
def _reduce_61(val, _values, result)
|
687
|
-
result = [val.first, val[1]]
|
688
|
+
result = [val.first, val[1]]
|
688
689
|
result
|
689
690
|
end
|
690
691
|
|
691
692
|
# reduce 62 omitted
|
692
693
|
|
693
694
|
def _reduce_63(val, _values, result)
|
694
|
-
result = :equal
|
695
|
+
result = :equal
|
695
696
|
result
|
696
697
|
end
|
697
698
|
|
698
699
|
def _reduce_64(val, _values, result)
|
699
|
-
result = :prefix_match
|
700
|
+
result = :prefix_match
|
700
701
|
result
|
701
702
|
end
|
702
703
|
|
703
704
|
def _reduce_65(val, _values, result)
|
704
|
-
result = :suffix_match
|
705
|
+
result = :suffix_match
|
705
706
|
result
|
706
707
|
end
|
707
708
|
|
708
709
|
def _reduce_66(val, _values, result)
|
709
|
-
result = :substring_match
|
710
|
+
result = :substring_match
|
710
711
|
result
|
711
712
|
end
|
712
713
|
|
713
714
|
def _reduce_67(val, _values, result)
|
714
|
-
result = :not_equal
|
715
|
+
result = :not_equal
|
715
716
|
result
|
716
717
|
end
|
717
718
|
|
718
719
|
def _reduce_68(val, _values, result)
|
719
|
-
result = :includes
|
720
|
+
result = :includes
|
720
721
|
result
|
721
722
|
end
|
722
723
|
|
723
724
|
def _reduce_69(val, _values, result)
|
724
|
-
result = :dash_match
|
725
|
+
result = :dash_match
|
725
726
|
result
|
726
727
|
end
|
727
728
|
|
728
729
|
def _reduce_70(val, _values, result)
|
729
730
|
result = Node.new(:NOT, [val[1]])
|
730
|
-
|
731
|
+
|
731
732
|
result
|
732
733
|
end
|
733
734
|
|
@@ -746,5 +747,5 @@ def _reduce_none(val, _values, result)
|
|
746
747
|
end
|
747
748
|
|
748
749
|
end # class Parser
|
749
|
-
|
750
|
-
|
750
|
+
end # module CSS
|
751
|
+
end # module Nokogiri
|
data/lib/nokogiri/css/parser.y
CHANGED
@@ -88,7 +88,7 @@ rule
|
|
88
88
|
)
|
89
89
|
}
|
90
90
|
| LSQUARE NUMBER RSQUARE {
|
91
|
-
#
|
91
|
+
# non-standard, from hpricot
|
92
92
|
result = Node.new(:PSEUDO_CLASS,
|
93
93
|
[Node.new(:FUNCTION, ['nth-child(', val[1]])]
|
94
94
|
)
|
@@ -139,7 +139,7 @@ rule
|
|
139
139
|
when 'n'
|
140
140
|
result = Node.new(:NTH, ['1','n','+','0'])
|
141
141
|
else
|
142
|
-
#
|
142
|
+
# non-standard to support custom functions:
|
143
143
|
# assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)'))
|
144
144
|
# assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)'))
|
145
145
|
# assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)'))
|
@@ -253,7 +253,7 @@ end
|
|
253
253
|
|
254
254
|
---- header
|
255
255
|
|
256
|
-
|
256
|
+
require_relative "parser_extras"
|
257
257
|
|
258
258
|
---- inner
|
259
259
|
|
@@ -1,63 +1,66 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "thread"
|
2
3
|
|
3
4
|
module Nokogiri
|
4
5
|
module CSS
|
5
6
|
class Parser < Racc::Parser
|
6
|
-
|
7
|
-
|
8
|
-
@
|
7
|
+
CACHE_SWITCH_NAME = :nokogiri_css_parser_cache_is_off
|
8
|
+
|
9
|
+
@cache = {}
|
10
|
+
@mutex = Mutex.new
|
9
11
|
|
10
12
|
class << self
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
# Return a thread-local boolean indicating whether the CSS-to-XPath cache is active. (Default is `true`.)
|
14
|
+
def cache_on?
|
15
|
+
!Thread.current[CACHE_SWITCH_NAME]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Set a thread-local boolean to turn cacheing on and off. Truthy values turn the cache on, falsey values turn the cache off.
|
19
|
+
def set_cache(value)
|
20
|
+
Thread.current[CACHE_SWITCH_NAME] = !value
|
21
|
+
end
|
15
22
|
|
16
23
|
# Get the css selector in +string+ from the cache
|
17
|
-
def []
|
18
|
-
return unless
|
24
|
+
def [](string)
|
25
|
+
return unless cache_on?
|
19
26
|
@mutex.synchronize { @cache[string] }
|
20
27
|
end
|
21
28
|
|
22
29
|
# Set the css selector in +string+ in the cache to +value+
|
23
|
-
def []=
|
24
|
-
return value unless
|
30
|
+
def []=(string, value)
|
31
|
+
return value unless cache_on?
|
25
32
|
@mutex.synchronize { @cache[string] = value }
|
26
33
|
end
|
27
34
|
|
28
35
|
# Clear the cache
|
29
|
-
def clear_cache
|
30
|
-
@mutex.synchronize
|
36
|
+
def clear_cache(create_new_object = false)
|
37
|
+
@mutex.synchronize do
|
38
|
+
if create_new_object
|
39
|
+
@cache = {}
|
40
|
+
else
|
41
|
+
@cache.clear
|
42
|
+
end
|
43
|
+
end
|
31
44
|
end
|
32
45
|
|
33
46
|
# Execute +block+ without cache
|
34
|
-
def without_cache
|
35
|
-
|
36
|
-
|
47
|
+
def without_cache(&block)
|
48
|
+
original_cache_setting = cache_on?
|
49
|
+
set_cache false
|
37
50
|
block.call
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
51
|
+
ensure
|
52
|
+
set_cache original_cache_setting
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
53
56
|
# Create a new CSS parser with respect to +namespaces+
|
54
|
-
def initialize
|
55
|
-
@tokenizer
|
57
|
+
def initialize(namespaces = {})
|
58
|
+
@tokenizer = Tokenizer.new
|
56
59
|
@namespaces = namespaces
|
57
60
|
super()
|
58
61
|
end
|
59
62
|
|
60
|
-
def parse
|
63
|
+
def parse(string)
|
61
64
|
@tokenizer.scan_setup string
|
62
65
|
do_parse
|
63
66
|
end
|
@@ -67,14 +70,14 @@ module Nokogiri
|
|
67
70
|
end
|
68
71
|
|
69
72
|
# Get the xpath for +string+ using +options+
|
70
|
-
def xpath_for
|
73
|
+
def xpath_for(string, options = {})
|
71
74
|
key = "#{string}#{options[:ns]}#{options[:prefix]}"
|
72
75
|
v = self.class[key]
|
73
76
|
return v if v
|
74
77
|
|
75
78
|
args = [
|
76
|
-
options[:prefix] ||
|
77
|
-
options[:visitor] || XPathVisitor.new
|
79
|
+
options[:prefix] || "//",
|
80
|
+
options[:visitor] || XPathVisitor.new,
|
78
81
|
]
|
79
82
|
self.class[key] = parse(string).map { |ast|
|
80
83
|
ast.to_xpath(*args)
|
@@ -82,7 +85,7 @@ module Nokogiri
|
|
82
85
|
end
|
83
86
|
|
84
87
|
# On CSS parser error, raise an exception
|
85
|
-
def on_error
|
88
|
+
def on_error(error_token_id, error_value, value_stack)
|
86
89
|
after = value_stack.compact.last
|
87
90
|
raise SyntaxError.new("unexpected '#{error_value}' after '#{after}'")
|
88
91
|
end
|