Class: Nitlink::Splitter

Inherits:
Object
  • Object
show all
Defined in:
lib/nitlink/splitter.rb

Instance Method Summary collapse

Constructor Details

#initialize(string) ⇒ Splitter

Returns a new instance of Splitter.



5
6
7
8
# File 'lib/nitlink/splitter.rb', line 5

def initialize(string)
  @string = string
  @scanner = StringScanner.new(string)
end

Instance Method Details

#in_url?Boolean

Returns:

  • (Boolean)


35
36
37
38
# File 'lib/nitlink/splitter.rb', line 35

def in_url?
  preceeding = @scanner.string[0...(@scanner.pos - 1)].strip
  preceeding.end_with?(',') || preceeding.empty?
end

#split_on_unquoted(seperator) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/nitlink/splitter.rb', line 10

def split_on_unquoted(seperator)
  # 0 = start of string
  split_positions, ignored_split_positions = [0], [] 
  in_quote = false

  until @scanner.eos?
    char = @scanner.getch
    @scanner.getch if in_quote && char == "\\"

    in_quote = !in_quote if char == '"'
    @scanner.skip_until(/>/) and next if char == '<' && in_url?

    if char == seperator
      ignored_split_positions = []
      (in_quote ? ignored_split_positions : split_positions) << @scanner.pos
    end
  end
  split_positions << @string.length # end of string
  split_positions += ignored_split_positions if in_quote # dangling quote

  split_positions.sort.each_cons(2).inject([]) do |split_parts, (start_pos, end_pos)|
    split_parts << @string[start_pos...end_pos].chomp(seperator)
  end
end