sass 3.1.21 → 3.2.0.alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +5 -4
- data/REVISION +1 -1
- data/Rakefile +6 -15
- data/VERSION +1 -1
- data/VERSION_NAME +1 -1
- data/lib/sass.rb +0 -1
- data/lib/sass/cache_stores/base.rb +1 -3
- data/lib/sass/cache_stores/filesystem.rb +0 -3
- data/lib/sass/css.rb +49 -145
- data/lib/sass/engine.rb +23 -47
- data/lib/sass/environment.rb +5 -30
- data/lib/sass/exec.rb +7 -30
- data/lib/sass/importers/base.rb +1 -2
- data/lib/sass/importers/filesystem.rb +13 -18
- data/lib/sass/less.rb +1 -1
- data/lib/sass/plugin.rb +8 -4
- data/lib/sass/plugin/compiler.rb +67 -93
- data/lib/sass/plugin/configuration.rb +2 -0
- data/lib/sass/plugin/staleness_checker.rb +4 -14
- data/lib/sass/repl.rb +3 -2
- data/lib/sass/script.rb +1 -0
- data/lib/sass/script/color.rb +9 -4
- data/lib/sass/script/funcall.rb +3 -16
- data/lib/sass/script/functions.rb +55 -98
- data/lib/sass/script/interpolation.rb +0 -9
- data/lib/sass/script/lexer.rb +4 -2
- data/lib/sass/script/list.rb +0 -8
- data/lib/sass/script/literal.rb +20 -5
- data/lib/sass/script/node.rb +0 -8
- data/lib/sass/script/number.rb +11 -35
- data/lib/sass/script/operation.rb +0 -16
- data/lib/sass/script/parser.rb +5 -12
- data/lib/sass/script/string_interpolation.rb +0 -9
- data/lib/sass/script/unary_operation.rb +0 -7
- data/lib/sass/script/variable.rb +1 -5
- data/lib/sass/scss/parser.rb +54 -191
- data/lib/sass/scss/rx.rb +3 -15
- data/lib/sass/scss/static_parser.rb +3 -3
- data/lib/sass/selector.rb +3 -15
- data/lib/sass/selector/abstract_sequence.rb +2 -11
- data/lib/sass/selector/comma_sequence.rb +3 -8
- data/lib/sass/selector/sequence.rb +11 -74
- data/lib/sass/selector/simple.rb +1 -7
- data/lib/sass/selector/simple_sequence.rb +8 -28
- data/lib/sass/shared.rb +5 -3
- data/lib/sass/tree/comment_node.rb +12 -25
- data/lib/sass/tree/debug_node.rb +1 -1
- data/lib/sass/tree/directive_node.rb +0 -5
- data/lib/sass/tree/each_node.rb +1 -1
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/for_node.rb +2 -2
- data/lib/sass/tree/function_node.rb +1 -1
- data/lib/sass/tree/if_node.rb +14 -1
- data/lib/sass/tree/media_node.rb +4 -4
- data/lib/sass/tree/mixin_def_node.rb +1 -1
- data/lib/sass/tree/mixin_node.rb +2 -2
- data/lib/sass/tree/node.rb +26 -10
- data/lib/sass/tree/return_node.rb +1 -1
- data/lib/sass/tree/root_node.rb +1 -1
- data/lib/sass/tree/rule_node.rb +11 -9
- data/lib/sass/tree/variable_node.rb +1 -1
- data/lib/sass/tree/visitors/base.rb +1 -1
- data/lib/sass/tree/visitors/check_nesting.rb +36 -29
- data/lib/sass/tree/visitors/convert.rb +9 -16
- data/lib/sass/tree/visitors/cssize.rb +9 -40
- data/lib/sass/tree/visitors/perform.rb +23 -79
- data/lib/sass/tree/visitors/to_css.rb +21 -23
- data/lib/sass/tree/warn_node.rb +1 -1
- data/lib/sass/tree/while_node.rb +1 -1
- data/lib/sass/util.rb +9 -147
- data/lib/sass/version.rb +0 -14
- data/test/sass/cache_test.rb +0 -15
- data/test/sass/conversion_test.rb +8 -50
- data/test/sass/css2sass_test.rb +0 -33
- data/test/sass/engine_test.rb +32 -283
- data/test/sass/extend_test.rb +0 -315
- data/test/sass/functions_test.rb +23 -60
- data/test/sass/importer_test.rb +0 -110
- data/test/sass/more_results/more_import.css +2 -2
- data/test/sass/plugin_test.rb +13 -40
- data/test/sass/results/import.css +2 -2
- data/test/sass/results/import_charset.css +0 -1
- data/test/sass/results/import_charset_1_8.css +0 -1
- data/test/sass/results/import_charset_ibm866.css +0 -1
- data/test/sass/results/scss_import.css +2 -2
- data/test/sass/results/units.css +1 -1
- data/test/sass/script_conversion_test.rb +0 -2
- data/test/sass/script_test.rb +4 -28
- data/test/sass/scss/css_test.rb +1 -79
- data/test/sass/scss/scss_test.rb +16 -96
- data/test/sass/templates/import_charset.sass +0 -2
- data/test/sass/templates/import_charset_1_8.sass +0 -2
- data/test/sass/templates/import_charset_ibm866.sass +0 -2
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util_test.rb +0 -28
- data/test/test_helper.rb +0 -2
- data/vendor/{listen → fssm}/LICENSE +1 -1
- data/vendor/fssm/README.markdown +55 -0
- data/vendor/fssm/Rakefile +59 -0
- data/vendor/fssm/VERSION.yml +5 -0
- data/vendor/fssm/example.rb +9 -0
- data/vendor/fssm/fssm.gemspec +77 -0
- data/vendor/fssm/lib/fssm.rb +33 -0
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +36 -0
- data/vendor/fssm/lib/fssm/backends/inotify.rb +26 -0
- data/vendor/fssm/lib/fssm/backends/polling.rb +25 -0
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +131 -0
- data/vendor/fssm/lib/fssm/monitor.rb +26 -0
- data/vendor/fssm/lib/fssm/path.rb +91 -0
- data/vendor/fssm/lib/fssm/pathname.rb +502 -0
- data/vendor/fssm/lib/fssm/state/directory.rb +57 -0
- data/vendor/fssm/lib/fssm/state/file.rb +24 -0
- data/vendor/fssm/lib/fssm/support.rb +63 -0
- data/vendor/fssm/lib/fssm/tree.rb +176 -0
- data/vendor/fssm/profile/prof-cache.rb +40 -0
- data/vendor/fssm/profile/prof-fssm-pathname.html +1231 -0
- data/vendor/fssm/profile/prof-pathname.rb +68 -0
- data/vendor/fssm/profile/prof-plain-pathname.html +988 -0
- data/vendor/fssm/profile/prof.html +2379 -0
- data/vendor/fssm/spec/path_spec.rb +75 -0
- data/vendor/fssm/spec/root/duck/quack.txt +0 -0
- data/vendor/fssm/spec/root/file.css +0 -0
- data/vendor/fssm/spec/root/file.rb +0 -0
- data/vendor/fssm/spec/root/file.yml +0 -0
- data/vendor/fssm/spec/root/moo/cow.txt +0 -0
- data/vendor/fssm/spec/spec_helper.rb +14 -0
- metadata +246 -281
- data/VERSION_DATE +0 -1
- data/lib/sass/logger.rb +0 -15
- data/lib/sass/logger/base.rb +0 -32
- data/lib/sass/logger/log_level.rb +0 -49
- data/lib/sass/tree/visitors/deep_copy.rb +0 -87
- data/lib/sass/tree/visitors/extend.rb +0 -42
- data/lib/sass/tree/visitors/set_options.rb +0 -97
- data/lib/sass/util/multibyte_string_scanner.rb +0 -134
- data/test/Gemfile +0 -4
- data/test/Gemfile.lock +0 -19
- data/test/sass/fixtures/test_staleness_check_across_importers.css +0 -1
- data/test/sass/fixtures/test_staleness_check_across_importers.scss +0 -1
- data/test/sass/logger_test.rb +0 -58
- data/test/sass/templates/_double_import_loop2.sass +0 -1
- data/test/sass/templates/bork5.sass +0 -3
- data/test/sass/templates/double_import_loop1.sass +0 -1
- data/test/sass/templates/nested_bork5.sass +0 -2
- data/test/sass/templates/single_import_loop.sass +0 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +0 -147
- data/vendor/listen/CHANGELOG.md +0 -147
- data/vendor/listen/Gemfile +0 -23
- data/vendor/listen/Guardfile +0 -8
- data/vendor/listen/README.md +0 -312
- data/vendor/listen/Rakefile +0 -47
- data/vendor/listen/Vagrantfile +0 -96
- data/vendor/listen/lib/listen.rb +0 -38
- data/vendor/listen/lib/listen/adapter.rb +0 -167
- data/vendor/listen/lib/listen/adapters/darwin.rb +0 -84
- data/vendor/listen/lib/listen/adapters/linux.rb +0 -110
- data/vendor/listen/lib/listen/adapters/polling.rb +0 -66
- data/vendor/listen/lib/listen/adapters/windows.rb +0 -81
- data/vendor/listen/lib/listen/directory_record.rb +0 -318
- data/vendor/listen/lib/listen/listener.rb +0 -203
- data/vendor/listen/lib/listen/multi_listener.rb +0 -121
- data/vendor/listen/lib/listen/turnstile.rb +0 -28
- data/vendor/listen/lib/listen/version.rb +0 -3
- data/vendor/listen/listen.gemspec +0 -26
- data/vendor/listen/spec/listen/adapter_spec.rb +0 -142
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -31
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -41
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -24
- data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1138
- data/vendor/listen/spec/listen/listener_spec.rb +0 -155
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -156
- data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
- data/vendor/listen/spec/listen_spec.rb +0 -73
- data/vendor/listen/spec/spec_helper.rb +0 -18
- data/vendor/listen/spec/support/adapter_helper.rb +0 -716
- data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
- data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
- data/vendor/listen/spec/support/listeners_helper.rb +0 -144
- data/vendor/listen/spec/support/platform_helper.rb +0 -11
data/VERSION_DATE
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
11 August 2012 00:38:15 UTC
|
data/lib/sass/logger.rb
DELETED
data/lib/sass/logger/base.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'sass/logger/log_level'
|
2
|
-
|
3
|
-
class Sass::Logger::Base
|
4
|
-
|
5
|
-
include Sass::Logger::LogLevel
|
6
|
-
|
7
|
-
attr_accessor :log_level
|
8
|
-
attr_accessor :disabled
|
9
|
-
|
10
|
-
log_level :trace
|
11
|
-
log_level :debug
|
12
|
-
log_level :info
|
13
|
-
log_level :warn
|
14
|
-
log_level :error
|
15
|
-
|
16
|
-
def initialize(log_level = :debug)
|
17
|
-
self.log_level = log_level
|
18
|
-
end
|
19
|
-
|
20
|
-
def logging_level?(level)
|
21
|
-
!disabled && self.class.log_level?(level, log_level)
|
22
|
-
end
|
23
|
-
|
24
|
-
def log(level, message)
|
25
|
-
self._log(level, message) if logging_level?(level)
|
26
|
-
end
|
27
|
-
|
28
|
-
def _log(level, message)
|
29
|
-
Kernel::warn(message)
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module Sass
|
2
|
-
module Logger
|
3
|
-
module LogLevel
|
4
|
-
|
5
|
-
def self.included(base)
|
6
|
-
base.extend(ClassMethods)
|
7
|
-
end
|
8
|
-
|
9
|
-
module ClassMethods
|
10
|
-
def inherited(subclass)
|
11
|
-
subclass.log_levels = subclass.superclass.log_levels.dup
|
12
|
-
end
|
13
|
-
|
14
|
-
def log_levels
|
15
|
-
@log_levels ||= {}
|
16
|
-
end
|
17
|
-
|
18
|
-
def log_levels=(levels)
|
19
|
-
@log_levels = levels
|
20
|
-
end
|
21
|
-
|
22
|
-
def log_level?(level, min_level)
|
23
|
-
log_levels[level] >= log_levels[min_level]
|
24
|
-
end
|
25
|
-
|
26
|
-
def log_level(name, options = {})
|
27
|
-
if options[:prepend]
|
28
|
-
level = log_levels.values.min
|
29
|
-
level = level.nil? ? 0 : level - 1
|
30
|
-
else
|
31
|
-
level = log_levels.values.max
|
32
|
-
level = level.nil? ? 0 : level + 1
|
33
|
-
end
|
34
|
-
log_levels.update(name => level)
|
35
|
-
define_logger(name)
|
36
|
-
end
|
37
|
-
|
38
|
-
def define_logger(name, options = {})
|
39
|
-
class_eval %Q{
|
40
|
-
def #{name}(message)
|
41
|
-
#{options.fetch(:to, :log)}(#{name.inspect}, message)
|
42
|
-
end
|
43
|
-
}
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
# A visitor for copying the full structure of a Sass tree.
|
2
|
-
class Sass::Tree::Visitors::DeepCopy < Sass::Tree::Visitors::Base
|
3
|
-
protected
|
4
|
-
|
5
|
-
def visit(node)
|
6
|
-
super(node.dup)
|
7
|
-
end
|
8
|
-
|
9
|
-
def visit_children(parent)
|
10
|
-
parent.children = parent.children.map {|c| visit(c)}
|
11
|
-
parent
|
12
|
-
end
|
13
|
-
|
14
|
-
def visit_debug(node)
|
15
|
-
node.expr = node.expr.deep_copy
|
16
|
-
yield
|
17
|
-
end
|
18
|
-
|
19
|
-
def visit_each(node)
|
20
|
-
node.list = node.list.deep_copy
|
21
|
-
yield
|
22
|
-
end
|
23
|
-
|
24
|
-
def visit_extend(node)
|
25
|
-
node.selector = node.selector.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
26
|
-
yield
|
27
|
-
end
|
28
|
-
|
29
|
-
def visit_for(node)
|
30
|
-
node.from = node.from.deep_copy
|
31
|
-
node.to = node.to.deep_copy
|
32
|
-
yield
|
33
|
-
end
|
34
|
-
|
35
|
-
def visit_function(node)
|
36
|
-
node.args = node.args.map {|k, v| [k.deep_copy, v && v.deep_copy]}
|
37
|
-
yield
|
38
|
-
end
|
39
|
-
|
40
|
-
def visit_if(node)
|
41
|
-
node.expr = node.expr.deep_copy if node.expr
|
42
|
-
node.else = visit(node.else) if node.else
|
43
|
-
yield
|
44
|
-
end
|
45
|
-
|
46
|
-
def visit_mixindef(node)
|
47
|
-
node.args = node.args.map {|k, v| [k.deep_copy, v && v.deep_copy]}
|
48
|
-
yield
|
49
|
-
end
|
50
|
-
|
51
|
-
def visit_mixin(node)
|
52
|
-
node.args = node.args.map {|a| a.deep_copy}
|
53
|
-
node.keywords = Hash[node.keywords.map {|k, v| [k, v.deep_copy]}]
|
54
|
-
yield
|
55
|
-
end
|
56
|
-
|
57
|
-
def visit_prop(node)
|
58
|
-
node.name = node.name.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
59
|
-
node.value = node.value.deep_copy
|
60
|
-
yield
|
61
|
-
end
|
62
|
-
|
63
|
-
def visit_return(node)
|
64
|
-
node.expr = node.expr.deep_copy
|
65
|
-
yield
|
66
|
-
end
|
67
|
-
|
68
|
-
def visit_rule(node)
|
69
|
-
node.rule = node.rule.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
70
|
-
yield
|
71
|
-
end
|
72
|
-
|
73
|
-
def visit_variable(node)
|
74
|
-
node.expr = node.expr.deep_copy
|
75
|
-
yield
|
76
|
-
end
|
77
|
-
|
78
|
-
def visit_warn(node)
|
79
|
-
node.expr = node.expr.deep_copy
|
80
|
-
yield
|
81
|
-
end
|
82
|
-
|
83
|
-
def visit_while(node)
|
84
|
-
node.expr = node.expr.deep_copy
|
85
|
-
yield
|
86
|
-
end
|
87
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# A visitor for performing selector inheritance on a static CSS tree.
|
2
|
-
#
|
3
|
-
# Destructively modifies the tree.
|
4
|
-
class Sass::Tree::Visitors::Extend < Sass::Tree::Visitors::Base
|
5
|
-
# @param root [Tree::Node] The root node of the tree to visit.
|
6
|
-
# @param extends [Sass::Util::SubsetMap{Selector::Simple =>
|
7
|
-
# Sass::Tree::Visitors::Cssize::Extend}]
|
8
|
-
# The extensions to perform on this tree.
|
9
|
-
# @return [Object] The return value of \{#visit} for the root node.
|
10
|
-
def self.visit(root, extends)
|
11
|
-
return if extends.empty?
|
12
|
-
new(extends).send(:visit, root)
|
13
|
-
end
|
14
|
-
|
15
|
-
protected
|
16
|
-
|
17
|
-
def initialize(extends)
|
18
|
-
@parent_directives = []
|
19
|
-
@extends = extends
|
20
|
-
end
|
21
|
-
|
22
|
-
# If an exception is raised, this adds proper metadata to the backtrace.
|
23
|
-
def visit(node)
|
24
|
-
super(node)
|
25
|
-
rescue Sass::SyntaxError => e
|
26
|
-
e.modify_backtrace(:filename => node.filename, :line => node.line)
|
27
|
-
raise e
|
28
|
-
end
|
29
|
-
|
30
|
-
# Keeps track of the current parent directives.
|
31
|
-
def visit_children(parent)
|
32
|
-
@parent_directives.push parent if parent.is_a?(Sass::Tree::DirectiveNode)
|
33
|
-
super
|
34
|
-
ensure
|
35
|
-
@parent_directives.pop if parent.is_a?(Sass::Tree::DirectiveNode)
|
36
|
-
end
|
37
|
-
|
38
|
-
# Applies the extend to a single rule's selector.
|
39
|
-
def visit_rule(node)
|
40
|
-
node.resolved_rules = node.resolved_rules.do_extend(@extends, @parent_directives)
|
41
|
-
end
|
42
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
# A visitor for setting options on the Sass tree
|
2
|
-
class Sass::Tree::Visitors::SetOptions < Sass::Tree::Visitors::Base
|
3
|
-
# @param root [Tree::Node] The root node of the tree to visit.
|
4
|
-
# @param options [{Symbol => Object}] The options has to set.
|
5
|
-
def self.visit(root, options); new(options).send(:visit, root); end
|
6
|
-
|
7
|
-
protected
|
8
|
-
|
9
|
-
def initialize(options)
|
10
|
-
@options = options
|
11
|
-
end
|
12
|
-
|
13
|
-
def visit(node)
|
14
|
-
node.instance_variable_set('@options', @options)
|
15
|
-
super
|
16
|
-
end
|
17
|
-
|
18
|
-
def visit_debug(node)
|
19
|
-
node.expr.options = @options
|
20
|
-
yield
|
21
|
-
end
|
22
|
-
|
23
|
-
def visit_each(node)
|
24
|
-
node.list.options = @options
|
25
|
-
yield
|
26
|
-
end
|
27
|
-
|
28
|
-
def visit_extend(node)
|
29
|
-
node.selector.each {|c| c.options = @options if c.is_a?(Sass::Script::Node)}
|
30
|
-
yield
|
31
|
-
end
|
32
|
-
|
33
|
-
def visit_for(node)
|
34
|
-
node.from.options = @options
|
35
|
-
node.to.options = @options
|
36
|
-
yield
|
37
|
-
end
|
38
|
-
|
39
|
-
def visit_function(node)
|
40
|
-
node.args.each do |k, v|
|
41
|
-
k.options = @options
|
42
|
-
v.options = @options if v
|
43
|
-
end
|
44
|
-
yield
|
45
|
-
end
|
46
|
-
|
47
|
-
def visit_if(node)
|
48
|
-
node.expr.options = @options if node.expr
|
49
|
-
visit(node.else) if node.else
|
50
|
-
yield
|
51
|
-
end
|
52
|
-
|
53
|
-
def visit_mixindef(node)
|
54
|
-
node.args.each do |k, v|
|
55
|
-
k.options = @options
|
56
|
-
v.options = @options if v
|
57
|
-
end
|
58
|
-
yield
|
59
|
-
end
|
60
|
-
|
61
|
-
def visit_mixin(node)
|
62
|
-
node.args.each {|a| a.options = @options}
|
63
|
-
node.keywords.each {|k, v| v.options = @options}
|
64
|
-
yield
|
65
|
-
end
|
66
|
-
|
67
|
-
def visit_prop(node)
|
68
|
-
node.name.each {|c| c.options = @options if c.is_a?(Sass::Script::Node)}
|
69
|
-
node.value.options = @options
|
70
|
-
yield
|
71
|
-
end
|
72
|
-
|
73
|
-
def visit_return(node)
|
74
|
-
node.expr.options = @options
|
75
|
-
yield
|
76
|
-
end
|
77
|
-
|
78
|
-
def visit_rule(node)
|
79
|
-
node.rule.each {|c| c.options = @options if c.is_a?(Sass::Script::Node)}
|
80
|
-
yield
|
81
|
-
end
|
82
|
-
|
83
|
-
def visit_variable(node)
|
84
|
-
node.expr.options = @options
|
85
|
-
yield
|
86
|
-
end
|
87
|
-
|
88
|
-
def visit_warn(node)
|
89
|
-
node.expr.options = @options
|
90
|
-
yield
|
91
|
-
end
|
92
|
-
|
93
|
-
def visit_while(node)
|
94
|
-
node.expr.options = @options
|
95
|
-
yield
|
96
|
-
end
|
97
|
-
end
|
@@ -1,134 +0,0 @@
|
|
1
|
-
require 'strscan'
|
2
|
-
|
3
|
-
if Sass::Util.ruby1_8?
|
4
|
-
Sass::Util::MultibyteStringScanner = StringScanner
|
5
|
-
else
|
6
|
-
# A wrapper of the native StringScanner class that works correctly with
|
7
|
-
# multibyte character encodings. The native class deals only in bytes, not
|
8
|
-
# characters, for methods like [#pos] and [#matched_size]. This class deals
|
9
|
-
# only in characters, instead.
|
10
|
-
class Sass::Util::MultibyteStringScanner < StringScanner
|
11
|
-
def self.new(str)
|
12
|
-
return StringScanner.new(str) if str.ascii_only?
|
13
|
-
super
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize(str)
|
17
|
-
super
|
18
|
-
@mb_pos = 0
|
19
|
-
@mb_matched_size = nil
|
20
|
-
@mb_last_pos = nil
|
21
|
-
end
|
22
|
-
|
23
|
-
alias_method :byte_pos, :pos
|
24
|
-
alias_method :byte_matched_size, :matched_size
|
25
|
-
|
26
|
-
def check(pattern); _match super; end
|
27
|
-
def check_until(pattern); _matched super; end
|
28
|
-
def getch; _forward _match super; end
|
29
|
-
def match?(pattern); _size check(pattern); end
|
30
|
-
def matched_size; @mb_matched_size; end
|
31
|
-
def peek(len); string[@mb_pos, len]; end
|
32
|
-
alias_method :peep, :peek
|
33
|
-
def pos; @mb_pos; end
|
34
|
-
alias_method :pointer, :pos
|
35
|
-
def rest_size; rest.size; end
|
36
|
-
def scan(pattern); _forward _match super; end
|
37
|
-
def scan_until(pattern); _forward _matched super; end
|
38
|
-
def skip(pattern); _size scan(pattern); end
|
39
|
-
def skip_until(pattern); _matched _size scan_until(pattern); end
|
40
|
-
|
41
|
-
def get_byte
|
42
|
-
raise "MultibyteStringScanner doesn't support #get_byte."
|
43
|
-
end
|
44
|
-
|
45
|
-
def getbyte
|
46
|
-
raise "MultibyteStringScanner doesn't support #getbyte."
|
47
|
-
end
|
48
|
-
|
49
|
-
def pos=(n)
|
50
|
-
@mb_last_pos = nil
|
51
|
-
|
52
|
-
# We set position kind of a lot during parsing, so we want it to be as
|
53
|
-
# efficient as possible. This is complicated by the fact that UTF-8 is a
|
54
|
-
# variable-length encoding, so it's difficult to find the byte length that
|
55
|
-
# corresponds to a given character length.
|
56
|
-
#
|
57
|
-
# Our heuristic here is to try to count the fewest possible characters. So
|
58
|
-
# if the new position is close to the current one, just count the
|
59
|
-
# characters between the two; if the new position is closer to the
|
60
|
-
# beginning of the string, just count the characters from there.
|
61
|
-
if @mb_pos - n < @mb_pos / 2
|
62
|
-
# New position is close to old position
|
63
|
-
byte_delta = @mb_pos > n ? -string[n...@mb_pos].bytesize : string[@mb_pos...n].bytesize
|
64
|
-
super(byte_pos + byte_delta)
|
65
|
-
else
|
66
|
-
# New position is close to BOS
|
67
|
-
super(string[0...n].bytesize)
|
68
|
-
end
|
69
|
-
@mb_pos = n
|
70
|
-
end
|
71
|
-
|
72
|
-
def reset
|
73
|
-
@mb_pos = 0
|
74
|
-
@mb_matched_size = nil
|
75
|
-
@mb_last_pos = nil
|
76
|
-
super
|
77
|
-
end
|
78
|
-
|
79
|
-
def scan_full(pattern, advance_pointer_p, return_string_p)
|
80
|
-
res = _match super(pattern, advance_pointer_p, true)
|
81
|
-
_forward res if advance_pointer_p
|
82
|
-
return res if return_string_p
|
83
|
-
end
|
84
|
-
|
85
|
-
def search_full(pattern, advance_pointer_p, return_string_p)
|
86
|
-
res = super(pattern, advance_pointer_p, true)
|
87
|
-
_forward res if advance_pointer_p
|
88
|
-
_matched((res if return_string_p))
|
89
|
-
end
|
90
|
-
|
91
|
-
def string=(str)
|
92
|
-
@mb_pos = 0
|
93
|
-
@mb_matched_size = nil
|
94
|
-
@mb_last_pos = nil
|
95
|
-
super
|
96
|
-
end
|
97
|
-
|
98
|
-
def terminate
|
99
|
-
@mb_pos = string.size
|
100
|
-
@mb_matched_size = nil
|
101
|
-
@mb_last_pos = nil
|
102
|
-
super
|
103
|
-
end
|
104
|
-
alias_method :clear, :terminate
|
105
|
-
|
106
|
-
def unscan
|
107
|
-
super
|
108
|
-
@mb_pos = @mb_last_pos
|
109
|
-
@mb_last_pos = @mb_matched_size = nil
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
def _size(str)
|
115
|
-
str && str.size
|
116
|
-
end
|
117
|
-
|
118
|
-
def _match(str)
|
119
|
-
@mb_matched_size = str && str.size
|
120
|
-
str
|
121
|
-
end
|
122
|
-
|
123
|
-
def _matched(res)
|
124
|
-
_match matched
|
125
|
-
res
|
126
|
-
end
|
127
|
-
|
128
|
-
def _forward(str)
|
129
|
-
@mb_last_pos = @mb_pos
|
130
|
-
@mb_pos += str.size if str
|
131
|
-
str
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|