global
def extract_strings(ruby_code, mode: false)
-
ruby_code
(String
) --
def extract_strings(ruby_code, mode: false) strings = mode ? [] : Set.new indices = [] inside_string = false inside_multiline_comment = false string_start_index = 0 current_quote_type = '' global_index = 0 ruby_code.each_line do |line| stripped = line.strip unless inside_string if stripped[0] == '#' global_index += line.length next end if stripped.start_with?('=begin') inside_multiline_comment = true elsif stripped.start_with?('=end') inside_multiline_comment = false end end if inside_multiline_comment global_index += line.length next end i = 0 while i < line.length char = line[i] break if !inside_string && char == '#' if !inside_string && %w[" '].include?(char) inside_string = true string_start_index = global_index + i current_quote_type = char elsif inside_string && char == current_quote_type && escaped?(line, i - 1) extracted_string = ruby_code[string_start_index + 1...global_index + i].gsub(/\r?\n/, '\#') if mode strings << extracted_string indices << string_start_index + 1 else strings.add(extracted_string) end inside_string = false current_quote_type = '' end i += 1 end global_index += line.length end mode ? [strings, indices] : strings.to_a end