Sha256: 06fac4775748a73235396e58cc2a7a7d44e66076db9ddfee9830f2d923f51877

Contents?: true

Size: 1.52 KB

Versions: 8

Compression:

Stored size: 1.52 KB

Contents

class String
  # Splits text into tokens the way a shell would, handling quoted
  # text as a single token. Use '\"' and "\'" to escape quotes and
  # '\\' to escape a backslash.
  # 
  # @return [Array] an array representing the tokens
  def shell_split
    out = [""]
    state = :none
    escape_next = false
    quote = ""
    strip.split(//).each do |char|
      case state
      when :none, :space
        case char
        when /\s/
          out << "" unless state == :space
          state = :space
          escape_next = false
        when "\\"
          if escape_next
            out.last << char
            escape_next = false
          else
            escape_next = true
          end
        when '"', "'"
          if escape_next
            out.last << char
            escape_next = false
          else
            state = char
            quote = ""
          end
        else
          state = :none
          out.last << char
          escape_next = false
        end
      when '"', "'"
        case char
        when '"', "'"
          if escape_next
            quote << char
            escape_next = false
          elsif char == state
            out.last << quote
            state = :none 
          else
            quote << char
          end
        when '\\'
          if escape_next
            quote << char
            escape_next = false
          else
            escape_next = true
          end
        else
          quote << char
          escape_next = false
        end
      end
    end
    out
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
yard-0.6.8 lib/yard/core_ext/string.rb
yard-0.6.7 lib/yard/core_ext/string.rb
yard-0.6.6 lib/yard/core_ext/string.rb
yard-0.6.5 lib/yard/core_ext/string.rb
yard-0.6.4 lib/yard/core_ext/string.rb
yard-0.6.3 lib/yard/core_ext/string.rb
yard-0.6.2 lib/yard/core_ext/string.rb
yard-0.6.1 lib/yard/core_ext/string.rb