csspool 0.2.6 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +16 -0
- data/{CHANGELOG.txt → CHANGELOG.rdoc} +10 -0
- data/Manifest.txt +60 -72
- data/README.rdoc +78 -0
- data/Rakefile +9 -52
- data/lib/csspool/collection.rb +50 -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/css.rb +7 -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 +34 -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/lib_croco.rb +78 -0
- data/lib/csspool/node.rb +5 -0
- data/lib/csspool/sac/document.rb +35 -0
- data/lib/csspool/sac/parser.rb +122 -0
- data/lib/csspool/sac.rb +2 -0
- data/lib/csspool/selector.rb +32 -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/selectors.rb +8 -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/terms.rb +7 -0
- data/lib/csspool/visitable.rb +18 -0
- data/lib/csspool/visitors/comparable.rb +78 -0
- data/lib/csspool/visitors/to_css.rb +201 -0
- data/lib/csspool/visitors/visitor.rb +17 -0
- data/lib/csspool/visitors.rb +3 -0
- data/lib/csspool.rb +18 -1
- data/test/css/test_document.rb +13 -0
- data/test/css/test_import_rule.rb +42 -0
- data/test/helper.rb +62 -6
- 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 +75 -241
- data/test/test_selector.rb +45 -34
- data/test/visitors/test_comparable.rb +72 -0
- data/test/visitors/test_to_css.rb +141 -0
- metadata +98 -85
- data/README.txt +0 -79
- data/lib/css/sac/conditions/attribute_condition.rb +0 -56
- data/lib/css/sac/conditions/begin_hyphen_condition.rb +0 -22
- data/lib/css/sac/conditions/class_condition.rb +0 -22
- data/lib/css/sac/conditions/combinator_condition.rb +0 -40
- data/lib/css/sac/conditions/condition.rb +0 -35
- data/lib/css/sac/conditions/id_condition.rb +0 -27
- data/lib/css/sac/conditions/one_of_condition.rb +0 -22
- data/lib/css/sac/conditions/pseudo_class_condition.rb +0 -24
- data/lib/css/sac/conditions.rb +0 -5
- data/lib/css/sac/document_handler.rb +0 -67
- data/lib/css/sac/error_handler.rb +0 -14
- data/lib/css/sac/generated_parser.rb +0 -999
- data/lib/css/sac/generated_property_parser.rb +0 -9214
- data/lib/css/sac/lexeme.rb +0 -29
- data/lib/css/sac/lexical_unit.rb +0 -203
- data/lib/css/sac/parse_exception.rb +0 -6
- data/lib/css/sac/parser.rb +0 -115
- data/lib/css/sac/property_parser.rb +0 -47
- data/lib/css/sac/selectors/child_selector.rb +0 -40
- data/lib/css/sac/selectors/conditional_selector.rb +0 -49
- data/lib/css/sac/selectors/descendant_selector.rb +0 -40
- data/lib/css/sac/selectors/element_selector.rb +0 -39
- data/lib/css/sac/selectors/selector.rb +0 -31
- data/lib/css/sac/selectors/sibling_selector.rb +0 -39
- data/lib/css/sac/selectors/simple_selector.rb +0 -25
- data/lib/css/sac/selectors.rb +0 -5
- data/lib/css/sac/token.rb +0 -27
- data/lib/css/sac/tokenizer.rb +0 -187
- data/lib/css/sac/visitable.rb +0 -106
- data/lib/css/sac.rb +0 -14
- data/lib/css/stylesheet/rule.rb +0 -20
- data/lib/css/stylesheet/stylesheet.rb +0 -96
- data/lib/css/stylesheet.rb +0 -3
- data/lib/parser.y +0 -308
- data/lib/property_parser.y +0 -2346
- data/lib/property_parser.y.erb +0 -1321
- data/test/condition_test_case.rb +0 -6
- data/test/selector_test_case.rb +0 -20
- data/test/test_all.rb +0 -4
- data/test/test_attribute_condition.rb +0 -39
- data/test/test_begin_hyphen_condition.rb +0 -15
- data/test/test_child_selector.rb +0 -60
- data/test/test_class_condition.rb +0 -15
- data/test/test_combinator_condition.rb +0 -38
- data/test/test_condition.rb +0 -31
- data/test/test_conditional_selector.rb +0 -44
- data/test/test_descendant_selector.rb +0 -64
- data/test/test_element_selector.rb +0 -31
- data/test/test_error_recovery.rb +0 -28
- data/test/test_id_condition.rb +0 -16
- data/test/test_lexeme.rb +0 -39
- data/test/test_lexical_color.rb +0 -49
- data/test/test_lexical_function.rb +0 -31
- data/test/test_lexical_ident.rb +0 -30
- data/test/test_lexical_number.rb +0 -68
- data/test/test_lexical_string.rb +0 -23
- data/test/test_lexical_unit.rb +0 -106
- data/test/test_lexical_uri.rb +0 -28
- data/test/test_one_of_condition.rb +0 -15
- data/test/test_parse_error.rb +0 -199
- data/test/test_property_parser.rb +0 -593
- data/test/test_selector_as_string.rb +0 -94
- data/test/test_selector_parser.rb +0 -178
- data/test/test_sibling_selector.rb +0 -42
- data/test/test_simple_selector.rb +0 -9
- data/test/test_specificity.rb +0 -76
- data/test/test_stylesheet.rb +0 -95
- data/test/test_token.rb +0 -24
- data/test/test_tokenizer.rb +0 -127
- data/test/test_xpath.rb +0 -105
data/.autotest
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'autotest/fsevent'
|
5
|
+
rescue LoadError
|
6
|
+
end
|
7
|
+
|
8
|
+
Autotest.add_hook :run_command do |at|
|
9
|
+
at.unit_diff = 'cat'
|
10
|
+
end
|
11
|
+
|
12
|
+
Autotest.add_hook :ran_command do |at|
|
13
|
+
File.open('/tmp/autotest.txt', 'wb') { |f|
|
14
|
+
f.write(at.results.join)
|
15
|
+
}
|
16
|
+
end
|
data/Manifest.txt
CHANGED
@@ -1,78 +1,66 @@
|
|
1
|
-
|
1
|
+
.autotest
|
2
|
+
CHANGELOG.rdoc
|
2
3
|
Manifest.txt
|
3
|
-
README.
|
4
|
+
README.rdoc
|
4
5
|
Rakefile
|
5
|
-
lib/css/sac.rb
|
6
|
-
lib/css/sac/conditions.rb
|
7
|
-
lib/css/sac/conditions/attribute_condition.rb
|
8
|
-
lib/css/sac/conditions/begin_hyphen_condition.rb
|
9
|
-
lib/css/sac/conditions/class_condition.rb
|
10
|
-
lib/css/sac/conditions/combinator_condition.rb
|
11
|
-
lib/css/sac/conditions/condition.rb
|
12
|
-
lib/css/sac/conditions/id_condition.rb
|
13
|
-
lib/css/sac/conditions/one_of_condition.rb
|
14
|
-
lib/css/sac/conditions/pseudo_class_condition.rb
|
15
|
-
lib/css/sac/document_handler.rb
|
16
|
-
lib/css/sac/error_handler.rb
|
17
|
-
lib/css/sac/generated_parser.rb
|
18
|
-
lib/css/sac/generated_property_parser.rb
|
19
|
-
lib/css/sac/lexeme.rb
|
20
|
-
lib/css/sac/lexical_unit.rb
|
21
|
-
lib/css/sac/parse_exception.rb
|
22
|
-
lib/css/sac/parser.rb
|
23
|
-
lib/css/sac/property_parser.rb
|
24
|
-
lib/css/sac/selectors.rb
|
25
|
-
lib/css/sac/selectors/child_selector.rb
|
26
|
-
lib/css/sac/selectors/conditional_selector.rb
|
27
|
-
lib/css/sac/selectors/descendant_selector.rb
|
28
|
-
lib/css/sac/selectors/element_selector.rb
|
29
|
-
lib/css/sac/selectors/selector.rb
|
30
|
-
lib/css/sac/selectors/sibling_selector.rb
|
31
|
-
lib/css/sac/selectors/simple_selector.rb
|
32
|
-
lib/css/sac/token.rb
|
33
|
-
lib/css/sac/tokenizer.rb
|
34
|
-
lib/css/sac/visitable.rb
|
35
|
-
lib/css/stylesheet.rb
|
36
|
-
lib/css/stylesheet/rule.rb
|
37
|
-
lib/css/stylesheet/stylesheet.rb
|
38
6
|
lib/csspool.rb
|
39
|
-
lib/
|
40
|
-
lib/
|
41
|
-
lib/
|
42
|
-
|
7
|
+
lib/csspool/collection.rb
|
8
|
+
lib/csspool/css.rb
|
9
|
+
lib/csspool/css/charset.rb
|
10
|
+
lib/csspool/css/declaration.rb
|
11
|
+
lib/csspool/css/document.rb
|
12
|
+
lib/csspool/css/document_handler.rb
|
13
|
+
lib/csspool/css/import_rule.rb
|
14
|
+
lib/csspool/css/media.rb
|
15
|
+
lib/csspool/css/rule_set.rb
|
16
|
+
lib/csspool/lib_croco.rb
|
17
|
+
lib/csspool/lib_croco/cr_additional_sel.rb
|
18
|
+
lib/csspool/lib_croco/cr_attr_sel.rb
|
19
|
+
lib/csspool/lib_croco/cr_doc_handler.rb
|
20
|
+
lib/csspool/lib_croco/cr_num.rb
|
21
|
+
lib/csspool/lib_croco/cr_parser.rb
|
22
|
+
lib/csspool/lib_croco/cr_parsing_location.rb
|
23
|
+
lib/csspool/lib_croco/cr_pseudo.rb
|
24
|
+
lib/csspool/lib_croco/cr_rgb.rb
|
25
|
+
lib/csspool/lib_croco/cr_selector.rb
|
26
|
+
lib/csspool/lib_croco/cr_simple_sel.rb
|
27
|
+
lib/csspool/lib_croco/cr_term.rb
|
28
|
+
lib/csspool/lib_croco/glist.rb
|
29
|
+
lib/csspool/node.rb
|
30
|
+
lib/csspool/sac.rb
|
31
|
+
lib/csspool/sac/document.rb
|
32
|
+
lib/csspool/sac/parser.rb
|
33
|
+
lib/csspool/selector.rb
|
34
|
+
lib/csspool/selectors.rb
|
35
|
+
lib/csspool/selectors/additional.rb
|
36
|
+
lib/csspool/selectors/attribute.rb
|
37
|
+
lib/csspool/selectors/class.rb
|
38
|
+
lib/csspool/selectors/id.rb
|
39
|
+
lib/csspool/selectors/pseudo_class.rb
|
40
|
+
lib/csspool/selectors/simple.rb
|
41
|
+
lib/csspool/selectors/type.rb
|
42
|
+
lib/csspool/selectors/universal.rb
|
43
|
+
lib/csspool/terms.rb
|
44
|
+
lib/csspool/terms/function.rb
|
45
|
+
lib/csspool/terms/hash.rb
|
46
|
+
lib/csspool/terms/ident.rb
|
47
|
+
lib/csspool/terms/number.rb
|
48
|
+
lib/csspool/terms/rgb.rb
|
49
|
+
lib/csspool/terms/string.rb
|
50
|
+
lib/csspool/terms/uri.rb
|
51
|
+
lib/csspool/visitable.rb
|
52
|
+
lib/csspool/visitors.rb
|
53
|
+
lib/csspool/visitors/comparable.rb
|
54
|
+
lib/csspool/visitors/to_css.rb
|
55
|
+
lib/csspool/visitors/visitor.rb
|
56
|
+
test/css/test_document.rb
|
57
|
+
test/css/test_import_rule.rb
|
43
58
|
test/helper.rb
|
44
|
-
test/
|
45
|
-
test/
|
46
|
-
test/
|
47
|
-
test/
|
48
|
-
test/test_child_selector.rb
|
49
|
-
test/test_class_condition.rb
|
50
|
-
test/test_combinator_condition.rb
|
51
|
-
test/test_condition.rb
|
52
|
-
test/test_conditional_selector.rb
|
53
|
-
test/test_descendant_selector.rb
|
54
|
-
test/test_element_selector.rb
|
55
|
-
test/test_error_recovery.rb
|
56
|
-
test/test_id_condition.rb
|
57
|
-
test/test_lexeme.rb
|
58
|
-
test/test_lexical_color.rb
|
59
|
-
test/test_lexical_function.rb
|
60
|
-
test/test_lexical_ident.rb
|
61
|
-
test/test_lexical_number.rb
|
62
|
-
test/test_lexical_string.rb
|
63
|
-
test/test_lexical_unit.rb
|
64
|
-
test/test_lexical_uri.rb
|
65
|
-
test/test_one_of_condition.rb
|
66
|
-
test/test_parse_error.rb
|
59
|
+
test/sac/test_parser.rb
|
60
|
+
test/sac/test_properties.rb
|
61
|
+
test/sac/test_terms.rb
|
62
|
+
test/test_collection.rb
|
67
63
|
test/test_parser.rb
|
68
|
-
test/test_property_parser.rb
|
69
64
|
test/test_selector.rb
|
70
|
-
test/
|
71
|
-
test/
|
72
|
-
test/test_sibling_selector.rb
|
73
|
-
test/test_simple_selector.rb
|
74
|
-
test/test_specificity.rb
|
75
|
-
test/test_stylesheet.rb
|
76
|
-
test/test_token.rb
|
77
|
-
test/test_tokenizer.rb
|
78
|
-
test/test_xpath.rb
|
65
|
+
test/visitors/test_comparable.rb
|
66
|
+
test/visitors/test_to_css.rb
|
data/README.rdoc
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
= CSSPool
|
2
|
+
|
3
|
+
* http://csspool.rubyforge.org
|
4
|
+
* http://github.com/tenderlove/csspool
|
5
|
+
|
6
|
+
== DESCRIPTION:
|
7
|
+
|
8
|
+
CSSPool is a CSS parser. CSSPool provides a SAC interface for parsing CSS as
|
9
|
+
well as a document oriented interface for parsing CSS.
|
10
|
+
|
11
|
+
== FEATURES/PROBLEMS:
|
12
|
+
|
13
|
+
CSSPool now depends on libcroco[http://www.freespiders.org/projects/libcroco/]
|
14
|
+
and interfaces with libcroco via FFI. This means that if libcroco isn't
|
15
|
+
installed in one of your default library paths, you'll need to tell CSSPool
|
16
|
+
where to find the libcroco shared library. This is typically the case for
|
17
|
+
people using OS X and installing libcroco via macports.
|
18
|
+
|
19
|
+
You can tell CSSPool where to find the libcroco shared library in a couple ways.
|
20
|
+
The first way is to set LD_LIBRARY_PATH to point at the correct directory. Just
|
21
|
+
do this:
|
22
|
+
|
23
|
+
$ export LD_LIBRARY_PATH=/opt/local/lib
|
24
|
+
|
25
|
+
Then run your script.
|
26
|
+
|
27
|
+
The second way is to tell CSSPool specifically where to find the dynamic
|
28
|
+
library. To do that, just set the LIBCROCO environment variable. On OS X,
|
29
|
+
I would do this:
|
30
|
+
|
31
|
+
$ export LIBCROCO=/opt/local/lib/libcroco-0.6.dylib
|
32
|
+
|
33
|
+
Then run my script.
|
34
|
+
|
35
|
+
== SYNOPSIS:
|
36
|
+
|
37
|
+
doc = CSSPool.CSS open('/path/to/css.css')
|
38
|
+
doc.rule_sets.each do |rs|
|
39
|
+
puts rs.to_css
|
40
|
+
end
|
41
|
+
|
42
|
+
puts doc.to_css
|
43
|
+
|
44
|
+
== REQUIREMENTS:
|
45
|
+
|
46
|
+
* libcroco (on OS X do "sudo port install libcroco")
|
47
|
+
|
48
|
+
== INSTALL:
|
49
|
+
|
50
|
+
* sudo gem install csspool
|
51
|
+
|
52
|
+
== LICENSE:
|
53
|
+
|
54
|
+
(The MIT License)
|
55
|
+
|
56
|
+
Copyright (c) 2007-2009
|
57
|
+
|
58
|
+
* {Aaron Patterson}[http://tenderlovemaking.com]
|
59
|
+
* {John Barnette}[http://www.jbarnette.com/]
|
60
|
+
|
61
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
62
|
+
a copy of this software and associated documentation files (the
|
63
|
+
'Software'), to deal in the Software without restriction, including
|
64
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
65
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
66
|
+
permit persons to whom the Software is furnished to do so, subject to
|
67
|
+
the following conditions:
|
68
|
+
|
69
|
+
The above copyright notice and this permission notice shall be
|
70
|
+
included in all copies or substantial portions of the Software.
|
71
|
+
|
72
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
73
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
74
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
75
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
76
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
77
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
78
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -1,57 +1,14 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
1
3
|
require 'rubygems'
|
2
|
-
require 'erb'
|
3
4
|
require 'hoe'
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
p.rubyforge_name = 'csspool'
|
12
|
-
p.author = 'Aaron Patterson'
|
13
|
-
p.email = 'aaronp@rubyforge.org'
|
14
|
-
p.summary = "Parses CSS"
|
15
|
-
p.description = p.paragraphs_of('README.txt', 3).join("\n\n")
|
16
|
-
p.url = p.paragraphs_of('README.txt', 1).first.strip
|
17
|
-
p.changes = p.paragraphs_of('CHANGELOG.txt', 0..1).join("\n\n")
|
18
|
-
p.clean_globs = [GENERATED_PARSER, GENERATED_PROPERTY_PARSER]
|
19
|
-
end
|
20
|
-
|
21
|
-
class Array
|
22
|
-
def permutations
|
23
|
-
return [self] if size < 2
|
24
|
-
perm = []
|
25
|
-
each { |e| (self - [e]).permutations.each { |p| perm << ([e] + p) } }
|
26
|
-
perm
|
27
|
-
end
|
28
|
-
|
29
|
-
def permute_all_combinations
|
30
|
-
list = []
|
31
|
-
permutations.each do |perm|
|
32
|
-
while perm.length > 0
|
33
|
-
list << perm.dup
|
34
|
-
perm.shift
|
35
|
-
end
|
36
|
-
end
|
37
|
-
list.uniq.sort_by { |x| x.length }.reverse
|
38
|
-
end
|
6
|
+
Hoe.spec('csspool') do
|
7
|
+
developer('Aaron Patterson', 'aaronp@rubyforge.org')
|
8
|
+
developer('John Barnette', 'jabarnette@rubyforge.org')
|
9
|
+
self.readme_file = 'README.rdoc'
|
10
|
+
self.history_file = 'CHANGELOG.rdoc'
|
11
|
+
self.extra_deps = ['ffi']
|
39
12
|
end
|
40
13
|
|
41
|
-
|
42
|
-
sh "racc -o #{t.name} #{t.prerequisites.first}"
|
43
|
-
end
|
44
|
-
|
45
|
-
file GENERATED_PROPERTY_PARSER => "lib/property_parser.y.erb" do |t|
|
46
|
-
template = ERB.new(File.open(t.prerequisites.first, 'rb') { |x| x.read })
|
47
|
-
File.open("lib/property_parser.y", 'wb') { |f|
|
48
|
-
f.write template.result(binding)
|
49
|
-
}
|
50
|
-
sh "racc -o #{t.name} lib/property_parser.y"
|
51
|
-
end
|
52
|
-
|
53
|
-
task :parser => [GENERATED_PARSER, GENERATED_PROPERTY_PARSER]
|
54
|
-
|
55
|
-
# make sure the parser's up-to-date when we test
|
56
|
-
Rake::Task[:test].prerequisites << :parser
|
57
|
-
Rake::Task[:check_manifest].prerequisites << :parser
|
14
|
+
# vim: syntax=Ruby
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module CSSPool
|
2
|
+
class Collection
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize &block
|
6
|
+
@docs = []
|
7
|
+
@block = block
|
8
|
+
end
|
9
|
+
|
10
|
+
def << string
|
11
|
+
doc = CSSPool.CSS string
|
12
|
+
|
13
|
+
import_tree = [[doc]]
|
14
|
+
|
15
|
+
imported_urls = {}
|
16
|
+
|
17
|
+
until import_tree.last.all? { |x| x.import_rules.length == 0 }
|
18
|
+
level = import_tree.last
|
19
|
+
import_tree << []
|
20
|
+
level.each do |doc|
|
21
|
+
doc.import_rules.each do |ir|
|
22
|
+
next if imported_urls.key? ir.uri
|
23
|
+
|
24
|
+
new_doc = ir.load(&@block)
|
25
|
+
|
26
|
+
imported_urls[ir.uri] = ir.load(&@block)
|
27
|
+
import_tree.last << new_doc
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
@docs += import_tree.flatten.reverse
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
def length
|
37
|
+
@docs.length
|
38
|
+
end
|
39
|
+
|
40
|
+
def [] idx
|
41
|
+
@docs[idx]
|
42
|
+
end
|
43
|
+
|
44
|
+
def each &block
|
45
|
+
@docs.each(&block)
|
46
|
+
end
|
47
|
+
|
48
|
+
def last; @docs.last; end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module CSS
|
3
|
+
class Document < Node
|
4
|
+
def self.parse string
|
5
|
+
unless string && string.length > 0
|
6
|
+
return CSSPool::CSS::Document.new
|
7
|
+
end
|
8
|
+
handler = CSSPool::CSS::DocumentHandler.new
|
9
|
+
parser = CSSPool::SAC::Parser.new(handler)
|
10
|
+
parser.parse(string)
|
11
|
+
handler.document
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :rule_sets
|
15
|
+
attr_accessor :charsets
|
16
|
+
attr_accessor :import_rules
|
17
|
+
attr_accessor :parent
|
18
|
+
attr_accessor :parent_import_rule
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@rule_sets = []
|
22
|
+
@charsets = []
|
23
|
+
@import_rules = []
|
24
|
+
@parent = nil
|
25
|
+
@parent_import_rule = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def [] selector
|
29
|
+
selectors = CSSPool.CSS("#{selector} {}").rule_sets.first.selectors
|
30
|
+
rule_sets.find_all { |rs| rs.selectors == selectors}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module CSS
|
3
|
+
class DocumentHandler < CSSPool::SAC::Document
|
4
|
+
attr_accessor :document
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@document = nil
|
8
|
+
@media_stack = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def start_document
|
12
|
+
@document = CSSPool::CSS::Document.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def charset name, location
|
16
|
+
@document.charsets << CSS::Charset.new(name, location)
|
17
|
+
end
|
18
|
+
|
19
|
+
def import_style media_list, uri, ns, loc
|
20
|
+
@document.import_rules << CSS::ImportRule.new(
|
21
|
+
uri,
|
22
|
+
ns,
|
23
|
+
media_list.map { |x| CSS::Media.new(x, loc) },
|
24
|
+
@document,
|
25
|
+
loc
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def start_selector selector_list
|
30
|
+
@document.rule_sets << RuleSet.new(
|
31
|
+
selector_list,
|
32
|
+
[],
|
33
|
+
@media_stack.last || []
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def property name, exp, important
|
38
|
+
rs = @document.rule_sets.last
|
39
|
+
rs.declarations << Declaration.new(name, exp, important, rs)
|
40
|
+
end
|
41
|
+
|
42
|
+
def start_media media_list, parse_location
|
43
|
+
@media_stack << media_list.map { |x| CSS::Media.new(x, parse_location) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def end_media media_list, parse_location
|
47
|
+
@media_stack.pop
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -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
|
data/lib/csspool/css.rb
ADDED
@@ -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
|