Skip to main content

HtmlAdapter

Struct HtmlAdapter 

Source
pub struct HtmlAdapter { /* private fields */ }
Expand description

A Quarb adapter over a parsed HTML document.

Implementations§

Source§

impl HtmlAdapter

Source

pub fn set_document_url(&mut self, url: &str)

Declare the document’s own URL — the base a relative href joins against when ::href--> reaches across documents.

Source

pub fn parse(html: &str) -> Self

Parse html and build the adapter.

Source

pub fn locator(&self, node: NodeId) -> String

A locator path to node, like /html/body/div[2]/p, for rendering. A [n] index is added only to disambiguate same-tag siblings.

Trait Implementations§

Source§

impl AstAdapter for HtmlAdapter

Source§

fn estimate(&self, scope: &[&str], plan: &StepPlan<'_>) -> Option<Estimate>

The arena knows how many nodes a step reaches; nothing is read.

Source§

fn walks_for_references(&self) -> bool

In memory: an unscoped reverse resolution or value match may walk the arbor.

Source§

fn traits(&self, node: NodeId) -> Vec<String>

Structural traits: <block> or <inline>, plus <heading> for h1–h6 and <link> for an anchor with an href.

Source§

fn property(&self, node: NodeId, name: &str) -> Option<Value>

Attributes, by name (::href). Element text is the bare projection (::) — no attribute name is shadowed.

Source§

fn default_value(&self, node: NodeId) -> Option<Value>

The default projection of an element is its text content.

Source§

fn metadata(&self, node: NodeId, key: &str) -> Option<Value>

::::tag, ::::classes (the class attribute, split), ::::attrs (the attribute names, sorted — the parser does not preserve source order), and ::::n-attrs — facts about the element, never its data: attribute values are properties (::href), text is the bare projection. attrs is what makes a renamed attribute discoverable: enumerate the names, probe the values by shape.

Source§

fn resolve( &self, node: NodeId, property: &str, hint: Option<&str>, ) -> Option<NodeId>

Follow an attribute that is a fragment reference (#section) to the element with that id. Used by an anchor’s ::href-->.

Source§

fn external_ref( &self, node: NodeId, property: &str, hint: Option<&str>, ) -> Option<ExternalRef>

The external reference an href-like attribute holds: the absolute URL, relative values joined against the document’s own URL (when the mount declared one). A bare #fragment stays in-document (that is resolve’s job); a fragment on a cross-document URL rides along — it is the crossref within the target, landed by resolve_fragment once that document is mounted. Non-web schemes reference nothing followable. Feeds ::href--> across documents — the acquisition arrow.

Source§

fn resolve_fragment(&self, _node: NodeId, fragment: &str) -> Option<NodeId>

html’s fragment landing: the element whose id is fragment, anywhere in this document.

Source§

fn property_names(&self, node: NodeId) -> Vec<String>

The bare arrow’s property: an anchor-family element’s href, a frame’s src. An element’s properties are its attributes.

Source§

fn can_refer_to(&self, _source: NodeId, _target: NodeId) -> Option<bool>

Any attribute may hold a reference (#id, an IDREF) to any element of the document: the format declares no narrower one.

Source§

fn ref_label(&self, node: NodeId, property: &str) -> Option<String>

The relation an href edge carries: the rel attribute — <link rel="stylesheet">, <a rel="nofollow">. The spec’s -->stylesheet hint filters on it; absent, the edge label falls back to the property name.

Source§

fn root(&self) -> NodeId

The root node — the initial navigation context.
Source§

fn children(&self, node: NodeId) -> Vec<NodeId>

The tree children of node, in document order. Read more
Source§

fn name(&self, node: NodeId) -> Option<String>

The name of node — the label of its incoming tree edge. Read more
Source§

fn parent(&self, node: NodeId) -> Option<NodeId>

The parent of node, or None for the root.
Source§

fn ref_property(&self, node: NodeId) -> Option<String>

The property carrying node’s own reference, for the bare arrow (//a-->): an html anchor’s href, an iframe’s src. None for a node that references nothing.
Source§

fn properties(&self, _node: NodeId) -> Vec<(String, Value)>

The node’s own properties, enumerated — name and value, in the source’s order — for readings that keep values off the tree (the JSON property reading, where an object’s scalar fields are no nodes). The serializers (| json, | xml, | kaiv) merge them with the children, a child winning a shared name. The default is none: for a reading whose values are all nodes, the children already say everything.
Source§

fn reference_properties(&self, source: NodeId, _target: NodeId) -> Vec<String>

The reference properties declared on source that can land in target’s container: a catalog’s key columns into the target’s table, the fields of a model’s refs, the node’s own reference property. What t<-- and t<--(SCOPE) read when the query names no property; empty where none is declared.
Source§

fn resolve_needs_label(&self, _node: NodeId, _property: &str) -> bool

Whether resolving property of node needs a reference label, because the property itself declares no target: a column with no key, or any property of a property graph, where a value names a node only under a node label. A label-less ::p--> over such a property is refused with the remedy, since an empty answer would read as “points nowhere”.
Source§

fn reverse_label(&self, _target: NodeId) -> Option<String>

The reference label under which a referrer’s property is also resolved when a reverse arrow asks about target and the query writes no label. None (the default): only the label-less resolution counts. An adapter whose label names a container (a table, a collection, a node label) returns the one target stands in, so /authors/1<--(/books/*::author_id) reads author_id as a key into authors without the query saying so. The engine derives no label of its own.
Source§

fn tree_identities(&self) -> Vec<(String, NodeId)>

The trees of this arbor other trees refer to by name: each identity (a URL, a path, any string a reference may hold) with the node that stands for the tree. An identity ending in a separator is a base: every identity beneath it names the node reached beneath the base’s node by the remainder’s segments. Declared in a model (tree IDENTITY: PATH;) and automatic for a mount’s own target; the engine reads nothing inside an identity beyond prefix and separator.
Source§

fn resolves_references(&self) -> bool

Whether this source resolves references at all. An adapter with no notion of a reference (a CSV file, a directory, a log stream) says no, and a reverse arrow over it is refused with the value match as the remedy, rather than answered with an empty set that would read as “nothing points here”.
Source§

fn index_lookup( &self, _scope: &str, _property: &str, _value: &Value, ) -> Option<Vec<NodeId>>

index SCOPE::prop; — the nodes of the declared scope whose property holds value, from an index the model keeps; None when no declaration covers the pair (the walk answers). An index changes cost, never the answer: the caller still tests each node it names.
Source§

fn index_referrers( &self, _scope: &str, _property: &str, _label: Option<&str>, _target: NodeId, ) -> Option<Vec<NodeId>>

The declared-scope nodes whose property resolves (under the relation label, when given) to target, from the same index; None when no declaration covers the pair.
Source§

fn non_tree_nodes(&self) -> Vec<NodeId>

The nodes of the arbor that are not in the tree — joined to it by crosslinks alone, with no parent and no path. The universal search *// reaches them after the tree, in this order; :::is-non-tree is true on them. The default is none: every shipped adapter puts every node in the tree.
Source§

fn child_host(&self, node: NodeId) -> NodeId

The node whose children an explicit child step from node reads. The default is node itself. An adapter whose tree holds transparent links (a filesystem’s symlink to a directory) answers the link’s target, so /link/name lands on the target’s own child — the same node /target/name reaches. The descendant walk never consults this: it reads children alone, so a linked subtree is walked once, under its own parent, and a cycle of links cannot trap it.
Source§

fn children_named(&self, node: NodeId, name: &str) -> Vec<NodeId>

The children of node whose edge name is exactly name — the engine’s fast path for name-matcher child hops. The default filters children; an adapter whose containers cannot be enumerated (permission-scoped or unbounded remote trees) overrides this with a direct, name-addressed lookup. Must be observationally identical to the default wherever enumeration works. The adapter owns the name test: it may deliberately alias — resolve a name to a node whose edge name differs (git revision syntax landing on a hash-named commit) — and the engine will not re-filter. Container-scoped resolution like that stays child-axis only; per-node spelling aliases belong in answers_to, which this default consults.
Source§

fn answers_to(&self, node: NodeId, name: &str) -> bool

Whether node answers to name as a literal spelling . The default is canonical equality. An adapter may declare per-node aliases — a social feed spelling a handle @alice while the stripped alice is the hop name — and the engine consults this wherever a literal name is matched, on every axis, so one override keeps /@alice and //@alice in agreement. :::name stays canonical (locators and reflection print it; an alias is a way in, never a way out), and name patterns (~(...), *) test the canonical name only.
Source§

fn has_trait(&self, node: NodeId, name: &str) -> bool

Whether node bears name as a trait, as written in a <...> clause. The default is membership in traits; an adapter may declare aliases the way answers_to does for names — a model file’s alias <chunk> <block>; or alias <s/^tag://i>; — and the engine consults this wherever a written trait is matched. Reflection and serialization print the canonical traits only.
Source§

fn aliased_metadata(&self, _node: NodeId) -> &'static [&'static str]

Metadata keys this adapter also answers at :: (ruling #29), for the given node — per node, because a composite adapter (a multi-mount, a graft) answers for whichever document owns it. Only an adapter whose property surface is closed — fixed by the adapter, never grown by document content — may declare aliases: a git commit cannot sprout a short field, where a JSON object can sprout anything. Data always wins: the engine consults property first and falls through only when it answers None for that node, so an alias can never shadow a document. Core metadata (:::) is never aliased — name, id and index exist on every node, and aliasing them would change what ::name means wherever a document happens to lack that field.
Outgoing crosslinks from node, as (label, target) pairs, for -> navigation (a filesystem adapter’s symlinks).
Incoming crosslinks to node, as (label, source) pairs, for <- navigation. May be expensive (an adapter that does not precompute edges must search for referrers).
A property of the crosslink source --label--> target — the $-::prop read. Adapters whose edges carry data (a property graph’s relationship properties) override this; None if the edge is bare or unknown. Where parallel edges share source, label, and target, the adapter answers for one of them, consistently.
Source§

fn document_by_ref(&self, _id: &str) -> Option<NodeId>

The document this arbor holds under an external-reference identifier (a URL, fragment-stripped), when it can answer without the host’s registration: the landing rung of --> after the mounted-document table misses. An adapter over a store of pages answers by URL lookup; the engine performs no IO either way.
Source§

fn reverse_resolve( &self, _node: NodeId, _property: Option<&str>, _hint: Option<&str>, ) -> Option<Vec<NodeId>>

Every node whose property (or, when None, own reference property) resolves to node, in document order — the reverse index behind <--. None keeps the engine’s walk of the whole arbor; Some is the adapter’s complete answer.
Source§

fn descendants_named( &self, _node: NodeId, _name: &str, ) -> Option<Vec<(NodeId, usize)>>

The descendants of node that answer to name, each with its depth (children are depth 1), in document order — the fast path behind //name for an adapter whose substrate indexes names. None keeps the engine’s walk; Some must be exactly what the walk would find.
Source§

fn descendants_where( &self, _node: NodeId, _name: &str, _property: &str, _value: &Value, ) -> Option<Vec<(NodeId, usize)>>

The descendants of node named name whose property property equals value, each with its depth, in document order — the fast path behind //name[::property = "value"] for an adapter that indexes a property (the corpus reading’s positional index answers //token[::lower = "tom"] from it). None keeps the engine’s walk and its comparison; Some must be exactly what the walk would find under the standard equality, so an adapter answers only the values it can compare as the engine does (text against text).
Source§

fn select(&self, from: NodeId, plan: &StepPlan<'_>) -> Option<Selection>

The search fast path: the nodes one step reaches from from under plan, answered from an index — None keeps the engine’s walk (the default folds children_named, descendants_named and descendants_where: select_by_hooks). Some must be exactly what the walk would find for the conjuncts it marks applied, under the engine’s standard equality; the engine tests the remaining conjuncts and every other predicate on the nodes returned. A child plan’s answer is never re-filtered by name (the adapter owns the name test, as children_named does); a descendant plan’s nodes still pass the nameless tests.
Source§

fn select_plan( &self, _scope: &[&str], _plan: &StepPlan<'_>, ) -> Option<Vec<bool>>

The dry-run form of select: which of the plan’s conjuncts the adapter would apply, decided from its catalog alone (a column’s existence and type, an index’s presence), with no node in hand. scope is the literal path from the root to the step’s base (["invoices"] for /invoices/*[...]), empty at the root. None when the adapter cannot say — the static plan then counts every conjunct as the engine’s.
Source§

fn count(&self, _from: NodeId, _plan: &StepPlan<'_>) -> Option<usize>

How many nodes one step reaches from from under plan, without materializing them — @| count right after the step asks before walking. None walks; Some must be exactly the walk’s count for the conjuncts the plan carries (every one of them, or none: a count cannot be partially applied). SQL: SELECT COUNT(*); a document index: the bucket’s length.
Source§

fn prefetch_properties(&self, _nodes: &[NodeId], _names: &[&str])

A batching hint, the projection twin of prefetch_links: the engine is about to read the properties names of every node in nodes (the next stage projects them). A remote adapter fetches the columns for the frontier in one round trip; semantics are unchanged either way.
A batching hint: the engine is about to follow dir crosslinks from every node in nodes. An adapter backed by a store may fetch them in one statement; semantics are unchanged either way.
Source§

fn quantifier_bound(&self) -> usize

The quantifier bound N_max: the depth to which open-ended path quantifiers (+, *, {m,}) expand, and the ceiling of any explicit {m,n} (the effective upper bound is min(n, N_max)). An adapter whose natural structures run deep may raise it; a run may override it (Run::quantifier_bound, the CLI’s --quantifier-bound). The shell gate and the invocation instant are the run’s alone (Run::allow_shell, Run::now).
Source§

fn provenance(&self, _node: NodeId) -> Provenance

The data provenance of node — the :::source / :::instant / :::dpid / :::provenance core-metadata keys. Empty by default: an adapter answers only the components its substrate genuinely records (never the invocation clock); wrapper adapters fill missing components from what they know — the mount its target, a graft its outer leaf, a model its derivation — and forward the rest inward, so resolution is nearest-ancestor per component.
Source§

fn has_node(&self, node: NodeId) -> bool

Whether node is an id this adapter minted — the guard behind the node-id anchor ((!N)), which may name an id from an earlier run (ids are minted deterministically: the same source, the same ids). The default probes the id through parent and name and treats a panic as absence, so an adapter that indexes by id needs no override; one that can answer cheaply should.
Source§

fn provenance_list(&self, node: NodeId) -> ProvenanceList

The data provenance of node as a list — every source the substrate records for the datum, and how many it elides. The default is the singular answer as a one-entry list; an adapter whose substrate records several (kaiv’s ?a;b;+N) overrides it, and a wrapper layers each entry.
Source§

fn unit_scale(&self, expr: &str) -> Option<(f64, String)>

The scale of a unit expression — (factor, canonical SI-base expansion) — for the unital reading’s criterion text (spec: The Quantital Fragment). The default answers from the engine’s frozen built-in table; a unit-aware adapter (kaiv) overrides it to include the mounted document’s own custom units, so [::range < '50kellicam'] resolves through the document’s .!units imports.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.