csspool 4.0.0.pre → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.rdoc +12 -0
  3. data/Gemfile.lock +6 -6
  4. data/Manifest.txt +10 -2
  5. data/Rakefile +1 -0
  6. data/lib/csspool/css/declaration.rb +1 -1
  7. data/lib/csspool/css/document.rb +5 -1
  8. data/lib/csspool/css/document_handler.rb +43 -11
  9. data/lib/csspool/css/fontface_rule.rb +13 -0
  10. data/lib/csspool/css/import_rule.rb +0 -5
  11. data/lib/csspool/css/media_feature.rb +14 -0
  12. data/lib/csspool/css/media_query.rb +19 -0
  13. data/lib/csspool/css/media_query_list.rb +41 -0
  14. data/lib/csspool/css/{media.rb → media_type.rb} +6 -4
  15. data/lib/csspool/css/parser.rb +1272 -671
  16. data/lib/csspool/css/parser.y +223 -53
  17. data/lib/csspool/css/rule_set.rb +4 -3
  18. data/lib/csspool/css/supports_rule.rb +14 -0
  19. data/lib/csspool/css/tokenizer.rb +92 -16
  20. data/lib/csspool/css/tokenizer.rex +42 -19
  21. data/lib/csspool/css.rb +6 -1
  22. data/lib/csspool/node.rb +22 -0
  23. data/lib/csspool/selector.rb +5 -4
  24. data/lib/csspool/selectors/pseudo.rb +2 -2
  25. data/lib/csspool/terms/function.rb +1 -1
  26. data/lib/csspool/terms/resolution.rb +13 -0
  27. data/lib/csspool/terms.rb +1 -0
  28. data/lib/csspool/visitors/children.rb +16 -2
  29. data/lib/csspool/visitors/comparable.rb +27 -8
  30. data/lib/csspool/visitors/iterator.rb +5 -3
  31. data/lib/csspool/visitors/to_css.rb +73 -20
  32. data/test/css/test_document_query.rb +37 -38
  33. data/test/css/test_font_face.rb +16 -0
  34. data/test/css/test_import_rule.rb +0 -3
  35. data/test/css/test_media_rule.rb +92 -0
  36. data/test/css/test_node_position.rb +81 -0
  37. data/test/css/test_parser.rb +12 -39
  38. data/test/css/test_supports_rule.rb +133 -0
  39. data/test/css/test_tokenizer.rb +4 -4
  40. data/test/css/test_variables.rb +33 -0
  41. data/test/helper.rb +3 -3
  42. data/test/sac/test_parser.rb +1 -0
  43. data/test/test_parser.rb +22 -9
  44. data/test/test_selector.rb +44 -4
  45. data/test/test_term.rb +29 -0
  46. data/test/visitors/test_comparable.rb +8 -0
  47. data/test/visitors/test_to_css.rb +89 -13
  48. metadata +54 -58
  49. data/test/_local_helper.rb +0 -2
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 78a85df3fe179c10647db55fdae56a52458d191c
4
+ data.tar.gz: 316c13064d6a93280dc4a2ab4b785ddc2e62607f
5
+ SHA512:
6
+ metadata.gz: d472fdf6210e101fde9d8a1c21c5ec10229f8587f06e20878c08d337748e0a671eadeb66d82503739f54c3c32d62670d46824656987d7a3e05422e719d2120be
7
+ data.tar.gz: 1a96b768e988dc4330cefa5bb51dfe108771204c28e9b8c64be4983d7f4c925368b2c100331b6cca9991328e4b34ff3bfc46156be6d49b4bee2c052ea0d79fa4
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,15 @@
1
+ == 4.0.0
2
+
3
+ * New Features
4
+
5
+ * Support for parsing many new CSS features, including `:not`, `calc`, and `@supports`.
6
+ * Line number and context in parser error messages
7
+ * Some nodes types will remember their start and end positions, allowing developers to retrieve their original code.
8
+
9
+ * Bugfixes
10
+
11
+ * Updated parsing for unusual syntax.
12
+
1
13
  == 3.0.2
2
14
 
3
15
  * New Features
