csspool 0.2.6 → 2.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 (138) hide show
  1. data/.autotest +16 -0
  2. data/{CHANGELOG.txt → CHANGELOG.rdoc} +10 -0
  3. data/Manifest.txt +60 -72
  4. data/README.rdoc +78 -0
  5. data/Rakefile +9 -52
  6. data/lib/csspool/collection.rb +50 -0
  7. data/lib/csspool/css/charset.rb +7 -0
  8. data/lib/csspool/css/declaration.rb +8 -0
  9. data/lib/csspool/css/document.rb +34 -0
  10. data/lib/csspool/css/document_handler.rb +51 -0
  11. data/lib/csspool/css/import_rule.rb +15 -0
  12. data/lib/csspool/css/media.rb +7 -0
  13. data/lib/csspool/css/rule_set.rb +12 -0
  14. data/lib/csspool/css.rb +7 -0
  15. data/lib/csspool/lib_croco/cr_additional_sel.rb +46 -0
  16. data/lib/csspool/lib_croco/cr_attr_sel.rb +16 -0
  17. data/lib/csspool/lib_croco/cr_doc_handler.rb +24 -0
  18. data/lib/csspool/lib_croco/cr_num.rb +13 -0
  19. data/lib/csspool/lib_croco/cr_parser.rb +11 -0
  20. data/lib/csspool/lib_croco/cr_parsing_location.rb +17 -0
  21. data/lib/csspool/lib_croco/cr_pseudo.rb +14 -0
  22. data/lib/csspool/lib_croco/cr_rgb.rb +18 -0
  23. data/lib/csspool/lib_croco/cr_selector.rb +34 -0
  24. data/lib/csspool/lib_croco/cr_simple_sel.rb +54 -0
  25. data/lib/csspool/lib_croco/cr_term.rb +97 -0
  26. data/lib/csspool/lib_croco/glist.rb +21 -0
  27. data/lib/csspool/lib_croco.rb +78 -0
  28. data/lib/csspool/node.rb +5 -0
  29. data/lib/csspool/sac/document.rb +35 -0
  30. data/lib/csspool/sac/parser.rb +122 -0
  31. data/lib/csspool/sac.rb +2 -0
  32. data/lib/csspool/selector.rb +32 -0
  33. data/lib/csspool/selectors/additional.rb +6 -0
  34. data/lib/csspool/selectors/attribute.rb +21 -0
  35. data/lib/csspool/selectors/class.rb +11 -0
  36. data/lib/csspool/selectors/id.rb +11 -0
  37. data/lib/csspool/selectors/pseudo_class.rb +13 -0
  38. data/lib/csspool/selectors/simple.rb +22 -0
  39. data/lib/csspool/selectors/type.rb +6 -0
  40. data/lib/csspool/selectors/universal.rb +6 -0
  41. data/lib/csspool/selectors.rb +8 -0
  42. data/lib/csspool/terms/function.rb +17 -0
  43. data/lib/csspool/terms/hash.rb +6 -0
  44. data/lib/csspool/terms/ident.rb +15 -0
  45. data/lib/csspool/terms/number.rb +14 -0
  46. data/lib/csspool/terms/rgb.rb +23 -0
  47. data/lib/csspool/terms/string.rb +6 -0
  48. data/lib/csspool/terms/uri.rb +6 -0
  49. data/lib/csspool/terms.rb +7 -0
  50. data/lib/csspool/visitable.rb +18 -0
  51. data/lib/csspool/visitors/comparable.rb +78 -0
  52. data/lib/csspool/visitors/to_css.rb +201 -0
  53. data/lib/csspool/visitors/visitor.rb +17 -0
  54. data/lib/csspool/visitors.rb +3 -0
  55. data/lib/csspool.rb +18 -1
  56. data/test/css/test_document.rb +13 -0
  57. data/test/css/test_import_rule.rb +42 -0
  58. data/test/helper.rb +62 -6
  59. data/test/sac/test_parser.rb +115 -0
  60. data/test/sac/test_properties.rb +43 -0
  61. data/test/sac/test_terms.rb +134 -0
  62. data/test/test_collection.rb +81 -0
  63. data/test/test_parser.rb +75 -241
  64. data/test/test_selector.rb +45 -34
  65. data/test/visitors/test_comparable.rb +72 -0
  66. data/test/visitors/test_to_css.rb +141 -0
  67. metadata +98 -85
  68. data/README.txt +0 -79
  69. data/lib/css/sac/conditions/attribute_condition.rb +0 -56
  70. data/lib/css/sac/conditions/begin_hyphen_condition.rb +0 -22
  71. data/lib/css/sac/conditions/class_condition.rb +0 -22
  72. data/lib/css/sac/conditions/combinator_condition.rb +0 -40
  73. data/lib/css/sac/conditions/condition.rb +0 -35
  74. data/lib/css/sac/conditions/id_condition.rb +0 -27
  75. data/lib/css/sac/conditions/one_of_condition.rb +0 -22
  76. data/lib/css/sac/conditions/pseudo_class_condition.rb +0 -24
  77. data/lib/css/sac/conditions.rb +0 -5
  78. data/lib/css/sac/document_handler.rb +0 -67
  79. data/lib/css/sac/error_handler.rb +0 -14
  80. data/lib/css/sac/generated_parser.rb +0 -999
  81. data/lib/css/sac/generated_property_parser.rb +0 -9214
  82. data/lib/css/sac/lexeme.rb +0 -29
  83. data/lib/css/sac/lexical_unit.rb +0 -203
  84. data/lib/css/sac/parse_exception.rb +0 -6
  85. data/lib/css/sac/parser.rb +0 -115
  86. data/lib/css/sac/property_parser.rb +0 -47
  87. data/lib/css/sac/selectors/child_selector.rb +0 -40
  88. data/lib/css/sac/selectors/conditional_selector.rb +0 -49
  89. data/lib/css/sac/selectors/descendant_selector.rb +0 -40
  90. data/lib/css/sac/selectors/element_selector.rb +0 -39
  91. data/lib/css/sac/selectors/selector.rb +0 -31
  92. data/lib/css/sac/selectors/sibling_selector.rb +0 -39
  93. data/lib/css/sac/selectors/simple_selector.rb +0 -25
  94. data/lib/css/sac/selectors.rb +0 -5
  95. data/lib/css/sac/token.rb +0 -27
  96. data/lib/css/sac/tokenizer.rb +0 -187
  97. data/lib/css/sac/visitable.rb +0 -106
  98. data/lib/css/sac.rb +0 -14
  99. data/lib/css/stylesheet/rule.rb +0 -20
  100. data/lib/css/stylesheet/stylesheet.rb +0 -96
  101. data/lib/css/stylesheet.rb +0 -3
  102. data/lib/parser.y +0 -308
  103. data/lib/property_parser.y +0 -2346
  104. data/lib/property_parser.y.erb +0 -1321
  105. data/test/condition_test_case.rb +0 -6
  106. data/test/selector_test_case.rb +0 -20
  107. data/test/test_all.rb +0 -4
  108. data/test/test_attribute_condition.rb +0 -39
  109. data/test/test_begin_hyphen_condition.rb +0 -15
  110. data/test/test_child_selector.rb +0 -60
  111. data/test/test_class_condition.rb +0 -15
  112. data/test/test_combinator_condition.rb +0 -38
  113. data/test/test_condition.rb +0 -31
  114. data/test/test_conditional_selector.rb +0 -44
  115. data/test/test_descendant_selector.rb +0 -64
  116. data/test/test_element_selector.rb +0 -31
  117. data/test/test_error_recovery.rb +0 -28
  118. data/test/test_id_condition.rb +0 -16
  119. data/test/test_lexeme.rb +0 -39
  120. data/test/test_lexical_color.rb +0 -49
  121. data/test/test_lexical_function.rb +0 -31
  122. data/test/test_lexical_ident.rb +0 -30
  123. data/test/test_lexical_number.rb +0 -68
  124. data/test/test_lexical_string.rb +0 -23
  125. data/test/test_lexical_unit.rb +0 -106
  126. data/test/test_lexical_uri.rb +0 -28
  127. data/test/test_one_of_condition.rb +0 -15
  128. data/test/test_parse_error.rb +0 -199
  129. data/test/test_property_parser.rb +0 -593
  130. data/test/test_selector_as_string.rb +0 -94
  131. data/test/test_selector_parser.rb +0 -178
  132. data/test/test_sibling_selector.rb +0 -42
  133. data/test/test_simple_selector.rb +0 -9
  134. data/test/test_specificity.rb +0 -76
  135. data/test/test_stylesheet.rb +0 -95
  136. data/test/test_token.rb +0 -24
  137. data/test/test_tokenizer.rb +0 -127
  138. data/test/test_xpath.rb +0 -105
