require 'delegate' require 'forwardable' require 'pathname' require 'nokogiri' # TODO => replace with Builder require 'sass' require 'adamantium' require 'equalizer' module Hexp ROOT = Pathname(__FILE__).dirname.parent # Inject the Hexp::DSL module into classes that include Hexp # # @param [Class] klazz # The class that included Hexp # # @return [Class] # # @api private def self.included(klazz) klazz.send(:include, Hexp::DSL) end # Variant of ::Array with slightly modified semantics # # `Array()` is often used to wrap a value in an Array, unless it's already # an array. However if your object implements `#to_a`, then `Array()` will use # that value. Because of this objects that aren't Array-like will get # converted as well, such as Struct objects. # # This implementation relies on #to_ary, which signals that the Object is # a drop-in replacement for an actual Array. # # @param [Object] arg # # @return [Array] # # @api private def self.Array(arg) if arg.respond_to? :to_ary arg.to_ary else [ arg ] end end # Parse HTML to Hexp # # The input have a single root element. If there are multiple only the first # will be converted. If there is no root element (e.g. an empty document, or # only a DTD or comment) then an error is raised # # @example # Hexp.parse('
hello
') #=> H[:div, "hello"] # # @param [String] html # A HTML document # # @return [Hexp::Node] # # @api public def self.parse(html) root = Nokogiri(html).root raise Hexp::ParseError, "Failed to parse HTML : no document root" if root.nil? Hexp::Nokogiri::Reader.new.call(root) end # Use builder syntax to create a Hexp # # @see Hexp::Builder # # @example # list = Hexp.build do # ul do # 3.times do |i| # li i.to_s # end # end # end # # @param [Array] args # # @yieldparam [Hexp::Builder] # # @return [Hexp::Builder] # # @api public def self.build(*args, &block) Hexp::Builder.new(*args, &block) end end require 'hexp/version' require 'hexp/node/attributes' require 'hexp/node/children' require 'hexp/node' require 'hexp/dsl' require 'hexp/node/normalize' require 'hexp/node/domize' require 'hexp/node/pp' require 'hexp/node/rewriter' require 'hexp/node/selection' require 'hexp/node/css_selection' require 'hexp/text_node' require 'hexp/list' require 'hexp/dom' require 'hexp/css_selector' require 'hexp/css_selector/sass_parser' require 'hexp/css_selector/parser' require 'hexp/errors' require 'hexp/nokogiri/equality' # TODO => replace this with equivalent-xml require 'hexp/nokogiri/reader' require 'hexp/sass/selector_parser' require 'hexp/h' require 'hexp/builder' require 'hexp/unparser'