data/Gemfile.lock CHANGED
@@ -1,17 +1,17 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- hoe (3.0.4)
5
- rake (~> 0.8)
6
- hoe-bundler (1.1.0)
4
+ hoe (3.4.0)
5
+ rake (>= 0.8, < 11.0)
6
+ hoe-bundler (1.2.0)
7
7
  hoe (>= 2.2.0)
8
8
  hoe-gemspec (1.0.0)
9
9
  hoe (>= 2.2.0)
10
10
  hoe-git (1.5.0)
11
11
  hoe (>= 2.2.0)
12
- json (1.7.0)
13
- racc (1.4.8)
14
- rake (0.9.2.2)
12
+ json (1.7.7)
13
+ racc (1.4.9)
14
+ rake (10.0.3)
15
15
  rdoc (3.12)
16
16
  json (~> 1.4)
17
17
  rexical (1.0.5)
data/Manifest.txt CHANGED
@@ -13,14 +13,19 @@ lib/csspool/css/declaration.rb
13
13
  lib/csspool/css/document.rb
14
14
  lib/csspool/css/document_handler.rb
15
15
  lib/csspool/css/document_query.rb
16
+ lib/csspool/css/fontface_rule.rb
16
17
  lib/csspool/css/import_rule.rb
17
18
  lib/csspool/css/keyframes_block.rb
18
19
  lib/csspool/css/keyframes_rule.rb
19
- lib/csspool/css/media.rb
20
+ lib/csspool/css/media_feature.rb
21
+ lib/csspool/css/media_query.rb
22
+ lib/csspool/css/media_query_list.rb
23
+ lib/csspool/css/media_type.rb
20
24
  lib/csspool/css/namespace_rule.rb
21
25
  lib/csspool/css/parser.rb
22
26
  lib/csspool/css/parser.y
23
27
  lib/csspool/css/rule_set.rb
28
+ lib/csspool/css/supports_rule.rb
24
29
  lib/csspool/css/tokenizer.rb
25
30
  lib/csspool/css/tokenizer.rex
26
31
  lib/csspool/node.rb
@@ -45,6 +50,7 @@ lib/csspool/terms/hash.rb
45
50
  lib/csspool/terms/ident.rb
46
51
  lib/csspool/terms/math.rb
47
52
  lib/csspool/terms/number.rb
53
+ lib/csspool/terms/resolution.rb
48
54
  lib/csspool/terms/rgb.rb
49
55
  lib/csspool/terms/string.rb
50
56
  lib/csspool/terms/uri.rb
@@ -54,13 +60,15 @@ lib/csspool/visitors/comparable.rb
54
60
  lib/csspool/visitors/iterator.rb
55
61
  lib/csspool/visitors/to_css.rb
56
62
  lib/csspool/visitors/visitor.rb
57
- test/_local_helper.rb
58
63
  test/css/test_document.rb
59
64
  test/css/test_document_query.rb
65
+ test/css/test_font_face.rb
60
66
  test/css/test_import_rule.rb
61
67
  test/css/test_keyframes_rule.rb
68
+ test/css/test_media_rule.rb
62
69
  test/css/test_namespace_rule.rb
63
70
  test/css/test_parser.rb
71
+ test/css/test_supports_rule.rb
64
72
  test/css/test_tokenizer.rb
65
73
  test/files/test.css
66
74
  test/helper.rb
data/Rakefile CHANGED
@@ -16,6 +16,7 @@ Hoe.spec('csspool') do
16
16
  self.readme_file = 'README.rdoc'
17
17
  self.history_file = 'CHANGELOG.rdoc'
18
18
  self.extra_rdoc_files = FileList['*.rdoc']
19
+ self.licenses = ['MIT']
19
20
 
20
21
  %w{racc rexical hoe-git hoe-gemspec hoe-bundler}.each do |dep|
21
22
  self.extra_dev_deps << [dep, '>= 0']
@@ -8,7 +8,7 @@ module CSSPool
8
8
 
9
9
  alias :important? :important
10
10
 
11
- def initialize property, expressions, important, rule_set
11
+ def initialize property, expressions, important, rule_set = nil
12
12
  @property = property
13
13
  @expressions = expressions
14
14
  @important = important
@@ -22,25 +22,29 @@ module CSSPool
22
22
  attr_accessor :charsets
