Module: Coradoc::Query

Defined in:
lib/coradoc/query.rb

Overview

Document querying and introspection API.

This module provides CSS-like selectors for navigating and querying document trees. It enables powerful document manipulation patterns.

Examples:

Querying documents

doc = Coradoc.parse(adoc_text, format: :asciidoc)

# Find all sections
sections = doc.query('section')

# Find level-2 sections
doc.query('section.level-2').each do |section|
  puts section.title
end

# Find paragraphs with specific role
examples = doc.query('[role=example]')

# Complex selectors
doc.query('section > paragraph:first-child')

Defined Under Namespace

Classes: Engine, ResultSet, Selector

Class Method Summary collapse

Class Method Details

.get_children(element) ⇒ Array

Get navigable children from an element. Uses ChildrenContent#children when available, falls back to content.

Parameters:

  • element (Object)

    Element to get children from

Returns:

  • (Array)

    Navigable child elements



579
580
581
582
583
584
585
586
587
588
589
590
# File 'lib/coradoc/query.rb', line 579

def get_children(element)
  return [] unless element

  children = if element.respond_to?(:children) && element.children&.any?
               element.children
             elsif element.respond_to?(:content) && element.content
               Array(element.content).select { |c| c.is_a?(CoreModel::Base) }
             else
               []
             end
  Array(children)
end

.query(document, selector) ⇒ ResultSet

Query a document with a selector

Parameters:

  • document (CoreModel::Base)

    The document to query

  • selector (String)

    CSS-like selector

Returns:



549
550
551
# File 'lib/coradoc/query.rb', line 549

def query(document, selector)
  Engine.query(document, selector)
end

.query_within(element, selector) ⇒ ResultSet

Query within an element (not including the element itself)

Parameters:

  • element (CoreModel::Base)

    The parent element

  • selector (String)

    CSS-like selector

Returns:



558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
# File 'lib/coradoc/query.rb', line 558

def query_within(element, selector)
  parsed = Selector.parse(selector)
  results = []

  traverse_children(element) do |child, siblings, index|
    if parsed.matches?(child)
      next if parsed.pseudo_classes.any? && !parsed.matches_pseudo_classes?(child, siblings: siblings,
                                                                                   index: index)

      results << child
    end
  end

  ResultSet.new(results)
end