visionmedia-ass 0.0.2 → 0.0.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/History.rdoc CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.0.3 / 2009-01-19
2
+
3
+ * Minor performance improvements
4
+ * Minor refactoring
1
5
 
2
6
  === 0.0.1 / 2009-01-12
3
7
 
data/ass.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{ass}
5
- s.version = "0.0.2"
5
+ s.version = "0.0.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["TJ Holowaychuk"]
9
- s.date = %q{2009-01-15}
9
+ s.date = %q{2009-01-19}
10
10
  s.default_executable = %q{ass}
11
11
  s.description = %q{'Amazing Style Sheets'}
12
12
  s.email = %q{tj@vision-media.ca}
@@ -1,7 +1,50 @@
1
1
 
2
2
  $:.unshift File.dirname(__FILE__) + '/../lib/'
3
+
3
4
  require 'ass'
4
- require 'benchmark'
5
+ require 'rubygems'
6
+ require 'sass'
7
+ require 'rgauge'
8
+
9
+ large_sass = <<-SASS
10
+ =highlighted-background
11
+ background:
12
+ color: #fc0
13
+ =header-text
14
+ font:
15
+ size: 20px
16
+
17
+ =compound
18
+ +highlighted-background
19
+ +header-text
20
+
21
+ .page-title
22
+ +header-text
23
+ :padding 4px
24
+ :margin
25
+ :top 10px
26
+
27
+ #footer
28
+ :padding 0
29
+ :margin 15px 1px
30
+ :background red
31
+
32
+ .copyright < somethng
33
+ :color green
34
+
35
+ :hover
36
+ :background
37
+ :color red
38
+
39
+ body
40
+ :color #fff
41
+
42
+ a
43
+ :font
44
+ :size 12px
45
+ :family "Arial"
46
+ :weight bold
47
+ SASS
5
48
 
6
49
  large_ass = <<-ASS
7
50
  /* Inline comment
@@ -67,9 +110,8 @@ a
67
110
 
68
111
  ASS
69
112
 
70
- Benchmark.bm(15) do |x|
71
- x.report("60 lines") {
72
- Ass::Parser.parse(large_ass)
73
- }
113
+ benchmark 'Parsing Speed', :times => 20 do
114
+ report('Large Ass') { Ass::Parser.parse(large_ass) }
115
+ report('Large Sass') { Sass::Engine.new(large_sass).render }
74
116
  end
75
117
 
data/lib/ass/parser.rb CHANGED
@@ -20,7 +20,7 @@ module Ass
20
20
  PROPERTY = /^ *#{HYPHENATED_WORD}/
21
21
 
22
22
  attr_accessor :ass, :constants, :css
23
- alias :to_s :ass
23
+ alias :to_s :css
24
24
 
25
25
  def initialize ass = ''
26
26
  @ass, @css, @constants = ass, '', {}
@@ -32,64 +32,59 @@ module Ass
32
32
  last_selector = ''
33
33
  lines = @ass.split "\n"
34
34
  lines.each do |line|
35
- if line.match COMMENT
35
+
36
+ case line
37
+ when COMMENT
36
38
  @css << "/* #{$1.strip} */\n"
37
- elsif line.match CONSTANT_WITH_VALUE
38
- @constants[$1.to_sym] = $2
39
- elsif not in_block and line.match MIXIN
40
- in_mixin, in_block = $1, true
41
- elsif in_block and line.match MIXIN
42
- next if in_mixin
43
- @css << mixins[$1]
44
- elsif in_block and line.match BLANK
45
- in_block = false
46
- next if in_mixin
47
- @css << CLOSING_BRACE
48
- elsif line.match AT
49
- @css << line << "\n"
50
- elsif line.match BLANK or line.match ASS_COMMENT
51
- # Do nothing
52
- elsif not in_block and line.match SELECTOR
53
- in_block = true
54
- if sub_selector?($1, last_selector)
39
+ when MIXIN
40
+ if in_block
55
41
  next if in_mixin
56
- selector = join_selectors last_selector, $1.strip
57
- @css << selector << OPEN_BRACE
42
+ @css << mixins[$1]
58
43
  else
59
- in_mixin = false
60
- selector = $1.strip
61
- @css << selector << OPEN_BRACE
44
+ in_mixin, in_block = $1, true
62
45
  end
63
- last_selector = selector
64
- elsif line.match PROPERTY
65
- if mixin = in_mixin
66
- mixins[mixin] << format_property(line)
67
- else
68
- @css << format_property(line)
46
+ when CONSTANT_WITH_VALUE
47
+ @constants[$1.to_sym] = $2
48
+ when BLANK
49
+ if in_block
50
+ in_block = false
51
+ next if in_mixin
52
+ @css << CLOSING_BRACE
53
+ end
54
+ when AT
55
+ @css << line << "\n"
56
+ else
57
+ if not in_block and line.match SELECTOR
58
+ in_block = true
59
+ if nested_selector?($1, last_selector)
60
+ next if in_mixin
61
+ selector = splice_selectors last_selector, $1.strip
62
+ @css << selector << OPEN_BRACE
63
+ else
64
+ in_mixin = false
65
+ selector = $1.strip
66
+ @css << selector << OPEN_BRACE
67
+ end
68
+ last_selector = selector
69
+ elsif line.match PROPERTY
70
+ if mixin = in_mixin
71
+ mixins[mixin] << format_property(line)
72
+ else
73
+ @css << format_property(line)
74
+ end
69
75
  end