23
23
  attr_accessor :import_rules
24
24
  attr_accessor :document_queries
25
+ attr_accessor :supports_rules
25
26
  attr_accessor :namespaces
26
27
  attr_accessor :parent
27
28
  attr_accessor :parent_import_rule
28
29
  attr_accessor :keyframes_rules
30
+ attr_accessor :fontface_rules
29
31
 
30
32
  def initialize
31
33
  @rule_sets = []
32
34
  @charsets = []
33
35
  @import_rules = []
34
36
  @document_queries = []
37
+ @supports_rules = []
35
38
  @namespaces = []
36
39
  @parent = nil
37
40
  @parent_import_rule = nil
38
41
  @keyframes_rules = []
42
+ @fontface_rules = []
39
43
  end
40
44
 
41
45
  def [] selector
42
46
  selectors = CSSPool.CSS("#{selector} {}").rule_sets.first.selectors
43
- rule_sets.find_all { |rs| rs.selectors == selectors}
47
+ rule_sets.find_all { |rs| rs.selectors == selectors }
44
48
  end
45
49
  end
46
50
  end
@@ -2,11 +2,13 @@ module CSSPool
2
2
  module CSS
3
3
  class DocumentHandler < CSSPool::SAC::Document
4
4
  attr_accessor :document
5
+ attr_accessor :node_start_pos
5
6
 
6
7
  def initialize
7
8
  @document = nil
8
9
  @conditional_stack = []
9
10
  @active_keyframes_block = nil
11
+ @active_fontface_rule = nil
10
12
  end
11
13
 
12
14
  def start_document
@@ -17,11 +19,11 @@ module CSSPool
17
19
  @document.charsets << CSS::Charset.new(name, location)
18
20
  end
19
21
 
20
- def import_style media_list, uri, ns = nil, loc = {}
22
+ def import_style media, uri, ns = nil, loc = {}
21
23
  @document.import_rules << CSS::ImportRule.new(
22
24
  uri,
23
25
  ns,
24
- media_list,
26
+ media,
25
27
  @document,
26
28
  loc
27
29
  )
@@ -38,32 +40,54 @@ module CSSPool
38
40
  rs = RuleSet.new(
39
41
  selector_list,
40
42
  [],
41
- @conditional_stack.last || []
43
+ @conditional_stack.last
42
44
  )
43
45
  @document.rule_sets << rs
44
46
  @conditional_stack.last.rule_sets << rs unless @conditional_stack.empty?
45
47
  end
46
48
 
47
- def property name, exp, important
48
- rs = @active_keyframes_block.nil? ? @document.rule_sets.last : @active_keyframes_block
49
- rs.declarations << Declaration.new(name, exp, important, rs)
49
+ def property declaration
50
+ if !@active_fontface_rule.nil?
51
+ rs = @active_fontface_rule
52
+ elsif !@active_keyframes_block.nil?
53
+ rs = @active_keyframes_block
54
+ else
55
+ rs = @document.rule_sets.last
56
+ end
57
+ declaration.rule_set = rs
58
+ rs.declarations << declaration
50
59
  end
51
60
 
52
- def start_media media_list, parse_location = {}
53
- @conditional_stack << CSS::Media.new(media_list, parse_location)
61
+ def start_media media_query_list
62
+ @conditional_stack << media_query_list
54
63
  end
55
64
 
56
- def end_media media_list, parse_location = {}
65
+ def end_media media_query_list
57
66
  @conditional_stack.pop
58
67
  end
59
68
 
60
- def start_document_query url_functions
69
+ def start_document_query url_functions, inner_start_pos = nil
61
70
  dq = CSS::DocumentQuery.new(url_functions)
71
+ dq.outer_start_pos = @node_start_pos
72
+ @node_start_pos = nil
73
+ dq.inner_start_pos = inner_start_pos
62
74
  @document.document_queries << dq
63
75
  @conditional_stack << dq
64
76
  end
65
77
 
