Commit Graph

1263 Commits

Author SHA1 Message Date
Yorick Peterse 5bfc2d50f2 Preserve entities that can't be decoded
Certain entities when decoded will produce a String with an invalid
encoding. This commit ensures that instead of raising an EncodingError
further down the line (e.g. when calling "inspect" on a document) the
entities are preserved as-is.

Fixes #143
2016-02-09 19:51:53 +01:00
Yorick Peterse 76b183e7ab Simplify Oga's versioning policy 2016-01-22 02:14:51 +01:00
Yorick Peterse a04797b946 Added code of conduct
This is largely based on the Contributor Covenant but with the list of
unacceptable behaviours updated according to the Rubinius CoC (as I feel
the latter is more explicit/accurate/better).
2016-01-22 01:51:44 +01:00
Yorick Peterse ee906c9af4 Use "rbx" on Travis instead of "rbx-2" 2016-01-08 11:32:55 +01:00
Yorick Peterse fd1570870e Release 2.0.0 2015-12-26 20:46:24 +01:00
Yorick Peterse 66fc4b1dfc Fixed parsing HTML identifiers containing colons
HTML identifiers containing colons should be treated in two ways:

* For element names the prefix (= the namespace prefix in case of XML)
  should be ignored as HTML doesn't support/use namespaces.
* For attribute names a colon is a valid character, thus "foo:bar:baz"
  should be treated as a single attribute name.

This fixes #142.
2015-12-26 20:28:35 +01:00
Yorick Peterse a938f23a0e Added at_css to Nokogiri migration guide 2015-11-17 16:35:50 +01:00
Yorick Peterse 082af145e3 Updated Nokogiri migration guide for CSS support 2015-11-17 16:32:46 +01:00
Yorick Peterse 9bb908f8b1 Use #== in Conversion.boolean?
On JRuby 9.0.1.0 this is a bit faster than using "is_a?":

    require 'benchmark/ips'

    input = false

    Benchmark.ips do |bench|
      bench.report 'is_a?' do
        input.is_a?(TrueClass) || input.is_a?(FalseClass)
      end

      bench.report '==' do
        input == true || input == false
      end

      bench.compare!
    end

This outputs:

    Calculating -------------------------------------
                   is_a?    86.129k i/100ms
                      ==   112.837k i/100ms
    -------------------------------------------------
                   is_a?      7.375M (±15.3%) i/s -     35.227M
                      ==     10.428M (±12.0%) i/s -     50.889M

    Comparison:
                      ==: 10427617.5 i/s
                   is_a?:  7374666.2 i/s - 1.41x slower

On both MRI 2.2 and Rubinius 2.5.8 there's little to no difference
between these two methods.
2015-09-23 16:35:09 +02:00
Yorick Peterse d815437217 Exclude 2.2/jruby on OS X 2015-09-17 13:38:48 +02:00
Yorick Peterse cd2195ef1d Use before_install checks to install Ragel on OS X 2015-09-17 13:29:04 +02:00
Yorick Peterse 205feaf704 Lets try to install Ragel on OS X 2015-09-17 13:25:36 +02:00
Yorick Peterse e37bbcbce6 Also run Travis on OS X 2015-09-17 12:21:23 +02:00
Yorick Peterse 5b2dfdbb09 Fixed Markdown headings in the changelog 2015-09-17 01:14:00 +02:00
Yorick Peterse 0fd6fd8645 Release 1.3.1 2015-09-07 14:11:00 +02:00
Yorick Peterse bd48dc15cc Evaluate compiled blocks in an isolated Binding
Re-using the Binding of the XPath::Compiler#compile method would lead to
race conditions, and possibly a memory leak due to the Binding sticking
around for compiled Proc's lifetime.

By using a dedicated class (and its corresponding Binding) we can work
around this. Access to this class is not synchronized as compiled Procs
don't mutate their enclosing environment.

The race condition can be demonstrated using code such as the
following:

    xml = <<-EOF
    <people>
      <person>
        <name>Alice</name>
      </person>

      <person>
        <name>Bob</name>
      </person>

      <person>
        <name>Eve</name>
      </person>
    </people>
    EOF

    4.times.map do
      Thread.new do
        10_000.times do
          document = Oga.parse_xml(xml)

          document.at_xpath('people/person/name').text
        end
      end
    end.each(&:join)

Running this code would result in NoMethodErrors due to "at_xpath"
returning a NilClass opposed to an Oga::XML::Element.
2015-09-07 14:02:31 +02:00
Yorick Peterse b07c75e964 Moved comparing_gems_bench to xpath/compiler
This is a compiler benchmark, not a parser benchmark.
2015-09-06 22:14:17 +02:00
Yorick Peterse ac5cb3d24f Tweaked thread safety notice in the README
Querying the same document concurrently _could_ lead to problems, so
lets just recommend users to not even try this.
2015-09-06 19:30:40 +02:00
Yorick Peterse 4c79468091 Release 1.3.0 2015-09-06 19:20:45 +02:00
Yorick Peterse 791085302e Prepare changelog for 1.3.0 2015-09-04 16:46:33 +02:00
Yorick Peterse f753f08f18 Revamp CSS parser for better axis support
This makes it possible to parse expressions such as "foo>bar", "> .bar",
"> foo.bar", and similar expressions.

