Commit Graph

1222 Commits

Author SHA1 Message Date
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
Yorick Peterse d0177633f8 Revamp namespace compiler specs 2015-08-28 15:58:42 +02:00
Yorick Peterse a1e7d2d07f Revamp compiler "following" specs 2015-08-28 15:53:57 +02:00
Yorick Peterse 824c897467 Revamp compiler specs for following-sibling 2015-08-28 15:48:03 +02:00
Yorick Peterse aa3fbcf522 Revamp descendant compiler specs 2015-08-28 15:29:09 +02:00
Yorick Peterse 70bea2071c Fixed ancestor-or-self relative to attributes
Per libxml behaviour this axis shouldn't match attributes when using
"ancestor-or-self::*".
2015-08-27 10:49:32 +02:00
Yorick Peterse d5aad9c1c9 Revamp descendant-or-self compiler specs 2015-08-27 10:34:25 +02:00
Yorick Peterse 8f341b40d6 Revamp child axis compiler specs 2015-08-27 09:30:53 +02:00
Yorick Peterse ed31b9f1d3 Revamp compiler specs for the attribute axis 2015-08-26 22:51:04 +02:00
Yorick Peterse 5e3b0a4023 Started updating Compiler for the new XPath AST
This also includes fixes for ancestor and ancestor-or-self so that these
axes can be used relative to documents and attributes.
2015-08-26 22:40:00 +02:00
Yorick Peterse 4fb7e2f6ce Revamped ancestor/ancestor-or-self axis specs
This makes it easier to get more natural spec descriptions without
having to write them entirely by hand.
2015-08-26 22:35:13 +02:00
Yorick Peterse 9899a419b7 Added Attribute#each_ancestor 2015-08-26 22:26:46 +02:00
Yorick Peterse 083d048e63 Remove (path) usage from the CSS parser
This updates the CSS parser to make it compatible with the XPath AST
changes introduced in commit 365a9e9fa9.
This also, finally, means I can get rid of some of the hacks that were
used for "+ foo" selectors and building (path) nodes.
2015-08-26 19:15:12 +02:00
Yorick Peterse 365a9e9fa9 Replace (path) nodes with nested nodes
This changes the XPath AST so that every segment in a path (e.g.
foo/bar) is parsed as a child node of the node that precedes it. For
example, take the following expression:

    foo/bar

This used to be parsed into the following AST:

    (path
      (axis "child" (test nil "foo"))
      (axis "child" (test nil "bar")))

This is now parsed into the following AST:

    (axis "child"
      (test nil "foo")
      (axis "child"
        (test nil "bar")))

This new AST is much easier to deal with in the XPath::Compiler class,
especially when trying to ensure that each segment operates on the
correct input.

This commit also fixes parsing of type tests with predicates, such as:

    comment()[10]

This used to throw a parser error.
2015-08-26 10:16:48 +02:00
Yorick Peterse 866044f94f Removed useless block passes in the XPath compiler 2015-08-22 14:28:20 +02:00
Yorick Peterse c5b30d1eae Refactor XPath compiler support for predicates
Handling of predicates is delegated to 3 different methods:

* on_predicate_direct: for predicates such as foo[bar] and foo[x < y].
* on_predicate_temporary: for predicates that use the last() function
  somewhere.
* on_predicate_index: for predicates that only contain a literal index,
  foo[10] being an example.

This enables the compiler to use more optimized code depending on the
type of predicate while still being able to support last() and
position().

The code is currently still quite rough on the edges, this will be taken
care of in following commits.
2015-08-20 01:01:30 +02:00
Yorick Peterse 37ac844ebe Fixed spec for sum() in a predicate
The return value of sum() should be used as a NodeSet index, not merely
just a truthy value.
2015-08-20 00:54:06 +02:00
Yorick Peterse 94ec1b5f5d Corrected the last() compiler spec
This spec didn't match the correct nodes due to `1 < last()` always
evaluating to true in this particular case.
2015-08-20 00:23:58 +02:00
Yorick Peterse 7a4cb76d39 Cleaned up XPath last() specs a bit 2015-08-19 23:05:25 +02:00
Yorick Peterse ee44907ca5 Started removing usage of backup_variable
This was a hack that never should've made it into the code in the first
place. This breaks some of the CSS specs, but this should be taken care
of when I refactor predicate support.
2015-08-19 20:14:24 +02:00
Yorick Peterse 15ecca4a64 Removed extra throw from following-sibling()
I can't quite recall why this throw was present in the Evaluator in the
first place, but removing it doesn't seem to break anything (in the
Evaluator). In fact, removing it actually fixes some of the CSS specs
that were broken when using the Compiler.
2015-08-19 20:14:24 +02:00
Yorick Peterse d72f5eb07f Removed left-over assignment 2015-08-19 20:14:24 +02:00
Yorick Peterse f41f6ff0c8 Only wrap followed_by nodes in begin/end 2015-08-19 20:14:24 +02:00
Yorick Peterse a661bf8c12 Predicate support for all on_call handlers 2015-08-19 20:14:24 +02:00
Yorick Peterse a30cdba8d0 Fixed XPath compiler support for not() 2015-08-19 20:14:24 +02:00
Yorick Peterse 7cbc53c64e XPath compiler support for not() in predicates 2015-08-19 20:14:24 +02:00
Yorick Peterse 8e60c69def Added spec for not() in a predicate 2015-08-19 20:14:24 +02:00
Yorick Peterse 0dcee637d3 Added Ruby::Node#if_false 2015-08-19 20:14:24 +02:00
Yorick Peterse 4b50a161ed Wrap all compiler assignments in begin/end
This is much safer than having to explicitly call "wrap" in a potential
large amount of places.
2015-08-19 20:14:24 +02:00
Yorick Peterse aaba0049ab Updated XPath compiler arity spec 2015-08-19 20:14:24 +02:00
Yorick Peterse b217aab2cb XPath compiler support for translate() 2015-08-19 20:14:24 +02:00
Yorick Peterse 106d83e780 XPath compiler support for sum() 2015-08-19 20:14:24 +02:00
Yorick Peterse e7e5b123cf XPath compiler support for substring() 2015-08-19 20:14:24 +02:00
Yorick Peterse be05008be9 Added substring-after() spec for a predicate 2015-08-19 20:14:24 +02:00
Yorick Peterse b60ed03bb4 Added substring-before() spec for a predicate 2015-08-19 20:14:24 +02:00
Yorick Peterse 32dba554d7 Ruby generator support for Ranges 2015-08-19 20:14:23 +02:00
Yorick Peterse ec19875530 XPath compiler support for substring-before() 2015-08-19 20:14:23 +02:00
Yorick Peterse eeab14af4d XPath compiler support for substring-after() 2015-08-19 20:14:23 +02:00
Yorick Peterse d6b3461a9a XPath compiler support for string() 2015-08-19 20:14:23 +02:00
Yorick Peterse 728bd45e48 XPath compiler support for string-length() 2015-08-19 20:14:23 +02:00
Yorick Peterse 0e3451881b Specs for contains/starts-with in a predicate 2015-08-19 20:14:23 +02:00
Yorick Peterse 37a410a012 XPath compiler support for starts-with() 2015-08-19 20:14:23 +02:00