csspool-st 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +16 -0
- data/.gemtest +0 -0
- data/CHANGELOG.rdoc +87 -0
- data/Manifest.txt +62 -0
- data/README.rdoc +65 -0
- data/Rakefile +50 -0
- data/lib/csspool/collection.rb +50 -0
- data/lib/csspool/css/charset.rb +13 -0
- data/lib/csspool/css/declaration.rb +19 -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 +27 -0
- data/lib/csspool/css/media.rb +13 -0
- data/lib/csspool/css/parser.rb +1298 -0
- data/lib/csspool/css/parser.y +398 -0
- data/lib/csspool/css/rule_set.rb +17 -0
- data/lib/csspool/css/tokenizer.rb +231 -0
- data/lib/csspool/css/tokenizer.rex +97 -0
- data/lib/csspool/css.rb +8 -0
- data/lib/csspool/node.rb +41 -0
- data/lib/csspool/sac/document.rb +35 -0
- data/lib/csspool/sac/parser.rb +16 -0
- data/lib/csspool/sac.rb +2 -0
- data/lib/csspool/selector.rb +36 -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 +9 -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 +20 -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/visitors/children.rb +50 -0
- data/lib/csspool/visitors/comparable.rb +84 -0
- data/lib/csspool/visitors/iterator.rb +80 -0
- data/lib/csspool/visitors/to_css.rb +248 -0
- data/lib/csspool/visitors/visitor.rb +17 -0
- data/lib/csspool/visitors.rb +5 -0
- data/lib/csspool.rb +21 -0
- data/test/css/test_document.rb +13 -0
- data/test/css/test_import_rule.rb +42 -0
- data/test/css/test_parser.rb +462 -0
- data/test/css/test_tokenizer.rb +320 -0
- data/test/helper.rb +65 -0
- data/test/sac/test_parser.rb +123 -0
- data/test/sac/test_properties.rb +43 -0
- data/test/sac/test_terms.rb +228 -0
- data/test/test_collection.rb +81 -0
- data/test/test_parser.rb +91 -0
- data/test/test_selector.rb +51 -0
- data/test/visitors/test_children.rb +20 -0
- data/test/visitors/test_comparable.rb +102 -0
- data/test/visitors/test_each.rb +19 -0
- data/test/visitors/test_to_css.rb +309 -0
- metadata +214 -0
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/.gemtest
ADDED
File without changes
|
data/CHANGELOG.rdoc
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
== 3.1.0
|
2
|
+
|
3
|
+
* New Features
|
4
|
+
|
5
|
+
* Support IE safe hacks
|
6
|
+
* Support pseudo-elements
|
7
|
+
* Support css3 media queries
|
8
|
+
|
9
|
+
* Bugfixes
|
10
|
+
|
11
|
+
* Support whitespace after properties
|
12
|
+
* Support missing semicolon after last declaration
|
13
|
+
|
14
|
+
== 3.0.0
|
15
|
+
|
16
|
+
* New Features
|
17
|
+
|
18
|
+
* Pure ruby: no longer uses C based back end.
|
19
|
+
|
20
|
+
== 2.0.0
|
21
|
+
|
22
|
+
* Bugfixes
|
23
|
+
|
24
|
+
* Uh... Many.
|
25
|
+
|
26
|
+
* New Features
|
27
|
+
|
28
|
+
* Now wraps libcroco via FFI
|
29
|
+
|
30
|
+
== 0.2.6
|
31
|
+
|
32
|
+
* Fix comment greediness. [Seth Rasmussen]
|
33
|
+
|
34
|
+
== 0.2.5
|
35
|
+
|
36
|
+
* Accepting spaces after error rules.
|
37
|
+
* Comments with asterisks tokenize correctly. [Seth Rasmussen]
|
38
|
+
* Stop polluting the global namespace with includes. [Thomas Kadauke]
|
39
|
+
|
40
|
+
== 0.2.4
|
41
|
+
|
42
|
+
* Fixed error handling on at rules. Thanks Dan for tests!
|
43
|
+
* Made specificity an array
|
44
|
+
* Made StyleSheet::Rule comparable on specificity
|
45
|
+
|
46
|
+
== 0.2.3
|
47
|
+
|
48
|
+
* Fixed a bug where nil selectors on conditional selectors were being visited.
|
49
|
+
|
50
|
+
== 0.2.2
|
51
|
+
|
52
|
+
* I suck.
|
53
|
+
|
54
|
+
== 0.2.1
|
55
|
+
|
56
|
+
* Recovering from unexpected tokens in the properties section.
|
57
|
+
|
58
|
+
== 0.2.0
|
59
|
+
|
60
|
+
* Added CSS::SAC::Parser#parse_rule to parse a single rule.
|
61
|
+
* Added CSS::StyleSheet#find_rule for finding a particular rule.
|
62
|
+
* Added CSS::StyleSheet#rules_matching for finding all rules matching a node.
|
63
|
+
* Added CSS::StyleSheet#create_rule for creating a new rule.
|
64
|
+
* Added CSS::StyleSheet#find_all_rules_matching for finding all rules that match
|
65
|
+
any node in the passed in document.
|
66
|
+
* Added .eql? to selector AST
|
67
|
+
* Added .hash to selector AST
|
68
|
+
* Added .eql? to LexicalUnits
|
69
|
+
* Added .hash to LexicalUnits
|
70
|
+
* Added CSS::StyleSheet#to_css
|
71
|
+
* Added CSS::StyleSheet#reduce!
|
72
|
+
* CSS::StyleSheet is now the default document handler
|
73
|
+
|
74
|
+
== 0.1.1
|
75
|
+
|
76
|
+
* Added specificity to selectors.
|
77
|
+
* Added == to selector ASTs.
|
78
|
+
* Added =~ to selector ASTs. The object passed in to =~ must quack like an
|
79
|
+
hpricot node. It must implement the following methods: name, parent, child,
|
80
|
+
next_sibling, attributes.
|
81
|
+
* Added .to_xpath to the selector AST.
|
82
|
+
* Fixed a bug where functions as pseudo classes didn't parse.
|
83
|
+
|
84
|
+
== 0.1.0
|
85
|
+
|
86
|
+
* Birthday!
|
87
|
+
|
data/Manifest.txt
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
.autotest
|
2
|
+
CHANGELOG.rdoc
|
3
|
+
Manifest.txt
|
4
|
+
README.rdoc
|
5
|
+
Rakefile
|
6
|
+
lib/csspool.rb
|
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/parser.rb
|
16
|
+
lib/csspool/css/parser.y
|
17
|
+
lib/csspool/css/rule_set.rb
|
18
|
+
lib/csspool/css/tokenizer.rb
|
19
|
+
lib/csspool/css/tokenizer.rex
|
20
|
+
lib/csspool/node.rb
|
21
|
+
lib/csspool/sac.rb
|
22
|
+
lib/csspool/sac/document.rb
|
23
|
+
lib/csspool/sac/parser.rb
|
24
|
+
lib/csspool/selector.rb
|
25
|
+
lib/csspool/selectors.rb
|
26
|
+
lib/csspool/selectors/additional.rb
|
27
|
+
lib/csspool/selectors/attribute.rb
|
28
|
+
lib/csspool/selectors/class.rb
|
29
|
+
lib/csspool/selectors/id.rb
|
30
|
+
lib/csspool/selectors/pseudo_class.rb
|
31
|
+
lib/csspool/selectors/simple.rb
|
32
|
+
lib/csspool/selectors/type.rb
|
33
|
+
lib/csspool/selectors/universal.rb
|
34
|
+
lib/csspool/terms.rb
|
35
|
+
lib/csspool/terms/function.rb
|
36
|
+
lib/csspool/terms/hash.rb
|
37
|
+
lib/csspool/terms/ident.rb
|
38
|
+
lib/csspool/terms/number.rb
|
39
|
+
lib/csspool/terms/rgb.rb
|
40
|
+
lib/csspool/terms/string.rb
|
41
|
+
lib/csspool/terms/uri.rb
|
42
|
+
lib/csspool/visitors.rb
|
43
|
+
lib/csspool/visitors/children.rb
|
44
|
+
lib/csspool/visitors/comparable.rb
|
45
|
+
lib/csspool/visitors/iterator.rb
|
46
|
+
lib/csspool/visitors/to_css.rb
|
47
|
+
lib/csspool/visitors/visitor.rb
|
48
|
+
test/css/test_document.rb
|
49
|
+
test/css/test_import_rule.rb
|
50
|
+
test/css/test_parser.rb
|
51
|
+
test/css/test_tokenizer.rb
|
52
|
+
test/helper.rb
|
53
|
+
test/sac/test_parser.rb
|
54
|
+
test/sac/test_properties.rb
|
55
|
+
test/sac/test_terms.rb
|
56
|
+
test/test_collection.rb
|
57
|
+
test/test_parser.rb
|
58
|
+
test/test_selector.rb
|
59
|
+
test/visitors/test_children.rb
|
60
|
+
test/visitors/test_comparable.rb
|
61
|
+
test/visitors/test_each.rb
|
62
|
+
test/visitors/test_to_css.rb
|
data/README.rdoc
ADDED
@@ -0,0 +1,65 @@
|
|
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 no longer depends on libcroco! There is now a dependency on both the
|
14
|
+
{racc}[http://github.com/tenderlove/racc] and
|
15
|
+
{rexical}[http://github.com/tenderlove/rexical] gems, so make sure to install
|
16
|
+
them first.
|
17
|
+
|
18
|
+
$ sudo gem install racc
|
19
|
+
$ sudo gem install rexical
|
20
|
+
|
21
|
+
== SYNOPSIS:
|
22
|
+
|
23
|
+
doc = CSSPool.CSS open('/path/to/css.css')
|
24
|
+
doc.rule_sets.each do |rs|
|
25
|
+
puts rs.to_css
|
26
|
+
end
|
27
|
+
|
28
|
+
puts doc.to_css
|
29
|
+
|
30
|
+
== REQUIREMENTS:
|
31
|
+
|
32
|
+
* racc ("sudo gem install racc")
|
33
|
+
* rexical ("sudo gem install rexical")
|
34
|
+
|
35
|
+
== INSTALL:
|
36
|
+
|
37
|
+
* sudo gem install csspool
|
38
|
+
|
39
|
+
== LICENSE:
|
40
|
+
|
41
|
+
(The MIT License)
|
42
|
+
|
43
|
+
Copyright (c) 2007-2012
|
44
|
+
|
45
|
+
* {Aaron Patterson}[http://tenderlovemaking.com]
|
46
|
+
* {John Barnette}[http://www.jbarnette.com/]
|
47
|
+
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
49
|
+
a copy of this software and associated documentation files (the
|
50
|
+
'Software'), to deal in the Software without restriction, including
|
51
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
52
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
53
|
+
permit persons to whom the Software is furnished to do so, subject to
|
54
|
+
the following conditions:
|
55
|
+
|
56
|
+
The above copyright notice and this permission notice shall be
|
57
|
+
included in all copies or substantial portions of the Software.
|
58
|
+
|
59
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
60
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
61
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
62
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
63
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
64
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
65
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
GENERATED_TOKENIZER = "lib/csspool/css/tokenizer.rb"
|
7
|
+
GENERATED_PARSER = "lib/csspool/css/parser.rb"
|
8
|
+
|
9
|
+
Hoe.plugin :git
|
10
|
+
Hoe.plugin :bundler
|
11
|
+
Hoe.plugin :gemspec
|
12
|
+
|
13
|
+
Hoe.spec('csspool-st') do
|
14
|
+
developer('Aaron Patterson', 'aaronp@rubyforge.org')
|
15
|
+
developer('John Barnette', 'jbarnette@rubyforge.org')
|
16
|
+
developer('stereobooster', 'stereobooster@gmail.com')
|
17
|
+
self.readme_file = 'README.rdoc'
|
18
|
+
self.history_file = 'CHANGELOG.rdoc'
|
19
|
+
self.extra_rdoc_files = FileList['*.rdoc']
|
20
|
+
|
21
|
+
%w{racc rexical hoe-git hoe-gemspec hoe-bundler}.each do |dep|
|
22
|
+
self.extra_dev_deps << [dep, '>= 0']
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
[:test, :check_manifest, "gem:spec"].each do |task_name|
|
27
|
+
Rake::Task[task_name].prerequisites << :compile
|
28
|
+
end
|
29
|
+
|
30
|
+
task :compile => [GENERATED_TOKENIZER, GENERATED_PARSER]
|
31
|
+
|
32
|
+
file GENERATED_TOKENIZER => "lib/csspool/css/tokenizer.rex" do |t|
|
33
|
+
begin
|
34
|
+
sh "bundle exec rex -i --independent -o #{t.name} #{t.prerequisites.first}"
|
35
|
+
rescue
|
36
|
+
abort "need rexical, sudo gem install rexical"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
file GENERATED_PARSER => "lib/csspool/css/parser.y" do |t|
|
41
|
+
begin
|
42
|
+
racc = 'bundle exec racc'
|
43
|
+
#sh "#{racc} -l -o #{t.name} #{t.prerequisites.first}"
|
44
|
+
sh "#{racc} -o #{t.name} #{t.prerequisites.first}"
|
45
|
+
rescue
|
46
|
+
abort "need racc, sudo gem install racc"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# 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 |l|
|
21
|
+
l.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,19 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module CSS
|
3
|
+
class Declaration < CSSPool::Node
|
4
|
+
attr_accessor :property
|
5
|
+
attr_accessor :expressions
|
6
|
+
attr_accessor :important
|
7
|
+
attr_accessor :rule_set
|
8
|
+
|
9
|
+
alias :important? :important
|
10
|
+
|
11
|
+
def initialize property, expressions, important, rule_set
|
12
|
+
@property = property
|
13
|
+
@expressions = expressions
|
14
|
+
@important = important
|
15
|
+
@rule_set = rule_set
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
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 = nil, 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,27 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module CSS
|
3
|
+
class ImportRule < CSSPool::Node
|
4
|
+
attr_accessor :uri
|
5
|
+
attr_accessor :namespace
|
6
|
+
attr_accessor :media
|
7
|
+
attr_accessor :document
|
8
|
+
attr_accessor :parse_location
|
9
|
+
|
10
|
+
def initialize uri, namespace, media, document, parse_location
|
11
|
+
@uri = uri
|
12
|
+
@namespace = namespace
|
13
|
+
@media = media
|
14
|
+
@document = document
|
15
|
+
@parse_location = parse_location
|
16
|
+
end
|
17
|
+
|
18
|
+
def load
|
19
|
+
new_doc = CSSPool.CSS(yield uri.value)
|
20
|
+
new_doc.parent_import_rule = self
|
21
|
+
new_doc.parent = document
|
22
|
+
new_doc.rule_sets.each { |rs| rs.media = media }
|
23
|
+
new_doc
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|