maca-fork-csspool 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/CHANGELOG.rdoc +72 -0
  2. data/History.txt +4 -0
  3. data/Manifest.txt +70 -0
  4. data/README.rdoc +78 -0
  5. data/Rakefile +35 -0
  6. data/lib/csspool.rb +20 -0
  7. data/lib/csspool/collection.rb +50 -0
  8. data/lib/csspool/css.rb +7 -0
  9. data/lib/csspool/css/charset.rb +7 -0
  10. data/lib/csspool/css/declaration.rb +8 -0
  11. data/lib/csspool/css/document.rb +34 -0
  12. data/lib/csspool/css/document_handler.rb +51 -0
  13. data/lib/csspool/css/import_rule.rb +15 -0
  14. data/lib/csspool/css/media.rb +7 -0
  15. data/lib/csspool/css/rule_set.rb +12 -0
  16. data/lib/csspool/lib_croco.rb +78 -0
  17. data/lib/csspool/lib_croco/cr_additional_sel.rb +46 -0
  18. data/lib/csspool/lib_croco/cr_attr_sel.rb +16 -0
  19. data/lib/csspool/lib_croco/cr_doc_handler.rb +24 -0
  20. data/lib/csspool/lib_croco/cr_num.rb +13 -0
  21. data/lib/csspool/lib_croco/cr_parser.rb +11 -0
  22. data/lib/csspool/lib_croco/cr_parsing_location.rb +17 -0
  23. data/lib/csspool/lib_croco/cr_pseudo.rb +14 -0
  24. data/lib/csspool/lib_croco/cr_rgb.rb +18 -0
  25. data/lib/csspool/lib_croco/cr_selector.rb +33 -0
  26. data/lib/csspool/lib_croco/cr_simple_sel.rb +54 -0
  27. data/lib/csspool/lib_croco/cr_term.rb +97 -0
  28. data/lib/csspool/lib_croco/glist.rb +21 -0
  29. data/lib/csspool/node.rb +5 -0
  30. data/lib/csspool/sac.rb +2 -0
  31. data/lib/csspool/sac/document.rb +35 -0
  32. data/lib/csspool/sac/parser.rb +122 -0
  33. data/lib/csspool/selector.rb +35 -0
  34. data/lib/csspool/selectors.rb +8 -0
  35. data/lib/csspool/selectors/additional.rb +6 -0
  36. data/lib/csspool/selectors/attribute.rb +21 -0
  37. data/lib/csspool/selectors/class.rb +11 -0
  38. data/lib/csspool/selectors/id.rb +11 -0
  39. data/lib/csspool/selectors/pseudo_class.rb +13 -0
  40. data/lib/csspool/selectors/simple.rb +22 -0
  41. data/lib/csspool/selectors/type.rb +6 -0
  42. data/lib/csspool/selectors/universal.rb +6 -0
  43. data/lib/csspool/terms.rb +7 -0
  44. data/lib/csspool/terms/function.rb +17 -0
  45. data/lib/csspool/terms/hash.rb +6 -0
  46. data/lib/csspool/terms/ident.rb +15 -0
  47. data/lib/csspool/terms/number.rb +14 -0
  48. data/lib/csspool/terms/rgb.rb +23 -0
  49. data/lib/csspool/terms/string.rb +6 -0
  50. data/lib/csspool/terms/uri.rb +6 -0
  51. data/lib/csspool/visitable.rb +30 -0
  52. data/lib/csspool/visitors.rb +5 -0
  53. data/lib/csspool/visitors/children.rb +50 -0
  54. data/lib/csspool/visitors/comparable.rb +85 -0
  55. data/lib/csspool/visitors/iterator.rb +80 -0
  56. data/lib/csspool/visitors/to_css.rb +188 -0
  57. data/lib/csspool/visitors/visitor.rb +17 -0
  58. data/test/css/test_document.rb +13 -0
  59. data/test/css/test_import_rule.rb +42 -0
  60. data/test/helper.rb +67 -0
  61. data/test/sac/test_parser.rb +115 -0
  62. data/test/sac/test_properties.rb +43 -0
  63. data/test/sac/test_terms.rb +134 -0
  64. data/test/test_collection.rb +81 -0
  65. data/test/test_parser.rb +91 -0
  66. data/test/test_selector.rb +47 -0
  67. data/test/visitors/test_children.rb +20 -0
  68. data/test/visitors/test_comparable.rb +103 -0
  69. data/test/visitors/test_each.rb +19 -0
  70. data/test/visitors/test_to_css.rb +200 -0
  71. metadata +173 -0
