Module: Phoney::Parser

Extended by:
Formatter
Defined in:
lib/phoney/parser.rb

Class Method Summary collapse

Methods included from Formatter

extract_country_code, extract_trunk_prefix, format, international_call_prefix_for, normalize

Class Method Details

.parse(input, options = {}) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/phoney/parser.rb', line 8

def parse(input, options={})
  number       = normalize(input)
  intl_prefix  = international_call_prefix_for number
  country_code = extract_country_code number
  trunk_prefix = extract_trunk_prefix number
  region       = options[:region] || Phoney.region
  flags        = []
  
  if intl_prefix
    # Strip international prefix from number
    number = number[intl_prefix.count(NUMPAD_CHARS)..-1]
    region = Phoney::Region[country_code]
    flags << :c
  end
  
  if country_code
    # Strip country code from number
    number = number[country_code.count(DIGITS)..-1]
    
    if intl_prefix == '+'
      intl_prefix += country_code
    else
      intl_prefix = [intl_prefix, country_code].join(' ')
    end
  end
  
  rule = find_matching_rule_for number, region: region, flags: flags
  rule ||= find_matching_rule_for number, region: region
  return format number, rule.pattern, intl_prefix: intl_prefix if rule
  
  if trunk_prefix
    # Strip trunk prefix from number
    number = number[trunk_prefix.count(DIGITS)..-1]
    flags << :n
    
    if intl_prefix
      intl_prefix += " (#{trunk_prefix})"
      trunk_prefix = nil
    end
  end
  
  if country_code || intl_prefix != '+'
    rule = find_matching_rule_for number, region: region, flags: flags
    rule ||= find_matching_rule_for number, region: region
    
    pattern = '#'*number.length
    pattern = rule.pattern if rule
    
    format number, pattern, intl_prefix: intl_prefix, trunk_prefix: trunk_prefix
  else
    input
  end
end