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
data/CHANGELOG.rdoc
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
== 2.0.2
|
2
|
+
|
3
|
+
* Selector '#a > #b', '#a #b' and the like where not converted correctly to css. fixed [Maca]
|
4
|
+
|
5
|
+
== 2.0.0
|
6
|
+
|
7
|
+
* Bugfixes
|
8
|
+
|
9
|
+
* Uh... Many.
|
10
|
+
|
11
|
+
* New Features
|
12
|
+
|
13
|
+
* Now wraps libcroco via FFI
|
14
|
+
|
15
|
+
== 0.2.6
|
16
|
+
|
17
|
+
* Fix comment greediness. [Seth Rasmussen]
|
18
|
+
|
19
|
+
== 0.2.5
|
20
|
+
|
21
|
+
* Accepting spaces after error rules.
|
22
|
+
* Comments with asterisks tokenize correctly. [Seth Rasmussen]
|
23
|
+
* Stop polluting the global namespace with includes. [Thomas Kadauke]
|
24
|
+
|
25
|
+
== 0.2.4
|
26
|
+
|
27
|
+
* Fixed error handling on at rules. Thanks Dan for tests!
|
28
|
+
* Made specificity an array
|
29
|
+
* Made StyleSheet::Rule comparable on specificity
|
30
|
+
|
31
|
+
== 0.2.3
|
32
|
+
|
33
|
+
* Fixed a bug where nil selectors on conditional selectors were being visited.
|
34
|
+
|
35
|
+
== 0.2.2
|
36
|
+
|
37
|
+
* I suck.
|
38
|
+
|
39
|
+
== 0.2.1
|
40
|
+
|
41
|
+
* Recovering from unexpected tokens in the properties section.
|
42
|
+
|
43
|
+
== 0.2.0
|
44
|
+
|
45
|
+
* Added CSS::SAC::Parser#parse_rule to parse a single rule.
|
46
|
+
* Added CSS::StyleSheet#find_rule for finding a particular rule.
|
47
|
+
* Added CSS::StyleSheet#rules_matching for finding all rules matching a node.
|
48
|
+
* Added CSS::StyleSheet#create_rule for creating a new rule.
|
49
|
+
* Added CSS::StyleSheet#find_all_rules_matching for finding all rules that match
|
50
|
+
any node in the passed in document.
|
51
|
+
* Added .eql? to selector AST
|
52
|
+
* Added .hash to selector AST
|
53
|
+
* Added .eql? to LexicalUnits
|
54
|
+
* Added .hash to LexicalUnits
|
55
|
+
* Added CSS::StyleSheet#to_css
|
56
|
+
* Added CSS::StyleSheet#reduce!
|
57
|
+
* CSS::StyleSheet is now the default document handler
|
58
|
+
|
59
|
+
== 0.1.1
|
60
|
+
|
61
|
+
* Added specificity to selectors.
|
62
|
+
* Added == to selector ASTs.
|
63
|
+
* Added =~ to selector ASTs. The object passed in to =~ must quack like an
|
64
|
+
hpricot node. It must implement the following methods: name, parent, child,
|
65
|
+
next_sibling, attributes.
|
66
|
+
* Added .to_xpath to the selector AST.
|
67
|
+
* Fixed a bug where functions as pseudo classes didn't parse.
|
68
|
+
|
69
|
+
== 0.1.0
|
70
|
+
|
71
|
+
* Birthday!
|
72
|
+
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
CHANGELOG.rdoc
|
2
|
+
History.txt
|
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/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/children.rb
|
54
|
+
lib/csspool/visitors/comparable.rb
|
55
|
+
lib/csspool/visitors/iterator.rb
|
56
|
+
lib/csspool/visitors/to_css.rb
|
57
|
+
lib/csspool/visitors/visitor.rb
|
58
|
+
test/css/test_document.rb
|
59
|
+
test/css/test_import_rule.rb
|
60
|
+
test/helper.rb
|
61
|
+
test/sac/test_parser.rb
|
62
|
+
test/sac/test_properties.rb
|
63
|
+
test/sac/test_terms.rb
|
64
|
+
test/test_collection.rb
|
65
|
+
test/test_parser.rb
|
66
|
+
test/test_selector.rb
|
67
|
+
test/visitors/test_children.rb
|
68
|
+
test/visitors/test_comparable.rb
|
69
|
+
test/visitors/test_each.rb
|
70
|
+
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
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
2
|
+
%w[rake rake/clean fileutils newgem rubigen].each { |f| require f }
|
3
|
+
require File.dirname(__FILE__) + '/lib/csspool'
|
4
|
+
|
5
|
+
$hoe = Hoe.new('maca-fork-csspool', CSSPool::VERSION) do |p|
|
6
|
+
p.developer('Aaron Patterson', 'aaronp@rubyforge.org')
|
7
|
+
p.developer('John Barnette', 'jabarnette@rubyforge.org')
|
8
|
+
|
9
|
+
p.changes = p.paragraphs_of("CHANGELOG.rdoc", 0..1).join("\n"*2)
|
10
|
+
p.extra_dev_deps = [
|
11
|
+
['newgem', ">= #{::Newgem::VERSION}"]
|
12
|
+
]
|
13
|
+
p.extra_deps = ['ffi']
|
14
|
+
p.clean_globs |= %w[**/.DS_Store tmp *.log]
|
15
|
+
path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
|
16
|
+
p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
|
17
|
+
p.rsync_args = '-av --delete --ignore-errors'
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'newgem/tasks' # load /tasks/*.rake
|
21
|
+
Dir['tasks/**/*.rake'].each { |t| load t }
|
22
|
+
|
23
|
+
|
24
|
+
# require 'rubygems'
|
25
|
+
# require 'hoe'
|
26
|
+
|
27
|
+
|
28
|
+
# Hoe.spec('csspool') do
|
29
|
+
# developer('Aaron Patterson', 'aaronp@rubyforge.org')
|
30
|
+
# developer('John Barnette', 'jabarnette@rubyforge.org')
|
31
|
+
# self.readme_file = 'README.rdoc'
|
32
|
+
# self.history_file = 'CHANGELOG.rdoc'
|
33
|
+
# self.extra_rdoc_files = FileList['*.rdoc']
|
34
|
+
# self.extra_deps = ['ffi']
|
35
|
+
# end
|
data/lib/csspool.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
2
|
+
|
3
|
+
require 'csspool/visitable'
|
4
|
+
require 'csspool/node'
|
5
|
+
require 'csspool/selectors'
|
6
|
+
require 'csspool/terms'
|
7
|
+
require 'csspool/selector'
|
8
|
+
require 'csspool/sac'
|
9
|
+
require 'csspool/lib_croco'
|
10
|
+
require 'csspool/css'
|
11
|
+
require 'csspool/visitors'
|
12
|
+
require 'csspool/collection'
|
13
|
+
|
14
|
+
module CSSPool
|
15
|
+
VERSION = "2.0.2"
|
16
|
+
|
17
|
+
def self.CSS doc
|
18
|
+
CSSPool::CSS::Document.parse doc
|
19
|
+
end
|
20
|
+
end
|
@@ -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
|
data/lib/csspool/css.rb
ADDED
@@ -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
|