@@ -0,0 +1,21 @@
1
+ module CSSPool
2
+ module LibCroco
3
+ class GList < FFI::Struct
4
+ layout(
5
+ :data, :pointer,
6
+ :next, :pointer,
7
+ :prev, :pointer
8
+ )
9
+
10
+ def to_a
11
+ list = [self]
12
+ pointer = list.last[:next]
13
+ until pointer.null?
14
+ list << GList.new(pointer)
15
+ pointer = list.last[:next]
16
+ end
17
+ list.map { |x| x[:data] }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ module CSSPool
2
+ class Node
3
+ include CSSPool::Visitable
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ require 'csspool/sac/document'
2
+ require 'csspool/sac/parser'
@@ -0,0 +1,35 @@
1
+ module CSSPool
2
+ module SAC
3
+ class Document
4
+ def start_document
5
+ end
6
+
7
+ def end_document
8
+ end
9
+
10
+ def charset name, location
11
+ end
12
+
13
+ def import_style media_list, uri, default_ns, location
14
+ end
15
+
16
+ def start_selector selector_list
17
+ end
18
+
19
+ def end_selector selector_list
20
+ end
21
+
22
+ def property name, expression, important
23
+ end
24
+
25
+ def comment comment
26
+ end
27
+
28
+ def start_media media_list, parse_location
29
+ end
30
+
31
+ def end_media media_list, parse_location
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,122 @@
1
+ module CSSPool
2
+ module SAC
3
+ class Parser
4
+ attr_accessor :document
5
+
6
+ def initialize document = CSSPool::SAC::Document.new
7
+ @document = document
8
+ @selector_stack = []
9
+ end
10
+
11
+ def parse string
12
+ parse_memory(string, 5)
13
+ end
14
+
15
+ private
16
+ def push selectors
17
+ @selector_stack << selectors
18
+ end
19
+
20
+ def pop
21
+ @selector_stack.pop
22
+ end
23
+
24
+ def parse_memory string, encoding
25
+ parser = LibCroco::CRParser.new(
26
+ LibCroco.cr_parser_new_from_buf(
27
+ string,
28
+ string.length,
29
+ 5,
30
+ 0
31
+ )
32
+ )
33
+ sac_handler =
34
+ LibCroco::CRDocHandler.new(LibCroco.cr_doc_handler_new)
35
+
36
+ selector_stack = []
37
+ media_stack = []
38
+
39
+ sac_handler[:start_document] = lambda { |parser|
40
+ @document.start_document
41
+ }
42
+ sac_handler[:end_document] = lambda { |parser|
43
+ @document.end_document
44
+ }
45
+ sac_handler[:charset] = lambda { |dh, name, location|
46
+ @document.charset(
47
+ LibCroco.cr_string_peek_raw_str(name).read_string,
48
+ LibCroco::CRParsingLocation.new(location).to_h
49
+ )
50
+ }
51
+
52
+ sac_handler[:import_style] = lambda { |dh, media_list, uri, ns, loc|
53
+ media_list = media_list.null? ? [] : LibCroco::GList.new(media_list)
54
+ media_list = media_list.to_a.map { |data|
55
+ LibCroco.cr_string_peek_raw_str(data).read_string
56
+ }
57
+ uri = uri.null? ? nil :
58
+ LibCroco.cr_string_peek_raw_str(uri).read_string
59
+
60
+ ns = ns.null? ? nil : LibCroco.cr_string_peek_raw_str(ns).read_string
61
+
62
+ @document.import_style(
63
+ media_list,
64
+ uri,
65
+ ns,
66
+ LibCroco::CRParsingLocation.new(loc).to_h
67
+ )
68
+ }
69
+
70
+ sac_handler[:start_selector] = lambda { |dh, list|
71
+ list = [LibCroco::CRSelector.new(list)]
72
+ pointer = list.last[:next]
73
+ until pointer.null?
74
+ list << LibCroco::CRSelector.new(pointer)
75
+ pointer = list.last[:next]
76
+ end
77
+ selector_stack.push list.map { |l| l.to_selector }
78
+ @document.start_selector selector_stack.last
79
+ }
80
+
81
+ sac_handler[:end_selector] = lambda { |dh, list|
82
+ @document.end_selector selector_stack.pop
83
+ }
84
+
85
+ sac_handler[:property] = lambda { |dh, name, expr, important|
86
+ expr_list = []
87
+ until expr.null?
88
+ expr_list << LibCroco::CRTerm.new(expr)
89
+ expr = expr_list.last[:next]
90
+ end
91
+ @document.property(
92
+ LibCroco.cr_string_peek_raw_str(name).read_string,
93
+ expr_list.map { |ex| ex.to_term },
94
+ important == 1
95
+ )
96
+ }
97
+
98
+ sac_handler[:comment] = lambda { |dh, comment|
99
+ @document.comment(
100
+ LibCroco.cr_string_peek_raw_str(comment).read_string
101
+ )
102
+ }
103
+
104
+ sac_handler[:start_media] = lambda { |dh,media_list,location|
105
+ media_list = LibCroco::GList.new(media_list)
106
+ media_stack << [media_list.to_a.map { |data|
107
+ LibCroco.cr_string_peek_raw_str(data).read_string
108
+ }, LibCroco::CRParsingLocation.new(location).to_h]
109
+ @document.start_media(*media_stack.last)
110
+ }
111
+
112
+ sac_handler[:end_media] = lambda { |dh,media_list|
113
+ @document.end_media(*media_stack.pop)
114
+ }
115
+
116
+ LibCroco.cr_parser_set_sac_handler(parser, sac_handler)
117
+ LibCroco.cr_parser_parse(parser)
118
+ LibCroco.cr_doc_handler_destroy(sac_handler)
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,35 @@
1
+ module CSSPool
2
+ class Selector < CSSPool::Node
3
+ attr_accessor :simple_selectors
4
+ attr_accessor :parse_location
5
+ attr_accessor :rule_set
6
+
7
+ COMBINATORS = [nil, ' ', ' + ', ' > ']
8
+
9
+
10
+ def initialize simple_selectors = [], parse_location = {}
11
+ @simple_selectors = simple_selectors
12
+ @parse_location = parse_location
13
+ @rule_set = nil
14
+ end
15
+
16
+ def declarations
17
+ @rule_set.declarations
18
+ end
19
+
20
+ def specificity
21
+ a = b = c = 0
22
+ simple_selectors.each do |s|
23
+ c += 1
24
+ s.additional_selectors.each do |additional_selector|
25
+ if Selectors::Id === additional_selector
26
+ a += 1
27
+ else
28
+ b += 1
29
+ end
30
+ end
31
+ end
32
+ [a, b, c]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,8 @@
1
+ require 'csspool/selectors/simple'
2
+ require 'csspool/selectors/universal'
3
+ require 'csspool/selectors/type'
4
+ require 'csspool/selectors/additional'
5
+ require 'csspool/selectors/id'
6
+ require 'csspool/selectors/class'
7
+ require 'csspool/selectors/pseudo_class'
8
+ require 'csspool/selectors/attribute'
@@ -0,0 +1,6 @@
1
+ module CSSPool
2
+ module Selectors
3
+ class Additional < CSSPool::Node
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,21 @@
1
+ module CSSPool
2
+ module Selectors
3
+ class Attribute < CSSPool::Selectors::Additional
4
+ attr_accessor :name
5
+ attr_accessor :value
6
+ attr_accessor :match_way
7
+
8
+ NO_MATCH = 0
9
+ SET = 1
10
+ EQUALS = 2
11
+ INCLUDES = 3
12
+ DASHMATCH = 4
13
+
14
+ def initialize name, value, match_way
15
+ @name = name
16
+ @value = value
17
+ @match_way = match_way
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ module CSSPool
2
+ module Selectors
3
+ class Class < CSSPool::Selectors::Additional
4
+ attr_accessor :name
5
+
6
+ def initialize name
7
+ @name = name
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module CSSPool
2
+ module Selectors
3
+ class Id < CSSPool::Selectors::Additional
4
+ attr_accessor :name
5
+
6
+ def initialize name
7
+ @name = name
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module CSSPool
2
+ module Selectors
3
+ class PseudoClass < CSSPool::Selectors::Additional
4
+ attr_accessor :name
5
+ attr_accessor :extra
6
+
7
+ def initialize name, extra = nil
8
+ @name = name
9
+ @extra = extra
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ module CSSPool
2
+ module Selectors
3
+ class Simple < CSSPool::Node
4
+ NO_COMBINATOR = 0
5
+ DESCENDENT = 1
6
+ PRECEDED_BY = 2
7
+ CHILD = 3
8
+
9
+ attr_accessor :name
10
+ attr_accessor :parse_location
11
+ attr_accessor :additional_selectors
12
+ attr_accessor :combinator
13
+
14
+ def initialize name, combinator = nil
15
+ @name = name
16
+ @combinator = combinator
17
+ @parse_location = nil
18
+ @additional_selectors = []
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ module CSSPool
2
+ module Selectors
3
+ class Type < CSSPool::Selectors::Simple
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module CSSPool
2
+ module Selectors
3
+ class Universal < CSSPool::Selectors::Simple
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ require 'csspool/terms/ident'
2
+ require 'csspool/terms/string'
3
+ require 'csspool/terms/number'
4
+ require 'csspool/terms/function'
5
+ require 'csspool/terms/uri'
6
+ require 'csspool/terms/rgb'
7
+ require 'csspool/terms/hash'
@@ -0,0 +1,17 @@
1
+ module CSSPool
2
+ module Terms
3
+ class Function < CSSPool::Node
4
+ attr_accessor :name
5
+ attr_accessor :params
6
+ attr_accessor :parse_location
7
+ attr_accessor :operator
8
+
9
+ def initialize name, params, operator, parse_location
10
+ @name = name
11
+ @params = params
12
+ @operator = operator
13
+ @parse_location = parse_location
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ module CSSPool
2
+ module Terms
3
+ class Hash < Ident
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ module CSSPool
2
+ module Terms
3
+ class Ident < CSSPool::Node
4
+ attr_accessor :value
5
+ attr_accessor :operator
6
+ attr_accessor :parse_location
7
+
8
+ def initialize value, operator, parse_location
9
+ @value = value
10
+ @operator = operator
11
+ @parse_location = parse_location
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module CSSPool
2
+ module Terms
3
+ class Number < Ident
4
+ attr_accessor :type
5
+ attr_accessor :unary_operator
6
+
7
+ def initialize type, unary_operator, value, operator, parse_location
8
+ @type = type
9
+ @unary_operator = unary_operator
10
+ super(value, operator, parse_location)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ module CSSPool
2
+ module Terms
3
+ class Rgb < CSSPool::Node
4
+ attr_accessor :red
5
+ attr_accessor :green
6
+ attr_accessor :blue
7
+ attr_accessor :percentage
8
+ attr_accessor :parse_location
9
+ attr_accessor :operator
10
+ alias :percentage? :percentage
11
+
12
+ def initialize red, green, blue, percentage, operator, parse_location
13
+ super()
14
+ @red = red
15
+ @green = green
16
+ @blue = blue
17
+ @percentage = percentage
18
+ @operator = operator
19
+ @parse_location = parse_location
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ module CSSPool
2
+ module Terms
3
+ class String < Ident
4
+ end
5
+ end
6
+ end