global

def extract_strings(ruby_code, mode: false)

Parameters:
  • 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