Racc::Parser
Get the css selector in string from the cache
# File lib/nokogiri/css/parser_extras.rb, line 17 17: def [] string 18: return unless @cache_on 19: @mutex.synchronize { @cache[string] } 20: end
Set the css selector in string in the cache to value
# File lib/nokogiri/css/parser_extras.rb, line 23 23: def []= string, value 24: return value unless @cache_on 25: @mutex.synchronize { @cache[string] = value } 26: end
Clear the cache
# File lib/nokogiri/css/parser_extras.rb, line 29 29: def clear_cache 30: @mutex.synchronize { @cache = {} } 31: end
Create a new CSS parser with respect to namespaces
# File lib/nokogiri/css/parser_extras.rb, line 54 54: def initialize namespaces = {} 55: @tokenizer = Tokenizer.new 56: @namespaces = namespaces 57: super() 58: end
Parse this CSS selector in selector. Returns an AST.
# File lib/nokogiri/css/parser_extras.rb, line 43 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
reduce 0 omitted
# File lib/nokogiri/css/parser.rb, line 307 307: def _reduce_1(val, _values, result) 308: result = [val.first, val.last].flatten 309: 310: result 311: end
# File lib/nokogiri/css/parser.rb, line 353 353: def _reduce_10(val, _values, result) 354: result = if val[1].nil? 355: val.first 356: else 357: Node.new(:CONDITIONAL_SELECTOR, [val.first, val[1]]) 358: end 359: 360: result 361: end
# File lib/nokogiri/css/parser.rb, line 363 363: def _reduce_11(val, _values, result) 364: result = Node.new(:CONDITIONAL_SELECTOR, 365: [ 366: val.first, 367: Node.new(:COMBINATOR, [val[1], val.last]) 368: ] 369: ) 370: 371: result 372: end
# File lib/nokogiri/css/parser.rb, line 374 374: def _reduce_12(val, _values, result) 375: result = Node.new(:CONDITIONAL_SELECTOR, val) 376: 377: result 378: end
reduce 13 omitted
# File lib/nokogiri/css/parser.rb, line 382 382: def _reduce_14(val, _values, result) 383: result = Node.new(:CONDITIONAL_SELECTOR, val) 384: 385: result 386: end
# File lib/nokogiri/css/parser.rb, line 388 388: def _reduce_15(val, _values, result) 389: result = Node.new(:CONDITIONAL_SELECTOR, val) 390: 391: result 392: end
# File lib/nokogiri/css/parser.rb, line 394 394: def _reduce_16(val, _values, result) 395: result = Node.new(:CONDITIONAL_SELECTOR, 396: [ 397: Node.new(:ELEMENT_NAME, ['*']), 398: Node.new(:COMBINATOR, val) 399: ] 400: ) 401: 402: result 403: end
# File lib/nokogiri/css/parser.rb, line 405 405: def _reduce_17(val, _values, result) 406: result = Node.new(:CONDITIONAL_SELECTOR, 407: [Node.new(:ELEMENT_NAME, ['*']), val.first] 408: ) 409: 410: result 411: end
# File lib/nokogiri/css/parser.rb, line 413 413: def _reduce_18(val, _values, result) 414: result = Node.new(val.first, [nil, val.last]) 415: 416: result 417: end
# File lib/nokogiri/css/parser.rb, line 419 419: def _reduce_19(val, _values, result) 420: result = Node.new(val[1], [val.first, val.last]) 421: 422: result 423: end
# File lib/nokogiri/css/parser.rb, line 313 313: def _reduce_2(val, _values, result) 314: result = val.flatten 315: result 316: end
reduce 20 omitted
# File lib/nokogiri/css/parser.rb, line 427 427: def _reduce_21(val, _values, result) 428: result = Node.new(:CLASS_CONDITION, [val[1]]) 429: result 430: end
reduce 22 omitted
# File lib/nokogiri/css/parser.rb, line 434 434: def _reduce_23(val, _values, result) 435: result = Node.new(:ELEMENT_NAME, val) 436: result 437: end
# File lib/nokogiri/css/parser.rb, line 439 439: def _reduce_24(val, _values, result) 440: result = Node.new(:ELEMENT_NAME, 441: [[val.first, val.last].compact.join(':')] 442: ) 443: 444: result 445: end
# File lib/nokogiri/css/parser.rb, line 447 447: def _reduce_25(val, _values, result) 448: name = @namespaces.key?('xmlns') ? "xmlns:#{val.first}" : val.first 449: result = Node.new(:ELEMENT_NAME, [name]) 450: 451: result 452: end
# File lib/nokogiri/css/parser.rb, line 454 454: def _reduce_26(val, _values, result) 455: result = val[0] 456: result 457: end
reduce 27 omitted
# File lib/nokogiri/css/parser.rb, line 461 461: def _reduce_28(val, _values, result) 462: result = Node.new(:ATTRIBUTE_CONDITION, 463: [val[1]] + (val[2] || []) 464: ) 465: 466: result 467: end
# File lib/nokogiri/css/parser.rb, line 469 469: def _reduce_29(val, _values, result) 470: result = Node.new(:ATTRIBUTE_CONDITION, 471: [val[1]] + (val[2] || []) 472: ) 473: 474: result 475: end
# File lib/nokogiri/css/parser.rb, line 318 318: def _reduce_3(val, _values, result) 319: result = val.flatten 320: result 321: end
# File lib/nokogiri/css/parser.rb, line 477 477: def _reduce_30(val, _values, result) 478: # Non standard, but hpricot supports it. 479: result = Node.new(:PSEUDO_CLASS, 480: [Node.new(:FUNCTION, ['nth-child(', val[1]])] 481: ) 482: 483: result 484: end
# File lib/nokogiri/css/parser.rb, line 486 486: def _reduce_31(val, _values, result) 487: result = Node.new(:ELEMENT_NAME, 488: [[val.first, val.last].compact.join(':')] 489: ) 490: 491: result 492: end
# File lib/nokogiri/css/parser.rb, line 494 494: def _reduce_32(val, _values, result) 495: # Default namespace is not applied to attributes. 496: # So we don't add prefix "xmlns:" as in namespaced_ident. 497: result = Node.new(:ELEMENT_NAME, [val.first]) 498: 499: result 500: end
# File lib/nokogiri/css/parser.rb, line 502 502: def _reduce_33(val, _values, result) 503: result = Node.new(:FUNCTION, [val.first.strip]) 504: 505: result 506: end
# File lib/nokogiri/css/parser.rb, line 508 508: def _reduce_34(val, _values, result) 509: result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) 510: 511: result 512: end
# File lib/nokogiri/css/parser.rb, line 514 514: def _reduce_35(val, _values, result) 515: result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) 516: 517: result 518: end
# File lib/nokogiri/css/parser.rb, line 520 520: def _reduce_36(val, _values, result) 521: result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) 522: 523: result 524: end
# File lib/nokogiri/css/parser.rb, line 526 526: def _reduce_37(val, _values, result) 527: result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) 528: 529: result 530: end
# File lib/nokogiri/css/parser.rb, line 532 532: def _reduce_38(val, _values, result) 533: result = [val.first, val.last] 534: result 535: end
# File lib/nokogiri/css/parser.rb, line 537 537: def _reduce_39(val, _values, result) 538: result = [val.first, val.last] 539: result 540: end
# File lib/nokogiri/css/parser.rb, line 323 323: def _reduce_4(val, _values, result) 324: result = :DIRECT_ADJACENT_SELECTOR 325: result 326: end
# File lib/nokogiri/css/parser.rb, line 542 542: def _reduce_40(val, _values, result) 543: result = [val.first, val.last] 544: result 545: end
reduce 42 omitted
# File lib/nokogiri/css/parser.rb, line 551 551: def _reduce_43(val, _values, result) 552: if val[0] == 'even' 553: val = ["2","n","+","0"] 554: result = Node.new(:AN_PLUS_B, val) 555: elsif val[0] == 'odd' 556: val = ["2","n","+","1"] 557: result = Node.new(:AN_PLUS_B, val) 558: else 559: # This is not CSS standard. It allows us to support this: 560: # assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)')) 561: # assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)')) 562: # assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)')) 563: result = val 564: end 565: 566: result 567: end
# File lib/nokogiri/css/parser.rb, line 569 569: def _reduce_44(val, _values, result) 570: if val[1] == 'n' 571: result = Node.new(:AN_PLUS_B, val) 572: else 573: raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" 574: end 575: 576: result 577: end
# File lib/nokogiri/css/parser.rb, line 579 579: def _reduce_45(val, _values, result) 580: # n+3, -n+3 581: if val[0] == 'n' 582: val.unshift("1") 583: result = Node.new(:AN_PLUS_B, val) 584: elsif val[0] == '-n' 585: val[0] = 'n' 586: val.unshift("-1") 587: result = Node.new(:AN_PLUS_B, val) 588: else 589: raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" 590: end 591: 592: result 593: end
# File lib/nokogiri/css/parser.rb, line 595 595: def _reduce_46(val, _values, result) 596: if val[1] == 'n' 597: val << "+" 598: val << "0" 599: result = Node.new(:AN_PLUS_B, val) 600: else 601: raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" 602: end 603: 604: result 605: end
# File lib/nokogiri/css/parser.rb, line 607 607: def _reduce_47(val, _values, result) 608: result = Node.new(:PSEUDO_CLASS, [val[1]]) 609: 610: result 611: end
# File lib/nokogiri/css/parser.rb, line 613 613: def _reduce_48(val, _values, result) 614: result = Node.new(:PSEUDO_CLASS, [val[1]]) 615: result 616: end
# File lib/nokogiri/css/parser.rb, line 328 328: def _reduce_5(val, _values, result) 329: result = :CHILD_SELECTOR 330: result 331: end
reduce 50 omitted
# File lib/nokogiri/css/parser.rb, line 622 622: def _reduce_51(val, _values, result) 623: result = Node.new(:COMBINATOR, val) 624: 625: result 626: end
# File lib/nokogiri/css/parser.rb, line 628 628: def _reduce_52(val, _values, result) 629: result = Node.new(:COMBINATOR, val) 630: 631: result 632: end
# File lib/nokogiri/css/parser.rb, line 634 634: def _reduce_53(val, _values, result) 635: result = Node.new(:COMBINATOR, val) 636: 637: result 638: end
# File lib/nokogiri/css/parser.rb, line 640 640: def _reduce_54(val, _values, result) 641: result = Node.new(:COMBINATOR, val) 642: 643: result 644: end
reduce 58 omitted
# File lib/nokogiri/css/parser.rb, line 654 654: def _reduce_59(val, _values, result) 655: result = Node.new(:ID, val) 656: result 657: end
# File lib/nokogiri/css/parser.rb, line 333 333: def _reduce_6(val, _values, result) 334: result = :FOLLOWING_SELECTOR 335: result 336: end
# File lib/nokogiri/css/parser.rb, line 659 659: def _reduce_60(val, _values, result) 660: result = [val.first, val[1]] 661: result 662: end
# File lib/nokogiri/css/parser.rb, line 664 664: def _reduce_61(val, _values, result) 665: result = [val.first, val[1]] 666: result 667: end
reduce 62 omitted
# File lib/nokogiri/css/parser.rb, line 671 671: def _reduce_63(val, _values, result) 672: result = :equal 673: result 674: end
# File lib/nokogiri/css/parser.rb, line 676 676: def _reduce_64(val, _values, result) 677: result = :prefix_match 678: result 679: end
# File lib/nokogiri/css/parser.rb, line 681 681: def _reduce_65(val, _values, result) 682: result = :suffix_match 683: result 684: end
# File lib/nokogiri/css/parser.rb, line 686 686: def _reduce_66(val, _values, result) 687: result = :substring_match 688: result 689: end
# File lib/nokogiri/css/parser.rb, line 691 691: def _reduce_67(val, _values, result) 692: result = :not_equal 693: result 694: end
# File lib/nokogiri/css/parser.rb, line 696 696: def _reduce_68(val, _values, result) 697: result = :includes 698: result 699: end
# File lib/nokogiri/css/parser.rb, line 701 701: def _reduce_69(val, _values, result) 702: result = :dash_match 703: result 704: end
# File lib/nokogiri/css/parser.rb, line 338 338: def _reduce_7(val, _values, result) 339: result = :DESCENDANT_SELECTOR 340: result 341: end
# File lib/nokogiri/css/parser.rb, line 706 706: def _reduce_70(val, _values, result) 707: result = Node.new(:NOT, [val[1]]) 708: 709: result 710: end
# File lib/nokogiri/css/parser.rb, line 343 343: def _reduce_8(val, _values, result) 344: result = :DESCENDANT_SELECTOR 345: result 346: end
# File lib/nokogiri/css/parser.rb, line 348 348: def _reduce_9(val, _values, result) 349: result = :CHILD_SELECTOR 350: result 351: end
reduce 73 omitted
# File lib/nokogiri/css/parser.rb, line 718 718: def _reduce_none(val, _values, result) 719: val[0] 720: end
# File lib/nokogiri/css/parser_extras.rb, line 65 65: def next_token 66: @tokenizer.next_token 67: end
On CSS parser error, raise an exception
# File lib/nokogiri/css/parser_extras.rb, line 85 85: def on_error error_token_id, error_value, value_stack 86: after = value_stack.compact.last 87: raise SyntaxError.new("unexpected '#{error_value}' after '#{after}'") 88: end
# File lib/nokogiri/css/parser_extras.rb, line 60 60: def parse string 61: @tokenizer.scan_setup string 62: do_parse 63: end
Get the xpath for string using options
# File lib/nokogiri/css/parser_extras.rb, line 70 70: def xpath_for string, options={} 71: key = "#{string}#{options[:ns]}#{options[:prefix]}" 72: v = self.class[key] 73: return v if v 74: 75: args = [ 76: options[:prefix] || '//', 77: options[:visitor] || XPathVisitor.new 78: ] 79: self.class[key] = parse(string).map { |ast| 80: ast.to_xpath(*args) 81: } 82: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.