xass 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/xass.rb +87 -47
  3. data/xass.gemspec +1 -1
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7b044d4a6f6730febb95f58b9872dc517e6f4e51
4
- data.tar.gz: 497c12e9e260784ebc86b68077225c3440d4bdf9
3
+ metadata.gz: 1379c927e3705f0b1b043c71175479304ad30d03
4
+ data.tar.gz: 2f7fcce9680f8c8eb9ec60a9edb0e6e21da10647
5
5
  SHA512:
6
- metadata.gz: d8c98242b7f1a2a5061c05e1e7819e451ae4bb0260d70fcbd18a2177c20f358c2a0cc9767dc63f67585b0596fac3aad81f73ae85fa68ab2f923526c6323e28ed
7
- data.tar.gz: a2f0bc1b8a818fe7c6881f13346cf83161ebf429be6c95cba2f7ac327488f06ce3e31fb748e626ec87528f7d9c53f9d98abf7a31d9ba5f9057387075ab701a33
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
- module Tree
5
- class RootNode
6
- alias :old_render :render
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
- def render
9
- old_render.split('/*').map { |x|
10
- next x unless x.match(/^ line [0-9]+, /)
11
- a, b = x.split("\n", 2)
12
- m = a.match(/\/app\/assets\/stylesheets\/([^. ]+)\./)
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
- private
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
- def class_replaced_selector(selector, class_prefix)
22
- doc = CSSPool.CSS("#{selector} {}")
23
- replace_class(doc, class_prefix)
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
- def class_prefix(name)
28
- names = name.split('/')
29
- names = names[1..(names.index { |x| x.start_with?('!') } || -1)]
30
- names.join('__')
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
- def replace_class(doc, class_prefix)
34
- doc.rule_sets[0].selectors.map do |selector|
35
- selector.simple_selectors.each do |simple_selector|
36
- simple_selector.additional_selectors.each do |additional_selector|
37
- case additional_selector
38
- when CSSPool::Selectors::Class
39
- additional_selector.name = extended_selector(class_prefix, additional_selector.name)
40
- when CSSPool::Selectors::PseudoClass
41
- next unless additional_selector.extra
42
- extra = class_replaced_selector(additional_selector.extra, class_prefix) rescue nil
43
- additional_selector.extra = extra if extra
44
- end
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
- def doc_to_selector(doc)
51
- doc.to_css.split("\n")[0][0...-1].strip.gsub(/\\[0-9a-f]{6}/) do |c|
52
- [c[1..-1].tr('0', '').to_i(16)].pack('U')
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
- def extended_selector(class_prefix, klass)
57
- if klass == 'root'
58
- class_prefix
59
- elsif klass.start_with?('_')
60
- klass[1..-1]
61
- else
62
- "#{class_prefix}___#{klass}"
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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'xass'
3
- s.version = '0.1.7'
3
+ s.version = '0.1.8'
4
4
  s.authors = ['Tetsuri Moriya']
5
5
  s.email = ['tetsuri.moriya@gmail.com']
6
6
  s.summary = 'Sass namespace extension'
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.7
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-01 00:00:00.000000000 Z
11
+ date: 2014-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec