Module: Sass::SCSS::RX

Included in:
Parser, Sass::Script::Lexer
Defined in:
.ruby-sass/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](www.w3.org/TR/css3-syntax/#lexical), although some have been modified for various reasons.

Constant Summary

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_char(c) ⇒ String

Escapes a single character for a CSS identifier.

Parameters:

  • c (String)

    The character to escape. Should have length 1

Returns:

  • (String)

    The escaped character



34
35
36
37
# File '.ruby-sass/lib/sass/scss/rx.rb', line 34

def self.escape_char(c)
  return "\\%06x" % c.ord unless c =~ %r{[ -/:-~]}
  "\\#{c}"
end

.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 '.ruby-sass/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

.quote(str, flags = 0) ⇒ Regexp

Creates a Regexp from a plain text string, escaping all significant characters.

Parameters:

  • str (String)

    The text of the regexp

  • flags (Integer) (defaults to: 0)

    Flags for the created regular expression

Returns:

  • (Regexp)


46
47
48
# File '.ruby-sass/lib/sass/scss/rx.rb', line 46

def self.quote(str, flags = 0)
  Regexp.new(Regexp.quote(str), flags)
end