xass 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/xass.rb +87 -47
- data/xass.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1379c927e3705f0b1b043c71175479304ad30d03
|
4
|
+
data.tar.gz: 2f7fcce9680f8c8eb9ec60a9edb0e6e21da10647
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65808d49586c48ae14721767581591bc76b604fb0dd1f1c065ea92f8e59c1a27c1795fa8c094372dbedd2ff671b4dc3d89d709faf97d3c9392944446b3deb61d
|
7
|
+
data.tar.gz: c0862d2067d4328c79e06ae1d4b5ff2ca2f6c3846c145bea648b0bcfeff09d622aa7a25a89e5085522f3e761dbc6555ad2c1e6e807b54b67343d94ea7f8e20ef
|
data/lib/xass.rb
CHANGED
@@ -1,66 +1,106 @@
|
|
1
1
|
require_relative 'initialize'
|
2
2
|
|
3
|
-
module Sass
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Sass::Tree
|
4
|
+
class Visitors::Perform
|
5
|
+
def visit_mixin(node)
|
6
|
+
include_loop = true
|
7
|
+
handle_include_loop!(node) if @stack.any? {|e| e[:name] == node.name}
|
8
|
+
include_loop = false
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
next "#{a}\n#{b}" unless m
|
14
|
-
selector = class_replaced_selector(b.split("\n")[0].strip[0...-1].strip, class_prefix(m[1]))
|
15
|
-
"#{a}\n#{selector} {\n#{b.split("\n", 2)[1]}"
|
16
|
-
}.join('/*')
|
10
|
+
@stack.push(:filename => node.filename, :line => node.line, :name => node.name)
|
11
|
+
raise Sass::SyntaxError.new("Undefined mixin '#{node.name}'.") unless mixin = @environment.mixin(node.name)
|
12
|
+
|
13
|
+
if node.children.any? && !mixin.has_content
|
14
|
+
raise Sass::SyntaxError.new(%Q{Mixin "#{node.name}" does not accept a content block.})
|
17
15
|
end
|
18
16
|
|
19
|
-
|
17
|
+
args = node.args.map {|a| a.perform(@environment)}
|
18
|
+
keywords = Sass::Util.map_hash(node.keywords) {|k, v| [k, v.perform(@environment)]}
|
19
|
+
splat = node.splat.perform(@environment) if node.splat
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
doc_to_selector(doc)
|
25
|
-
end
|
21
|
+
self.class.perform_arguments(mixin, args, keywords, splat) do |env|
|
22
|
+
env.caller = Sass::Environment.new(@environment)
|
23
|
+
env.content = node.children if node.has_children
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
trace_node = Sass::Tree::TraceNode.from_node(node.name, node)
|
26
|
+
with_environment(env) {
|
27
|
+
trace_node.children = mixin.tree.map {|c|
|
28
|
+
d = c.dup
|
29
|
+
d.filename = node.filename
|
30
|
+
visit(d)
|
31
|
+
}.flatten
|
32
|
+
}
|
33
|
+
trace_node
|
34
|
+
end
|
35
|
+
rescue Sass::SyntaxError => e
|
36
|
+
unless include_loop
|
37
|
+
e.modify_backtrace(:mixin => node.name, :line => node.line)
|
38
|
+
e.add_backtrace(:line => node.line)
|
31
39
|
end
|
40
|
+
raise e
|
41
|
+
ensure
|
42
|
+
@stack.pop unless include_loop
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class RootNode
|
47
|
+
alias :old_render :render
|
48
|
+
|
49
|
+
def render
|
50
|
+
old_render.split('/*').map { |x|
|
51
|
+
next x unless x.match(/^ line [0-9]+, /)
|
52
|
+
a, b = x.split("\n", 2)
|
53
|
+
m = a.match(/\/app\/assets\/stylesheets\/([^. ]+)\./)
|
54
|
+
next "#{a}\n#{b}" unless m
|
55
|
+
selector = class_replaced_selector(b.split("\n")[0].strip[0...-1].strip, class_prefix(m[1]))
|
56
|
+
"#{a}\n#{selector} {\n#{b.split("\n", 2)[1]}"
|
57
|
+
}.join('/*')
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
32
61
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
62
|
+
def class_replaced_selector(selector, class_prefix)
|
63
|
+
doc = CSSPool.CSS("#{selector} {}")
|
64
|
+
replace_class(doc, class_prefix)
|
65
|
+
doc_to_selector(doc)
|
66
|
+
end
|
67
|
+
|
68
|
+
def class_prefix(name)
|
69
|
+
names = name.split('/')
|
70
|
+
names = names[1..(names.index { |x| x.start_with?('!') } || -1)]
|
71
|
+
names.join('__')
|
72
|
+
end
|
73
|
+
|
74
|
+
def replace_class(doc, class_prefix)
|
75
|
+
doc.rule_sets[0].selectors.map do |selector|
|
76
|
+
selector.simple_selectors.each do |simple_selector|
|
77
|
+
simple_selector.additional_selectors.each do |additional_selector|
|
78
|
+
case additional_selector
|
79
|
+
when CSSPool::Selectors::Class
|
80
|
+
additional_selector.name = extended_selector(class_prefix, additional_selector.name)
|
81
|
+
when CSSPool::Selectors::PseudoClass
|
82
|
+
next unless additional_selector.extra
|
83
|
+
extra = class_replaced_selector(additional_selector.extra, class_prefix) rescue nil
|
84
|
+
additional_selector.extra = extra if extra
|
45
85
|
end
|
46
86
|
end
|
47
87
|
end
|
48
88
|
end
|
89
|
+
end
|
49
90
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
91
|
+
def doc_to_selector(doc)
|
92
|
+
doc.to_css.split("\n")[0][0...-1].strip.gsub(/\\[0-9a-f]{6}/) do |c|
|
93
|
+
[c[1..-1].tr('0', '').to_i(16)].pack('U')
|
54
94
|
end
|
95
|
+
end
|
55
96
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
end
|
97
|
+
def extended_selector(class_prefix, klass)
|
98
|
+
if klass == 'root'
|
99
|
+
class_prefix
|
100
|
+
elsif klass.start_with?('_')
|
101
|
+
klass[1..-1]
|
102
|
+
else
|
103
|
+
"#{class_prefix}___#{klass}"
|
64
104
|
end
|
65
105
|
end
|
66
106
|
end
|
data/xass.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tetsuri Moriya
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|