2016-09-22 19:55:54 -04:00
|
|
|
module Capybara
|
|
|
|
class Selector
|
|
|
|
class CSS
|
|
|
|
def self.escape(str)
|
2018-01-09 17:05:50 -05:00
|
|
|
out = "".dup
|
2016-09-22 19:55:54 -04:00
|
|
|
value = str.dup
|
|
|
|
out << value.slice!(0...1) if value =~ /^[-_]/
|
2018-01-09 17:05:50 -05:00
|
|
|
out << (value[0] =~ NMSTART ? value.slice!(0...1) : escape_char(value.slice!(0...1)))
|
|
|
|
out << value.gsub(/[^a-zA-Z0-9_-]/) { |c| escape_char c }
|
2016-09-22 19:55:54 -04:00
|
|
|
out
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.escape_char(c)
|
2018-01-09 17:05:50 -05:00
|
|
|
return format("\\%06x", c.ord) unless c =~ %r{[ -/:-~]}
|
2016-09-22 19:55:54 -04:00
|
|
|
"\\#{c}"
|
|
|
|
end
|
|
|
|
|
2018-01-08 15:23:54 -05:00
|
|
|
S = '\u{80}-\u{D7FF}\u{E000}-\u{FFFD}\u{10000}-\u{10FFFF}'.freeze
|
2016-09-22 19:55:54 -04:00
|
|
|
H = /[0-9a-fA-F]/
|
|
|
|
UNICODE = /\\#{H}{1,6}[ \t\r\n\f]?/
|
|
|
|
NONASCII = /[#{S}]/
|
|
|
|
ESCAPE = /#{UNICODE}|\\[ -~#{S}]/
|
|
|
|
NMSTART = /[_a-zA-Z]|#{NONASCII}|#{ESCAPE}/
|
|
|
|
end
|
|
|
|
end
|
2018-01-09 17:05:50 -05:00
|
|
|
end
|