This fixes #126 and fixes #131.
2015-09-04 16:06:20 +02:00
Yorick Peterse c713f6250f Lexer/parser specs for CSS axes without whitespace 2015-09-04 15:13:38 +02:00
Yorick Peterse 08bc23905e Specs for lexing CSS operators with whitespace 2015-09-04 15:08:26 +02:00
Yorick Peterse 5f037c76cc Corrected CSS ends-with example
This was supposed to use the "$=" operator and not the "=" operator.
2015-09-04 14:38:45 +02:00
Yorick Peterse f5425b07e0 Added magic encoding comments for Ruby 1.9 2015-09-03 11:31:02 +02:00
Yorick Peterse 37c5b819fa Unicode support for CSS/XPath
Fixes #140
2015-09-03 11:21:45 +02:00
Yorick Peterse 44630c27ff Support escaping dots in CSS identifiers
Escaping hash characters and whitespace is _not_ supported as neither
are valid element/attribute names (e.g. <foo#bar /> is invalid
XML/HTML).

Escaping single/double quotes also won't be supported for the time
being. It's quite a pain to get this to work right in not just CSS but
also XPath and XML/HTML, for very little gain. Should there be enough
users with an actual use case (other than "But the spec says ...!") I'll
look into this again.

Fixes #124
2015-09-02 20:18:52 +02:00
Yorick Peterse aef7c510c2 Basic support for the CSS :not pseudo class
This does _not_ support element states such as DISABLED, nor does it
support the special handling of namespaces (e.g. *|*:not(*)). Instead
this selector basically acts as a negation, some examples:

    :not(foo)  # All but any "foo" nodes
    :not(#foo) # Skips nodes with id="foo"
    :not(.foo) # Skips nodes with a class "foo"

Fixes #125
2015-09-01 22:05:46 +02:00
Yorick Peterse b7b38255d3 Fixed YARD formatting 2015-09-01 20:03:56 +02:00
Yorick Peterse 94f8ed5421 Removed start/end comments of YARD blocks 2015-09-01 19:59:52 +02:00
Yorick Peterse 929a521641 Added better docs/examples to XML::Querying 2015-09-01 10:12:17 +02:00
Yorick Peterse 8b2455679f Revamp a few more XPath compiler specs 2015-08-31 09:39:33 +02:00
Yorick Peterse 604d0d9337 Case insensitive matching of nodes
This re-applies the patch added in #134 to the new XPath compiler.

Fixes #135.
2015-08-30 18:30:04 +02:00
Yorick Peterse bb8b328f5e Revamp compiler specs for regular paths 2015-08-30 18:26:52 +02:00
Yorick Peterse 67ada1168e Fix starts-with() for JRuby 1.7
''.start_with?('') returns false on JRuby 1.7. While I'd love to drop
support for shit like this, JRuby 1.7 is still in common use today, so
lets just work around this for now.
2015-08-30 02:10:49 +02:00
Yorick Peterse bf0ca7c907 Alias Ruby::Node#to_ary to #to_a
JRuby 1.7 uses to_ary opposed to to_a.
2015-08-30 02:06:10 +02:00
Yorick Peterse b74f8dc1a3 Removed compiler arity spec
This spec isn't very useful and breaks on 1.9 due to it apparently
handling arity values differently.
2015-08-30 01:55:31 +02:00
Yorick Peterse 435115c454 Removed various unused variables 2015-08-30 01:46:52 +02:00
Yorick Peterse 1b62dd3256 Revamped compiler type test specs 2015-08-30 01:45:51 +02:00
Yorick Peterse 001c57e0ad Tag XPath::Conversion's API as private 2015-08-30 01:26:40 +02:00
Yorick Peterse 31a574e7f8 Removed the XPath::Evaluator class 2015-08-30 01:26:03 +02:00
Yorick Peterse e4919d7c31 Use XPath::Compiler in XML::Querying 2015-08-30 01:22:33 +02:00
Yorick Peterse c6df73d031 Fix eq spec to not depend on at_xpath 2015-08-30 01:20:08 +02:00
Yorick Peterse 5a736aa25c Removed Compiler#node_literal 2015-08-28 17:00:21 +02:00
Yorick Peterse 4ad4b89860 Revamp compiler specs for "self"
This also includes a fix for node() so that it matches attributes.
2015-08-28 16:57:24 +02:00
Yorick Peterse 3a04b1da06 Root element spec for "preceding-sibling" 2015-08-28 16:50:34 +02:00
Yorick Peterse e8377b360a Revamp compiler "preceding" specs
This also includes some fixes to make this axis behave correctly when
evaluate relative to a document.
2015-08-28 16:49:59 +02:00
Yorick Peterse 6b2874c507 Revamped compiler "preceding-sibling" specs 2015-08-28 16:30:26 +02:00
Yorick Peterse 84a9315b24 Revamped compiler specs for "parent" 2015-08-28 16:22:49 +02:00
Yorick Peterse 07658dadb1 Added Attribute#parent 2015-08-28 16:22:42 +02:00