csspool 4.0.0.pre → 4.0.0

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