@@ -0,0 +1,18 @@
1
+ module CSSPool
2
+ module LibCroco
3
+ class CRRgb < FFI::Struct
4
+ layout(
5
+ :name, :string,
6
+ :red, :long,
7
+ :green, :long,
8
+ :blue, :long,
9
+ :is_percentage, :int,
10
+ :inherit, :int,
11
+ :is_transparent,:int,
12
+ :line, :int,
13
+ :column, :int,
14
+ :byte_offset, :int
15
+ )
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,34 @@
1
+ module CSSPool
2
+ module LibCroco
3
+ class CRSelector < FFI::Struct
4
+ layout(
5
+ :simple_sel, :pointer,
6
+ :next, :pointer,
7
+ :prev, :pointer,
8
+ :line, :int,
9
+ :column, :int,
10
+ :byte_offset, :int,
11
+ :ref_count, :long
12
+ )
13
+
14
+ def to_selector
15
+ simple_selectors = []
16
+ pointer = self[:simple_sel]
17
+
18
+ until pointer.null?
19
+ LibCroco.cr_simple_sel_compute_specificity(pointer)
20
+ simple_selectors << CRSimpleSel.new(pointer)
21
+ pointer = simple_selectors.last[:next]
22
+ end
23
+
24
+ simple_selectors = simple_selectors.map { |sel| sel.to_simple_selector }
25
+
26
+ Selector.new simple_selectors, {
27
+ :line => self[:line],
28
+ :column => self[:column],
29
+ :byte_offset => self[:byte_offset]
30
+ }
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,54 @@
1
+ module CSSPool
2
+ module LibCroco
3
+ class CRSimpleSel < FFI::Struct
4
+ layout(
5
+ :type_mask, :int,
6
+ :case_sensitive, :int,
7
+ :name, :pointer,
8
+ :combinator, :int,
9
+ :add_sel, :pointer,
10
+ :specificity, :ulong,
11
+ :next, :pointer,
12
+ :prev, :pointer,
13
+ :line, :int,
14
+ :column, :int,
15
+ :byte_offset, :int
16
+ )
17
+
18
+ def to_simple_selector
19
+ klass = CSSPool::Selectors::Simple
20
+
21
+ case self[:type_mask]
22
+ when 1 # UNIVERSAL_SELECTOR
23
+ klass = CSSPool::Selectors::Universal
24
+ when 1 << 1 # TYPE_SELECTOR
25
+ klass = CSSPool::Selectors::Type
26
+ end
27
+
28
+ simple_sel = klass.new(
29
+ self[:name].null? ? nil :
30
+ LibCroco.cr_string_peek_raw_str(self[:name]).read_string,
31
+ self[:combinator]
32
+ )
33
+ simple_sel.parse_location = {
34
+ :line => self[:line],
35
+ :column => self[:column],
36
+ :byte_offset => self[:byte_offset]
37
+ }
38
+
39
+ additional_selectors = []
40
+ pointer = self[:add_sel]
41
+ until pointer.null?
42
+ additional_selectors << CRAdditionalSel.new(pointer)
43
+ pointer = additional_selectors.last[:next]
44
+ end
45
+
46
+ simple_sel.additional_selectors = additional_selectors.map { |as|
47
+ as.to_additional_selector
48
+ }
49
+
50
+ simple_sel
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,97 @@
1
+ module CSSPool
2
+ module LibCroco
3
+ class CRTerm < FFI::Struct
4
+ layout(
5
+ :type, :int,
6
+ :unary_op, :int,
7
+ :operator, :int,
8
+ :content, :pointer,
9
+ :ext_content, :pointer,
10
+ :app_data, :pointer,
11
+ :ref_count, :long,
12
+ :next, :pointer,
13
+ :pref, :pointer,
14
+ :line, :int,
15
+ :column, :int,
16
+ :byte_offset, :int
17
+ )
18
+
19
+ def to_term
20
+ operator = {
21
+ 0 => nil,
22
+ 1 => '/',
23
+ 2 => ','
24
+ }[self[:operator]]
25
+
26
+ unary_op = {
27
+ 0 => nil,
28
+ 1 => :plus,
29
+ 2 => :minus
30
+ }[self[:unary_op]]
31
+
32
+ case self[:type]
33
+ when 0 # TERM_NO_TYPE
34
+ when 1 # TERM_NUMBER
35
+ num = CRNum.new(self[:content])
36
+ CSSPool::Terms::Number.new(
37
+ num[:type],
38
+ unary_op,
39
+ num[:value],
40
+ operator,
41
+ LibCroco.location_to_h(self)
42
+ )
43
+ when 2 # TERM_FUNCTION
44
+ name = LibCroco.cr_string_peek_raw_str(self[:content]).read_string
45
+ params = []
46
+ term = self[:ext_content]
47
+ until term.null?
48
+ params << LibCroco::CRTerm.new(term)
49
+ term = params.last[:next]
50
+ end
51
+ CSSPool::Terms::Function.new(
52
+ name,
53
+ params.map { |param| param.to_term },
54
+ operator,
55
+ LibCroco.location_to_h(self)
56
+ )
57
+ when 3 # TERM_STRING
58
+ CSSPool::Terms::String.new(
59
+ LibCroco.cr_string_peek_raw_str(self[:content]).read_string,
60
+ operator,
61
+ LibCroco.location_to_h(self)
62
+ )
63
+ when 4 # TERM_IDENT
64
+ CSSPool::Terms::Ident.new(
65
+ LibCroco.cr_string_peek_raw_str(self[:content]).read_string,
66
+ operator,
67
+ LibCroco.location_to_h(self)
68
+ )
69
+ when 5 # TERM_URI
70
+ CSSPool::Terms::URI.new(
71
+ LibCroco.cr_string_peek_raw_str(self[:content]).read_string,
72
+ operator,
73
+ LibCroco.location_to_h(self)
74
+ )
75
+ when 6 # TERM_RGB
76
+ rgb = LibCroco::CRRgb.new(self[:content])
77
+ CSSPool::Terms::Rgb.new(
78
+ rgb[:red],
79
+ rgb[:green],
80
+ rgb[:blue],
81
+ rgb[:is_percentage] == 1,
82
+ operator,
83
+ LibCroco.location_to_h(rgb)
84
+ )
85
+ when 7 # TERM_UNICODERANGE
86
+ raise "libcroco doesn't seem to support this term"
87
+ when 8 # TERM_HASH
88
+ CSSPool::Terms::Hash.new(
89
+ LibCroco.cr_string_peek_raw_str(self[:content]).read_string,
90
+ operator,
91
+ LibCroco.location_to_h(self)
92
+ )
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -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,78 @@
1
+ require 'ffi'
2
+
3
+ ENV['LIBCROCO'] ||= 'libcroco-0.6'
4
+
5
+ module CSSPool
6
+ module LibCroco
7
+ extend FFI::Library
8
+
9
+ retry_times = 0
10
+
11
+ retry_places = {
12
+ 0 => '/opt/local/lib/libcroco-0.6.dylib',
13
+ 1 => '/opt/local/lib/libcroco-0.6.so',
14
+ 2 => '/usr/local/lib/libcroco-0.6.dylib',
15
+ 3 => '/usr/local/lib/libcroco-0.6.so',
16
+ 4 => '/usr/lib/libcroco-0.6.dylib',
17
+ 5 => '/usr/lib/libcroco-0.6.so',
18
+ }
19
+
20
+ begin
21
+ ffi_lib ENV['LIBCROCO']
22
+ rescue LoadError => ex
23
+ if retry_places.key?(retry_times)
24
+ ENV['LIBCROCO'] = retry_places[retry_times]
25
+ retry_times += 1
26
+ retry
27
+ end
28
+ warn "### Please install libcroco"
29
+ warn "### Set LD_LIBRARY_PATH *or* set LIBCROCO to point at libcroco-0.6.dylib"
30
+ raise ex
31
+ end
32
+
33
+ attach_function :cr_doc_handler_new, [], :pointer
34
+ attach_function :cr_parser_new_from_buf, [:string, :int, :int, :int], :pointer
35
+ attach_function :cr_parser_set_sac_handler, [:pointer, :pointer], :int
36
+ attach_function :cr_parser_parse, [:pointer], :int
37
+ attach_function :cr_parser_destroy, [:pointer], :void
38
+ attach_function :cr_doc_handler_destroy, [:pointer], :void
39
+ attach_function :cr_string_peek_raw_str, [:pointer], :pointer
40
+ attach_function :cr_simple_sel_compute_specificity, [:pointer], :int
41
+
42
+ callback :start_document, [:pointer], :void
43
+ callback :end_document, [:pointer], :void
44
+ callback :charset, [:pointer, :pointer, :pointer], :void
45
+ callback :import_style, [:pointer] * 5, :void
46
+ callback :import_style_result, [:pointer] * 5, :void
47
+ callback :namespace_declaration, [:pointer] * 4, :void
48
+ callback :comment, [:pointer, :pointer], :void
49
+ callback :start_selector, [:pointer, :pointer], :void
50
+ callback :end_selector, [:pointer, :pointer], :void
51
+ callback :property, [:pointer, :pointer, :pointer, :int], :void
52
+ callback :start_font_face, [:pointer] * 2, :void
53
+ callback :end_font_face, [:pointer], :void
54
+ callback :start_media, [:pointer] * 3, :void
55
+ callback :end_media, [:pointer] * 2, :void
56
+
57
+ def self.location_to_h thing
58
+ {
59
+ :line => thing[:line],
60
+ :column => thing[:column],
61
+ :byte_offset => thing[:byte_offset]
62
+ }
63
+ end
64
+ end
65
+ end
66
+
67
+ require 'csspool/lib_croco/cr_doc_handler'
68
+ require 'csspool/lib_croco/cr_pseudo'
69
+ require 'csspool/lib_croco/cr_parsing_location'
70
+ require 'csspool/lib_croco/glist'
71
+ require 'csspool/lib_croco/cr_simple_sel'
72
+ require 'csspool/lib_croco/cr_selector'
73
+ require 'csspool/lib_croco/cr_additional_sel'
74
+ require 'csspool/lib_croco/cr_attr_sel'
75
+ require 'csspool/lib_croco/cr_term'
76
+ require 'csspool/lib_croco/cr_parser'
77
+ require 'csspool/lib_croco/cr_num'
78
+ require 'csspool/lib_croco/cr_rgb'
@@ -0,0 +1,5 @@
1
+ module CSSPool
2
+ class Node
3
+ include CSSPool::Visitable
4
+ end
5
+ end
@@ -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,2 @@
1
+ require 'csspool/sac/document'
2
+ require 'csspool/sac/parser'
@@ -0,0 +1,32 @@
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
+ def initialize simple_selectors = [], parse_location = {}
8
+ @simple_selectors = simple_selectors
9
+ @parse_location = parse_location
10
+ @rule_set = nil
11
+ end
12
+
13
+ def declarations
14
+ @rule_set.declarations
15
+ end
16
+
17
+ def specificity
18
+ a = b = c = 0
19
+ simple_selectors.each do |s|
20
+ c += 1
21
+ s.additional_selectors.each do |additional_selector|
22
+ if Selectors::Id === additional_selector
23
+ a += 1
24
+ else
25
+ b += 1
26
+ end
27
+ end
28
+ end
29
+ [a, b, c]
30
+ end
31
+ end
32
+ end
@@ -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,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,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