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.
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