Module: Sass::Shared

Extends:
Shared
Defined in:
/var/www/sass-pages/.sass/lib/sass/shared.rb

Overview

This module contains functionality that’s shared between Haml and Sass.

Instance Method Summary

Instance Method Details

- ((String, String)) balance(scanner, start, finish, count = 0)

Moves a scanner through a balanced pair of characters. For example:

Foo (Bar (Baz bang) bop) (Bang (bop bip))
^                       ^
from                    to

Parameters:

  • (StringScanner) scanner — The string scanner to move
  • (Character) start — The character opening the balanced pair. A Fixnum in 1.8, a String in 1.9
  • (Character) finish — The character closing the balanced pair. A Fixnum in 1.8, a String in 1.9
  • (Fixnum) count (defaults to: 0) — The number of opening characters matched before calling this method

Returns:

  • ((String, String)) — The string matched within the balanced pair and the rest of the string. ["Foo (Bar (Baz bang) bop)", " (Bang (bop bip))"] in the example above.


39
40
41
42
43
44
45
46
47
48
49
# File '/var/www/sass-pages/.sass/lib/sass/shared.rb', line 39

def balance(scanner, start, finish, count = 0)
  str = ''
  scanner = Sass::Util::MultibyteStringScanner.new(scanner) unless scanner.is_a? StringScanner
  regexp = Regexp.new("(.*?)[\\#{start.chr}\\#{finish.chr}]", Regexp::MULTILINE)
  while scanner.scan(regexp)
    str << scanner.matched
    count += 1 if scanner.matched[-1] == start
    count -= 1 if scanner.matched[-1] == finish
    return [str.strip, scanner.rest] if count == 0
  end
end

- (String) handle_interpolation(str) {|scan| ... }

Scans through a string looking for the interoplation-opening #{ and, when it’s found, yields the scanner to the calling code so it can handle it properly.

The scanner will have any backslashes immediately in front of the #{ as the second capture group (scan[2]), and the text prior to that as the first (scan[1]).

Yield Parameters:

  • (StringScanner) scan — The scanner scanning through the string

Returns:

  • (String) — The text remaining in the scanner after all #{s have been processed


16
17
18
19
20
# File '/var/www/sass-pages/.sass/lib/sass/shared.rb', line 16

def handle_interpolation(str)
  scan = Sass::Util::MultibyteStringScanner.new(str)
  yield scan while scan.scan(/(.*?)(\\*)\#\{/m)
  scan.rest
end

- (String) human_indentation(indentation, was = false)

Formats a string for use in error messages about indentation.

Parameters:

  • (String) indentation — The string used for indentation
  • (Boolean) was (defaults to: false) — Whether or not to add "was" or "were" (depending on how many characters were in indentation)

Returns:

  • (String) — The name of the indentation (e.g. "12 spaces", "1 tab")


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File '/var/www/sass-pages/.sass/lib/sass/shared.rb', line 57

def human_indentation(indentation, was = false)
  if !indentation.include?(?\t)
    noun = 'space'
  elsif !indentation.include?(?\s)
    noun = 'tab'
  else
    return indentation.inspect + (was ? ' was' : '')
  end

  singular = indentation.length == 1
  if was
    was = singular ? ' was' : ' were'
  else
    was = ''
  end

  "#{indentation.length} #{noun}#{'s' unless singular}#{was}"
end