xass 0.1.7 → 0.1.8
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.
- 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
|