class BuilderLinks::Analize

Public Class Methods

new(text, opts = {}) click to toggle source
# File lib/builder_links/analize.rb, line 5
def initialize(text, opts = {})
  @options = {black_uris: []}.merge(opts)
  @doc = Nokogiri::HTML(text)
  @analized_text = nil
  @total_links = 0
end

Public Instance Methods

run() click to toggle source
# File lib/builder_links/analize.rb, line 12
def run
  return @analized_text unless @analized_text.blank?

  BuilderLinks.patterns.each do |pattern|
    break if max_links_generated?
    next if black_pattern?(pattern)
    next if !@doc.content.include?(pattern[:anchortext])

    links_per_pattern = 0
    @doc.search('p').children.each do |child|
      break if max_links_generated?(links_per_pattern)

      if analize_node(child, pattern)
        links_per_pattern += 1
        @total_links += 1
      end
    end
  end

  @analized_text = @doc.at('body').nil? ? '' : @doc.at('body').inner_html
end

Private Instance Methods

analize_node(node, pattern) click to toggle source
# File lib/builder_links/analize.rb, line 39
def analize_node(node, pattern)
  if %('text', 'strong').include?(node.name) && node.children.count < 2
    replace_text = node.content

    prefix_suffix = pattern[:anchortext].include?(' ') ? '' : ' '
    result = replace_text.sub!(/(#{prefix_suffix}#{pattern[:anchortext]}#{prefix_suffix})/i,
                               '<a href="' + pattern[:uri] + '" title="\1">\1</a>')

    unless result.nil?
      if node.name == 'text'
        node.replace replace_text
      else
        new_node = @doc.create_element node.name
        new_node.inner_html = replace_text
        node.replace new_node
      end

      return true
    end
  end

  false
end
black_pattern?(pattern) click to toggle source
# File lib/builder_links/analize.rb, line 74
def black_pattern?(pattern)
  @options[:black_uris].each do |black_uri|
    return true if black_uri.include?(pattern[:uri])
  end

  return false
end