-
Notifications
You must be signed in to change notification settings - Fork 3
/
generic_parser.rb
56 lines (46 loc) · 1.32 KB
/
generic_parser.rb
1
2
3
4
5
6
7
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
# frozen_string_literal: true
require 'singleton'
module Metka
##
# Returns a new Metka::TagList using the given tag string.
#
# Example:
# tag_list = Metka::GenericParser.instance.("One , Two, Three")
# tag_list # ["One", "Two", "Three"]
class GenericParser
include Singleton
def initialize
@single_quote_pattern ||= {}
@double_quote_pattern ||= {}
end
def call(value)
TagList.new.tap do |tag_list|
case value
when String
value = value.to_s.dup
gsub_quote_pattern!(tag_list, value, double_quote_pattern)
gsub_quote_pattern!(tag_list, value, single_quote_pattern)
tag_list.merge value.split(Regexp.new(delimiter)).map(&:strip).reject(&:empty?)
when Enumerable
tag_list.merge value.reject(&:empty?)
end
end
end
private
def gsub_quote_pattern!(tag_list, value, pattern)
value.gsub!(pattern) {
tag_list.add(Regexp.last_match[2])
''
}
end
def delimiter
Metka.delimiter
end
def single_quote_pattern
@single_quote_pattern[delimiter] ||= /(\A|#{delimiter})\s*'(.*?)'\s*(?=#{delimiter}\s*|\z)/
end
def double_quote_pattern
@double_quote_pattern[delimiter] ||= /(\A|#{delimiter})\s*"(.*?)"\s*(?=#{delimiter}\s*|\z)/
end
end
end