66
- def end_document_query
78
+ def end_document_query inner_end_pos = nil, outer_end_pos = nil
79
+ last = @conditional_stack.pop
80
+ last.inner_end_pos = inner_end_pos
81
+ last.outer_end_pos = outer_end_pos
82
+ end
83
+
84
+ def start_supports conditions
85
+ sr = CSS::SupportsRule.new(conditions)
86
+ @document.supports_rules << sr
87
+ @conditional_stack << sr
88
+ end
89
+
90
+ def end_supports
67
91
  @conditional_stack.pop
68
92
  end
69
93
 
@@ -80,6 +104,14 @@ module CSSPool
80
104
  @active_keyframes_block = nil
81
105
  end
82
106
 
107
+ def start_fontface_rule
108
+ @active_fontface_rule = CSS::FontfaceRule.new
109
+ @document.fontface_rules << @active_fontface_rule
110
+ end
111
+
112
+ def end_fontface_rule
113
+ @active_fontface_rule = nil
114
+ end
83
115
  end
84
116
  end
85
117
  end
@@ -0,0 +1,13 @@
1
+ # Represents an @font-face rule
2
+ module CSSPool
3
+ module CSS
4
+ class FontfaceRule < CSSPool::Node
5
+
6
+ attr_accessor :declarations
7
+
8
+ def initialize
9
+ @declarations = []
10
+ end
11
+ end
12
+ end
13
+ end
@@ -19,11 +19,6 @@ module CSSPool
19
19
  new_doc = CSSPool.CSS(yield uri.value)
20
20
  new_doc.parent_import_rule = self
21
21
  new_doc.parent = document
22
- # we'll make a "fake" media rule if this import specified media to apply to the rulesets
23
- if !media_list.empty?
24
- media = CSS::Media.new(media_list, parse_location)
25
- new_doc.rule_sets.each { |rs| rs.media = media }
26
- end
27
22
  new_doc
28
23
  end
29
24
  end
@@ -0,0 +1,14 @@
1
+ module CSSPool
2
+ module CSS
3
+ class MediaFeature < CSSPool::Node
4
+ attr_accessor :property, :value
5
+ attr_accessor :parse_location
6
+
7
+ def initialize(property, value, parse_location = {})
8
+ @property = property
9
+ @value = value
10
+ @parse_location = parse_location
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ module CSSPool
2
+ module CSS
3
+ class MediaQuery < CSSPool::Node
4
+ attr_accessor :only_or_not, :media_expr, :and_exprs
5
+ attr_accessor :parse_location
6
+
7
+ def self.empty
8
+ new(nil, nil, [])
9
+ end
10
+
11
+ def initialize(only_or_not, media_expr, and_exprs, parse_location = {})
12
+ @only_or_not = only_or_not
13
+ @media_expr = media_expr
14
+ @and_exprs = and_exprs
15
+ @parse_location = parse_location
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,41 @@
1
+ module CSSPool
2
+ module CSS
3
+ class MediaQueryList < CSSPool::Node
4
+ attr_accessor :media_queries, :parse_location, :rule_sets
5
+
6
+ def initialize(media_queries = [], parse_location = {})
7
+ @media_queries = media_queries
8
+ @parse_location = parse_location
9
+ @rule_sets = []
10
+ end
11
+
12
+ def <<(media_query)
13
+ media_queries << media_query
14
+ self
15
+ end
16
+ alias push <<
17
+
18
+ def length
19
+ media_queries.length
20
+ end
21
+ alias size length
22
+
23
+ def first
24
+ media_queries.first
25
+ end
26
+
27
+ def last
28
+ media_queries.last
29
+ end
30
+
31
+ def [](idx)
32
+ media_queries[idx]
33
+ end
34
+
35
+ def inspect
36
+ media_queries.inspect
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -1,15 +1,17 @@
1
1
  module CSSPool
2
2
  module CSS
3
- class Media < CSSPool::Node
4
- attr_accessor :media_list
3
+ class MediaType < CSSPool::Node
4
+ attr_accessor :name
5
5
  attr_accessor :parse_location
6
6
  attr_accessor :rule_sets
7
7
 
8
- def initialize media_list, parse_location
9
- @media_list = media_list
8
+ def initialize(name, parse_location = {})
9
+ @name = name
10
10
  @parse_location = parse_location
11
11
  @rule_sets = []
12
12
  end
13
+
14
+ alias value name
13
15
  end
14
16
  end
15
17
  end