Module: Sass::SCSS::RX

Included in:
Parser, Sass::Script::Lexer
Defined in:
lib/sass/scss/rx.rb

Overview

A module containing regular expressions used for lexing tokens in an SCSS document. Most of these are taken from the CSS3 spec, although some have been modified for various reasons.

Constant Summary collapse

H =
/[0-9a-fA-F]/
NL =
/\n|\r\n|\r|\f/
UNICODE =
/\\#{H}{1,6}[ \t\r\n\f]?/
NONASCII =
/[#{s}]/
ESCAPE =
/#{UNICODE}|\\[^0-9a-fA-F\r\n\f]/
NMSTART =
/[_a-zA-Z]|#{NONASCII}|#{ESCAPE}/
NMCHAR =
/[a-zA-Z0-9_-]|#{NONASCII}|#{ESCAPE}/
STRING1 =
/\"((?:[^\n\r\f\\"]|\\#{NL}|#{ESCAPE})*)\"/
STRING2 =
/\'((?:[^\n\r\f\\']|\\#{NL}|#{ESCAPE})*)\'/
IDENT =
/-*#{NMSTART}#{NMCHAR}*/
NAME =
/#{NMCHAR}+/
STRING =
/#{STRING1}|#{STRING2}/
URLCHAR =
/[#%&*-~]|#{NONASCII}|#{ESCAPE}/
URL =
/(#{URLCHAR}*)/
W =
/[ \t\r\n\f]*/
VARIABLE =
/(\$)(#{Sass::SCSS::RX::IDENT})/
RANGE =

This is more liberal than the spec's definition, but that definition didn't work well with the greediness rules

/(?:#{H}|\?){1,6}/
S =
/[ \t\r\n\f]+/
COMMENT =
%r{/\*([^*]|\*+[^/*])*\**\*/}
SINGLE_LINE_COMMENT =
%r{//.*(\n[ \t]*//.*)*}
CDO =
quote("<!--")
CDC =
quote("-->")
INCLUDES =
quote("~=")
DASHMATCH =
quote("|=")
PREFIXMATCH =
quote("^=")
SUFFIXMATCH =
quote("$=")
SUBSTRINGMATCH =
quote("*=")
HASH =
/##{NAME}/
IMPORTANT =
/!#{W}important/i
UNIT =

A unit is like an IDENT, but disallows a hyphen followed by a digit. This allows "1px-2px" to be interpreted as subtraction rather than "1" with the unit "px-2px". It also allows "%".

/-?#{NMSTART}(?:[a-zA-Z0-9_]|#{NONASCII}|#{ESCAPE}|-(?!\.?\d))*|%/
UNITLESS_NUMBER =
/(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?\d+)?/
NUMBER =
/#{UNITLESS_NUMBER}(?:#{UNIT})?/
PERCENTAGE =
/#{UNITLESS_NUMBER}%/
URI =
/url\(#{W}(?:#{STRING}|#{URL})#{W}\)/i
FUNCTION =
/#{IDENT}\(/
UNICODERANGE =
/u\+(?:#{H}{1,6}-#{H}{1,6}|#{RANGE})/i
PLUS =
/#{W}\+/
GREATER =
/#{W}>/
TILDE =
/#{W}~/
NOT =
quote(":not(", Regexp::IGNORECASE)
URL_PREFIX =
/url-prefix\(#{W}(?:#{STRING}|#{URL})#{W}\)/i
DOMAIN =
/domain\(#{W}(?:#{STRING}|#{URL})#{W}\)/i
HEXCOLOR =

Custom

/\#[0-9a-fA-F]+/
INTERP_START =
/#\{/
ANY =
/:(-[-\w]+-)?any\(/i
OPTIONAL =
/!#{W}optional/i
IDENT_START =
/-|#{NMSTART}/
IDENT_HYPHEN_INTERP =
/-+(?=#\{)/
STRING1_NOINTERP =
/\"((?:[^\n\r\f\\"#]|#(?!\{)|#{ESCAPE})*)\"/
STRING2_NOINTERP =
/\'((?:[^\n\r\f\\'#]|#(?!\{)|#{ESCAPE})*)\'/
STRING_NOINTERP =
/#{STRING1_NOINTERP}|#{STRING2_NOINTERP}/
STATIC_COMPONENT =
/#{IDENT}|#{STRING_NOINTERP}|#{HEXCOLOR}|[+-]?#{NUMBER}|\!important/i
STATIC_VALUE =
%r(#{STATIC_COMPONENT}(\s*[\s,\/]\s*#{STATIC_COMPONENT})*(?=[;}]))i
STATIC_SELECTOR =
/(#{NMCHAR}|[ \t]|[,>+*]|[:#.]#{NMSTART}){1,50}([{])/i

Class Method Summary collapse

Class Method Details

.escape_ident(str) ⇒ String

Takes a string and returns a CSS identifier that will have the value of the given string.

Parameters:

  • str (String)

    The string to escape

Returns:

  • (String)

    The escaped string



14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/sass/scss/rx.rb', line 14

def self.escape_ident(str)
  return "" if str.empty?
  return "\\#{str}" if str == '-' || str == '_'
  out = ""
  value = str.dup
  out << value.slice!(0...1) if value =~ /^[-_]/
  if value[0...1] =~ NMSTART
    out << value.slice!(0...1)
  else
    out << escape_char(value.slice!(0...1))
  end
  out << value.gsub(/[^a-zA-Z0-9_-]/) {|c| escape_char c}
  out
end