70
76
  end
71
77
  end
72
78
  self
73
79
  end
74
80
 
75
- def join_selectors selector_a, selector_b
76
- if selector_b[0,1] == ':'
77
- if selector_a.include? ','
78
- selector_a.split(',').collect { |selector| selector << selector_b }.join(',')
79
- else
80
- selector_a << selector_b
81
- end
82
- else
83
- if selector_a.include? ','
84
- selector_a.split(',').collect { |selector| selector << ' ' << selector_b }.join(',')
85
- else
86
- selector_a << ' ' << selector_b
87
- end
88
- end
81
+ def splice_selectors selector_a, selector_b
82
+ selector_b[0,0] = ' ' unless selector_b[0,1] == ':'
83
+ selector_a.strip.gsub(/([^,]+),/, "\\1#{selector_b},") << selector_b
89
84
  end
90
85
 
91
- def sub_selector? selector_a, selector_b
92
- true if indents_in(selector_a) > indents_in(selector_b)
86
+ def nested_selector? selector_a, selector_b
87
+ indents_in(selector_a) > indents_in(selector_b)
93
88
  end
94
89
 
95
90
  def indents_in string
@@ -98,9 +93,9 @@ module Ass
98
93
 
99
94
  def format_property line
100
95
  line.gsub! PROPERTY, ' \1:'
101
- line.gsub! CONSTANT do |constant|
102
- constant_sym = constant.gsub(':', '').to_sym
103
- @constants[constant_sym] || 'undefined_constant'
96
+ line.gsub! CONSTANT do |constant|
97
+ constant[0,1] = ''
98
+ @constants[constant.to_sym] || 'undefined_constant'
104
99
  end
105
100
  line << ";\n"
106
101
  end
data/lib/ass/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Ass
3
3
  module VERSION #:nodoc:
4
- MAJOR, MINOR, TINY = [0, 0, 2]
4
+ MAJOR, MINOR, TINY = [0, 0, 3]
5
5
  STRING = [MAJOR, MINOR, TINY].join '.'
6
6
  end
7
7
  end
@@ -12,15 +12,15 @@ describe Ass::Parser do
12
12
  end
13
13
 
14
14
  it "should determine sub selectors" do
15
- @parser.sub_selector?(' sub', 'primary').should be_true
16
- @parser.sub_selector?('primary', 'primary').should be_nil
15
+ @parser.nested_selector?(' sub', 'primary').should be_true
16
+ @parser.nested_selector?('primary', 'primary').should be_false
17
17
  end
18
18
 
19
- it "should join sub selectors" do
20
- @parser.join_selectors('a', ':hover').should == 'a:hover'
21
- @parser.join_selectors('h1', 'a').should == 'h1 a'
22
- @parser.join_selectors('h1, h2, h3', ':hover').should == 'h1:hover, h2:hover, h3:hover'
23
- @parser.join_selectors('h1, h2, h3', 'a').should == 'h1 a, h2 a, h3 a'
19
+ it "should splice sub selectors" do
20
+ @parser.splice_selectors('a', ':hover').should == 'a:hover'
21
+ @parser.splice_selectors('h1', 'a').should == 'h1 a'
22
+ @parser.splice_selectors('h1, h2, h3', ':hover').should == 'h1:hover, h2:hover, h3:hover'
23
+ @parser.splice_selectors('h1, h2, h3', 'a').should == 'h1 a, h2 a, h3 a'
24
24
  end
25
25
 
26
26
  it "should populate constants" do
@@ -35,6 +35,24 @@ describe Ass::Parser do
35
35
  @parser.constants[:tertiary_size].should == '9em'
36
36
  end
37
37
 
38
+ it "should populate output undefined constant" do
39
+ @parser.ass = <<-ASS.deindent
40
+ :color = #fff
41
+
42
+ body
43
+ background :color
44
+ font :font_size
45
+
46
+ ASS
47
+ @parser.parse!
48
+ @parser.css.should == <<-CSS.deindent
49
+ body {
50
+ background: #fff;
51
+ font: undefined_constant;
52
+ }
53
+ CSS
54
+ end
55
+
38
56
  it "should translate ass document from file" do
39
57
  Ass::Parser.parse_file(File.dirname(__FILE__) + '/../fixtures/test.ass').should == <<-ASS.deindent
40
58
  body.some-class {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: visionmedia-ass
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - TJ Holowaychuk
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-15 00:00:00 -08:00
12
+ date: 2009-01-19 00:00:00 -08:00
13
13
  default_executable: ass
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency