maca-fork-csspool 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +72 -0
- data/History.txt +4 -0
- data/Manifest.txt +70 -0
- data/README.rdoc +78 -0
- data/Rakefile +35 -0
- data/lib/csspool.rb +20 -0
- data/lib/csspool/collection.rb +50 -0
- data/lib/csspool/css.rb +7 -0
- data/lib/csspool/css/charset.rb +7 -0
- data/lib/csspool/css/declaration.rb +8 -0
- data/lib/csspool/css/document.rb +34 -0
- data/lib/csspool/css/document_handler.rb +51 -0
- data/lib/csspool/css/import_rule.rb +15 -0
- data/lib/csspool/css/media.rb +7 -0
- data/lib/csspool/css/rule_set.rb +12 -0
- data/lib/csspool/lib_croco.rb +78 -0
- data/lib/csspool/lib_croco/cr_additional_sel.rb +46 -0
- data/lib/csspool/lib_croco/cr_attr_sel.rb +16 -0
- data/lib/csspool/lib_croco/cr_doc_handler.rb +24 -0
- data/lib/csspool/lib_croco/cr_num.rb +13 -0
- data/lib/csspool/lib_croco/cr_parser.rb +11 -0
- data/lib/csspool/lib_croco/cr_parsing_location.rb +17 -0
- data/lib/csspool/lib_croco/cr_pseudo.rb +14 -0
- data/lib/csspool/lib_croco/cr_rgb.rb +18 -0
- data/lib/csspool/lib_croco/cr_selector.rb +33 -0
- data/lib/csspool/lib_croco/cr_simple_sel.rb +54 -0
- data/lib/csspool/lib_croco/cr_term.rb +97 -0
- data/lib/csspool/lib_croco/glist.rb +21 -0
- data/lib/csspool/node.rb +5 -0
- data/lib/csspool/sac.rb +2 -0
- data/lib/csspool/sac/document.rb +35 -0
- data/lib/csspool/sac/parser.rb +122 -0
- data/lib/csspool/selector.rb +35 -0
- data/lib/csspool/selectors.rb +8 -0
- data/lib/csspool/selectors/additional.rb +6 -0
- data/lib/csspool/selectors/attribute.rb +21 -0
- data/lib/csspool/selectors/class.rb +11 -0
- data/lib/csspool/selectors/id.rb +11 -0
- data/lib/csspool/selectors/pseudo_class.rb +13 -0
- data/lib/csspool/selectors/simple.rb +22 -0
- data/lib/csspool/selectors/type.rb +6 -0
- data/lib/csspool/selectors/universal.rb +6 -0
- data/lib/csspool/terms.rb +7 -0
- data/lib/csspool/terms/function.rb +17 -0
- data/lib/csspool/terms/hash.rb +6 -0
- data/lib/csspool/terms/ident.rb +15 -0
- data/lib/csspool/terms/number.rb +14 -0
- data/lib/csspool/terms/rgb.rb +23 -0
- data/lib/csspool/terms/string.rb +6 -0
- data/lib/csspool/terms/uri.rb +6 -0
- data/lib/csspool/visitable.rb +30 -0
- data/lib/csspool/visitors.rb +5 -0
- data/lib/csspool/visitors/children.rb +50 -0
- data/lib/csspool/visitors/comparable.rb +85 -0
- data/lib/csspool/visitors/iterator.rb +80 -0
- data/lib/csspool/visitors/to_css.rb +188 -0
- data/lib/csspool/visitors/visitor.rb +17 -0
- data/test/css/test_document.rb +13 -0
- data/test/css/test_import_rule.rb +42 -0
- data/test/helper.rb +67 -0
- data/test/sac/test_parser.rb +115 -0
- data/test/sac/test_properties.rb +43 -0
- data/test/sac/test_terms.rb +134 -0
- data/test/test_collection.rb +81 -0
- data/test/test_parser.rb +91 -0
- data/test/test_selector.rb +47 -0
- data/test/visitors/test_children.rb +20 -0
- data/test/visitors/test_comparable.rb +103 -0
- data/test/visitors/test_each.rb +19 -0
- data/test/visitors/test_to_css.rb +200 -0
- metadata +173 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module CSS
|
3
|
+
class ImportRule < Struct.new(:uri, :namespace, :media, :document, :parse_location)
|
4
|
+
include CSSPool::Visitable
|
5
|
+
|
6
|
+
def load
|
7
|
+
new_doc = CSSPool.CSS yield(uri)
|
8
|
+
new_doc.parent_import_rule = self
|
9
|
+
new_doc.parent = document
|
10
|
+
new_doc.rule_sets.each { |rs| rs.media = media }
|
11
|
+
new_doc
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module CSS
|
3
|
+
class RuleSet < Struct.new(:selectors, :declarations, :media)
|
4
|
+
include CSSPool::Visitable
|
5
|
+
|
6
|
+
def initialize selectors, declarations = [], media = []
|
7
|
+
selectors.each { |sel| sel.rule_set = self }
|
8
|
+
super
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
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,46 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module LibCroco
|
3
|
+
class CRAdditionalSel < FFI::Struct
|
4
|
+
layout(
|
5
|
+
:sel_type, :int,
|
6
|
+
:content, :pointer,
|
7
|
+
:next, :pointer,
|
8
|
+
:prev, :pointer,
|
9
|
+
:line, :int,
|
10
|
+
:column, :int,
|
11
|
+
:byte_offset, :int
|
12
|
+
)
|
13
|
+
|
14
|
+
def to_additional_selector
|
15
|
+
case self[:sel_type]
|
16
|
+
when 1 # CLASS_ADD_SELECTOR
|
17
|
+
CSSPool::Selectors::Class.new(
|
18
|
+
LibCroco.cr_string_peek_raw_str(self[:content]).read_string
|
19
|
+
)
|
20
|
+
when 1 << 1 # PSEUDO_CLASS_ADD_SELECTOR
|
21
|
+
pseudo = CRPseudo.new(self[:content])
|
22
|
+
CSSPool::Selectors::PseudoClass.new(
|
23
|
+
pseudo[:name].null? ? nil :
|
24
|
+
LibCroco.cr_string_peek_raw_str(pseudo[:name]).read_string,
|
25
|
+
pseudo[:extra].null? ? nil :
|
26
|
+
LibCroco.cr_string_peek_raw_str(pseudo[:extra]).read_string
|
27
|
+
)
|
28
|
+
when 1 << 3 # ID_ADD_SELECTOR
|
29
|
+
CSSPool::Selectors::Id.new(
|
30
|
+
LibCroco.cr_string_peek_raw_str(self[:content]).read_string
|
31
|
+
)
|
32
|
+
when 1 << 4 # ATTRIBUTE_ADD_SELECTOR
|
33
|
+
attr_sel = CRAttrSel.new(self[:content])
|
34
|
+
raise "FIXME: additional add selectors" unless attr_sel[:next].null?
|
35
|
+
CSSPool::Selectors::Attribute.new(
|
36
|
+
attr_sel[:name].null? ? nil :
|
37
|
+
LibCroco.cr_string_peek_raw_str(attr_sel[:name]).read_string,
|
38
|
+
attr_sel[:value].null? ? nil :
|
39
|
+
LibCroco.cr_string_peek_raw_str(attr_sel[:value]).read_string,
|
40
|
+
attr_sel[:match_way]
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module LibCroco
|
3
|
+
class CRAttrSel < FFI::Struct
|
4
|
+
layout(
|
5
|
+
:name, :pointer,
|
6
|
+
:value, :pointer,
|
7
|
+
:match_way, :int,
|
8
|
+
:next, :pointer,
|
9
|
+
:prev, :pointer,
|
10
|
+
:line, :int,
|
11
|
+
:column, :int,
|
12
|
+
:byte_offset, :int
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module LibCroco
|
3
|
+
class CRDocHandler < FFI::Struct
|
4
|
+
layout(
|
5
|
+
:priv, :pointer,
|
6
|
+
:app_data, :pointer,
|
7
|
+
:start_document, :start_document,
|
8
|
+
:end_document, :end_document,
|
9
|
+
:charset, :charset,
|
10
|
+
:import_style, :import_style,
|
11
|
+
:import_style_result, :import_style_result,
|
12
|
+
:namespace_declaration, :namespace_declaration,
|
13
|
+
:comment, :comment,
|
14
|
+
:start_selector, :start_selector,
|
15
|
+
:end_selector, :end_selector,
|
16
|
+
:property, :property,
|
17
|
+
:start_font_face, :start_font_face,
|
18
|
+
:end_font_face, :end_font_face,
|
19
|
+
:start_media, :start_media,
|
20
|
+
:end_media, :end_media
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module LibCroco
|
3
|
+
class CRParsingLocation < FFI::Struct
|
4
|
+
layout(
|
5
|
+
:line, :uint,
|
6
|
+
:column, :uint,
|
7
|
+
:byte_offset, :uint
|
8
|
+
)
|
9
|
+
|
10
|
+
def to_h
|
11
|
+
Hash[*[:line, :column, :byte_offset].map { |k|
|
12
|
+
[k, self[k]]
|
13
|
+
}.flatten]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -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,33 @@
|
|
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
|
+
simple_selectors << CRSimpleSel.new(pointer)
|
20
|
+
pointer = simple_selectors.last[:next]
|
21
|
+
end
|
22
|
+
|
23
|
+
simple_selectors = simple_selectors.map { |sel| sel.to_simple_selector }
|
24
|
+
|
25
|
+
Selector.new simple_selectors, {
|
26
|
+
:line => self[:line],
|
27
|
+
:column => self[:column],
|
28
|
+
:byte_offset => self[:byte_offset]
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
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
|