class Referrer::MarkupGenerator

Constants

ORGANICS
REFERRALS
UTM_KEYS

Attributes

array_params_joiner[RW]
organics[RW]
referrals[RW]
utm_synonyms[RW]

Public Class Methods

new() click to toggle source
# File lib/other/markup_generator.rb, line 33
def initialize
  @organics = ORGANICS
  @referrals = REFERRALS
  @utm_synonyms = UTM_KEYS.inject({}){|r, key| r.merge({key => []})}
  @array_params_joiner = ', '
end

Public Instance Methods

generate(referrer, entry_point) click to toggle source
# File lib/other/markup_generator.rb, line 40
def generate(referrer, entry_point)
  referrer_uri, entry_point_uri = *[referrer, entry_point].map{|url| URI(URI::encode(url || ''))}
  referrer_params, entry_point_params = *[referrer_uri, entry_point_uri].map{|uri| uri_params(uri)}
  prepare_result(utm(entry_point_params) || organic(referrer_uri, referrer_params) ||
                     referral(referrer_uri) || direct)
end

Private Instance Methods

base_result() click to toggle source
# File lib/other/markup_generator.rb, line 53
def base_result
  UTM_KEYS.inject({}){|r, key| r.merge!(key => '(none)')}
end
check_host(option, value) click to toggle source
# File lib/other/markup_generator.rb, line 57
def check_host(option, value)
  case option
    when String
      option == value
    when Regexp
      option =~ value
    else
      false
  end
end
direct() click to toggle source
# File lib/other/markup_generator.rb, line 108
def direct
  base_result.merge!('utm_source' => '(direct)', 'kind' => 'direct')
end
organic(referrer_uri, referrer_params) click to toggle source
# File lib/other/markup_generator.rb, line 87
def organic(referrer_uri, referrer_params)
  if referrer_uri.to_s.present?
    current_organic = organics.detect{|organic| check_host(organic[:host], referrer_uri.host)}
    base_result.merge!({'utm_source' => current_organic[:display] || current_organic[:host].split('.')[-2],
                        'utm_medium' => 'organic',
                        'utm_term' => referrer_params[current_organic[:param]] || '(none)',
                        'kind' => 'organic'}) if current_organic.present?
  end
end
prepare_result(markup) click to toggle source
# File lib/other/markup_generator.rb, line 68
def prepare_result(markup)
  Hash[markup.map{|k, v| [k, v.is_a?(Array) ? v.join(array_params_joiner) : v]}].symbolize_keys
end
referral(referrer_uri) click to toggle source
# File lib/other/markup_generator.rb, line 97
def referral(referrer_uri)
  if referrer_uri.to_s.present?
    custom_referral = referrals.detect{|referral| check_host(referral[:host], referrer_uri.host)}
    base_result.merge!(
        'utm_source' => custom_referral ? custom_referral[:display] : referrer_uri.host.gsub('www.', ''),
        'utm_medium' => 'referral',
        'utm_content' => URI::decode(referrer_uri.request_uri) || '(none)',
        'kind' => 'referral')
  end
end
uri_params(uri) click to toggle source
# File lib/other/markup_generator.rb, line 49
def uri_params(uri)
  Rack::Utils.parse_query(uri.try(:query))
end
utm(entry_point_params) click to toggle source
# File lib/other/markup_generator.rb, line 72
def utm(entry_point_params)
  if (entry_point_params.keys & (UTM_KEYS + utm_synonyms.values.flatten)).present?
    UTM_KEYS.inject(base_result) do |r, key|
      values = if utm_synonyms[key.to_sym].present?
                 [].push(entry_point_params[key]).push([utm_synonyms[key.to_sym]].flatten.map do |synonym_key|
                                                         entry_point_params[synonym_key]
                                                       end)
               else
                 [entry_point_params[key]]
               end.flatten.compact.map{|value| URI::decode(value)}
      values.present? ? r.merge!({key => values}) : r
    end.merge('kind' => 'utm')
  end
end