Class: Sass::Script::Value::String

Inherits:
Base
  • Object
show all
Defined in:
/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb

Overview

A SassScript object representing a CSS string or a CSS identifier.

Instance Attribute Summary (collapse)

Attributes inherited from Base

#options, #source_range

Class Method Summary (collapse)

Instance Method Summary (collapse)

Methods inherited from Base

#==, #_perform, #assert_int!, #div, #eq, #eql?, #hash, #minus, #neq, #null?, #single_eq, #to_bool, #to_h, #to_i, #unary_div, #unary_minus, #unary_not, #unary_plus

Constructor Details

- (String) initialize(value, type = :identifier, deprecated_interp_equivalent = nil)

Creates a new string.

Parameters:

  • value (String)

    See #value

  • type (Symbol) (defaults to: :identifier)

    See #type

  • deprecated_interp_equivalent (String?) (defaults to: nil)

    If this was created via a potentially-deprecated string interpolation, this is the replacement expression that should be suggested to the user.



82
83
84
85
86
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 82

def initialize(value, type = :identifier, deprecated_interp_equivalent = nil)
  super(value)
  @type = type
  @deprecated_interp_equivalent = deprecated_interp_equivalent
end

Instance Attribute Details

- (Symbol) type (readonly)

Whether this is a CSS string or a CSS identifier. The difference is that strings are written with double-quotes, while identifiers aren’t.

Returns:

  • (Symbol)

    :string or :identifier



15
16
17
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 15

def type
  @type
end

- (String) value (readonly)

The Ruby value of the string.

Returns:



8
9
10
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 8

def value
  @value
end

Class Method Details

+ quote(contents, opts = {})

Returns the quoted string representation of contents.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 38

def self.quote(contents, opts = {})
  quote = opts[:quote]

  # Short-circuit if there are no characters that need quoting.
  unless contents =~ /[\n\\"']|\#\{/
    quote ||= '"'
    return "#{quote}#{contents}#{quote}"
  end

  if quote.nil?
    if contents.include?('"')
      if contents.include?("'")
        quote = '"'
      else
        quote = "'"
      end
    else
      quote = '"'
    end
  end

  # Replace single backslashes with multiples.
  contents = contents.gsub("\\", "\\\\\\\\")

  # Escape interpolation.
  contents = contents.gsub('#{', "\\\#{") if opts[:sass]

  if quote == '"'
    contents = contents.gsub('"', "\\\"")
  else
    contents = contents.gsub("'", "\\'")
  end

  contents = contents.gsub(/\n(?![a-fA-F0-9\s])/, "\\a").gsub("\n", "\\a ")
  "#{quote}#{contents}#{quote}"
end

+ value(contents)



17
18
19
20
21
22
23
24
25
26
27
28
29
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 17

def self.value(contents)
  contents.gsub("\\\n", "").gsub(/\\(?:([0-9a-fA-F]{1,6})\s?|(.))/) do
    next $2 if $2
    # Handle unicode escapes as per CSS Syntax Level 3 section 4.3.8.
    code_point = $1.to_i(16)
    if code_point == 0 || code_point > 0x10FFFF ||
        (code_point >= 0xD800 && code_point <= 0xDFFF)
      '�'
    else
      [code_point].pack("U")
    end
  end
end

Instance Method Details

- check_deprecated_interp

Prints a warning if this string was created using potentially-deprecated interpolation.



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 121

def check_deprecated_interp
  return unless @deprecated_interp_equivalent

  # rubocop:disable GlobalVars
  $_sass_deprecated_interp_warnings ||= Set.new
  key = [source_range.start_pos.line, source_range.file, @deprecated_interp_equivalent]
  return if $_sass_deprecated_interp_warnings.include?(key)
  $_sass_deprecated_interp_warnings << key
  # rubocop:enable GlobalVars

  location = "on line #{source_range.start_pos.line}"
  location << " of #{source_range.file}" if source_range.file
  Sass::Util.sass_warn <<WARNING
DEPRECATION WARNING #{location}: \#{} interpolation near operators will be simplified
in a future version of Sass. To preserve the current behavior, use quotes:

  #{@deprecated_interp_equivalent}
WARNING
end

- inspect



141
142
143
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 141

def inspect
  String.quote(value)
end

- plus(other)

See Also:

  • Value#plus


89
90
91
92
93
94
95
96
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 89

def plus(other)
  other_value = if other.is_a?(Sass::Script::Value::String)
                  other.value
                else
                  other.to_s(:quote => :none)
                end
  Sass::Script::Value::String.new(value + other_value, type)
end

- separator



109
110
111
112
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 109

def separator
  check_deprecated_interp
  super
end

- to_a



114
115
116
117
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 114

def to_a
  check_deprecated_interp
  super
end

- to_s(opts = {})

See Also:

  • Value#to_s


99
100
101
102
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 99

def to_s(opts = {})
  return @value.gsub(/\n\s*/, ' ') if opts[:quote] == :none || @type == :identifier
  String.quote(value, opts)
end

- to_sass(opts = {})

See Also:

  • Value#to_sass


105
106
107
# File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/value/string.rb', line 105

def to_sass(opts = {})
  to_s(opts.merge(:sass => true))
end