# frozen_string_literal: true

module Infoboxer
  # Infoboxer provides you with tree structure of the Wikipedia page,
  # which you can introspect and navigate with ease. This tree structure
  # tries to be simple, close to Wikipedia source and logical.
  #
  # You can always inspect entire page tree yourself:
  #
  # ```ruby
  # page = Infoboxer.wp.get('Argentina')
  # puts page.to_tree
  # ```
  #
  # ## Inspecting and understanding single node
  #
  # Each tree node is descendant of {Tree::Node}, so you should look
  # at this class to understand what you can do.
  #
  # Alongside with basic methods, defined in Node class, some useful
  # utility methods are defined in subclasses.
  #
  # Here's full list of subclasses, representing real nodes, with their
  # respective roles:
  #
  # * inline markup: {Text}, {Bold}, {Italic}, {BoldItalic}, {Wikilink},
  #   {ExternalLink}, {Image};
  # * embedded HTML: {HTMLTag}, {HTMLOpeningTag}, {HTMLClosingTag};
  # * paragraph-level nodes: {Heading}, {Paragraph}, {Pre}, {HR};
  # * lists: {OrderedList}, {UnorderedList}, {DefinitionList}, {ListItem},
  #   {DTerm}, {DDefinition};
  # * tables: {Table}, {TableCaption}, {TableRow}, {TableHeading}, {TableCell};
  # * special elements: {Template}, {Ref}.
  #
  # ## Tree navigation
  #
  # {Tree::Node} class has a standard list of methods for traversing tree
  # upwards, downwards and sideways: `children`, `parent`, `siblings`,
  # `index`. Read through class documentation for their detailed
  # descriptions.
  #
  # {Navigation} module contains more advanced navigational functionality,
  # like XPath-like selectors, friendly shortcuts, breakup of document
  # into logical "sections" and so on.
  #
  # Most of navigational and other Node's methods return {Nodes} type,
  # which is an `Array` descendant with additional functionality.
  #
  # ## Complex data extraction
  #
  # Most of uniform, machine-extractable data in Wikipedia is stored in
  # templates and tables. There's entire {Templates} module, which is
  # documented explaining what you can do about Wikipedia templates, how
  # to understand them and use information. Also, you can look at {Table}
  # class, which for now is not that powerful, yet allows you to extract
  # some columns and rows.
  #
  # Also, consider that WIKIpedia is maid of WIKIlinks, and {Wikilink#follow}
  # (as well as {Nodes#follow} for multiple links at once) is you good friend.
  #
  module Tree
    require_relative 'tree/node'
    require_relative 'tree/nodes'

    %w[text compound inline
       image gallery html paragraphs list template table ref math
       document].each do |type|
      require_relative "tree/#{type}"
    end
  end
end
