csstree 0.0.1

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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
File without changes
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
@@ -0,0 +1,46 @@
1
+ # CSSTree
2
+
3
+ Ultra-simple CSS parser.
4
+
5
+ ### Parsing CSS
6
+
7
+ ```ruby
8
+ tree = CSSTree.parse("body { background-color: #FFFFFF; color: #000000; }")
9
+ # => #<CSSTree:0x123456>
10
+ ```
11
+
12
+ ### Finding Rules For A Selector
13
+
14
+ ```ruby
15
+ tree.find("body")
16
+ # => #<OpenStruct background_color="#FFFFFF" color="#000000">
17
+ ```
18
+
19
+ ### Access Properties
20
+
21
+ ```ruby
22
+ tree.find("body").color
23
+ # => "#000000"
24
+ ```
25
+
26
+ ### Access Dashed Property Names Using Underscores
27
+
28
+ ```ruby
29
+ tree.find("body").background_color
30
+ # => "#FFFFFF"
31
+ ```
32
+
33
+ ### Manipulating the Tree
34
+
35
+ ```ruby
36
+ tree.find("body").color = "#A3A3A3"
37
+ # => "#A3A3A3"
38
+ ```
39
+
40
+ ### Rendering Normal CSS
41
+
42
+ ```ruby
43
+ tree.render
44
+ # => "body { background-color: #FFFFFF; color: #A3A3A3; }
45
+ ```
46
+
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,18 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.dirname(__FILE__) + "/lib/csstree.rb"
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Matte Noble"]
6
+ gem.email = ["me@mattenoble.com"]
7
+ gem.description = %q{Ultra-simple CSS parser.}
8
+ gem.summary = %q{Ultra-simple CSS parser.}
9
+
10
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
11
+ gem.files = `git ls-files`.split("\n")
12
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
13
+ gem.name = "csstree"
14
+ gem.require_paths = ["lib"]
15
+ gem.version = CSSTree::VERSION
16
+
17
+ gem.add_development_dependency "rspec", "~> 2.6.0"
18
+ end
@@ -0,0 +1,67 @@
1
+ require "ostruct"
2
+ require "forwardable"
3
+
4
+ class CSSTree
5
+ VERSION = "0.0.1"
6
+ RULESET_REGEX = /([^{]*){([^}]*)}/
7
+
8
+ include Enumerable
9
+ extend Forwardable
10
+
11
+ def_delegators :"@tree", :each, :keys, :values, :[], :[]=, :includes?
12
+ alias :selectors :keys
13
+ alias :declarations :values
14
+
15
+ def self.parse s
16
+ new.parse s
17
+ end
18
+
19
+ def initialize
20
+ @tree = {}
21
+ end
22
+
23
+ def parse s
24
+ @tree = Hash[*trim(s).scan(RULESET_REGEX).collect { |a| parse_block *a }.flatten]
25
+ self
26
+ end
27
+
28
+ def find s
29
+ @tree[s]
30
+ end
31
+
32
+ def render
33
+ @tree.map { |s,d| "#{s.strip} { #{render_declarations d} }" }.join("\n")
34
+ end
35
+
36
+ def to_s
37
+ "#<CSSTree:0x#{self.object_id}>"
38
+ end
39
+
40
+ private
41
+
42
+ def render_declarations d
43
+ d.marshal_dump.map { |k,v| [deunderscore(k), v].join(": ") }.join("; ") + ";"
44
+ end
45
+
46
+ def parse_declarations d
47
+ r = d.strip.split(";").map { |d| d.split(":") }.map { |p,v| [underscore(p), v.strip] }
48
+ OpenStruct.new Hash[r]
49
+ end
50
+
51
+ def parse_block s, d
52
+ s.split(",").collect { |s| [s.strip, parse_declarations(d)] }.flatten
53
+ end
54
+
55
+ def trim s
56
+ s.gsub("\n", " ").gsub(/\s{2,}/, " ")
57
+ end
58
+
59
+ def underscore s
60
+ s.to_s.gsub("-", "_").strip
61
+ end
62
+
63
+ def deunderscore s
64
+ s.to_s.gsub("_", "-").strip
65
+ end
66
+ end
67
+
@@ -0,0 +1,45 @@
1
+ require "spec_helper"
2
+
3
+ describe CSSTree do
4
+ let(:tree) { CSSTree.new }
5
+
6
+ it "parses single-line css" do
7
+ tree.parse "body { color: #000000; }"
8
+ tree.find("body").color.should == "#000000"
9
+ end
10
+
11
+ it "converts dashed properties to underscores" do
12
+ tree.parse "body { background-color: #FFFFFF; }"
13
+ tree.find("body").background_color.should == "#FFFFFF"
14
+ end
15
+
16
+ it "parses multiple lines of css" do
17
+ tree.parse <<-CSS
18
+ body { color: #000000; }
19
+ p { color: #111111; }
20
+ ul { list-style: none; }
21
+ CSS
22
+ tree.selectors.should == %w(body p ul)
23
+ end
24
+
25
+ it "parses rules with multiple selectors" do
26
+ tree.parse "body, img { margin: 0 }"
27
+ tree.selectors.should == %w(body img)
28
+ end
29
+
30
+ it "parses multiline rules" do
31
+ tree.parse <<-CSS
32
+ body {
33
+ color: #000000;
34
+ padding: 10px;
35
+ }
36
+ CSS
37
+ tree.find("body").padding.should == "10px"
38
+ end
39
+
40
+ it "renders css back to text" do
41
+ tree.parse "body { background: #A2A2A2; }"
42
+ tree.find("body").background = "#999999"
43
+ tree.render.should == "body { background: #999999; }"
44
+ end
45
+ end
@@ -0,0 +1,2 @@
1
+ require "rspec"
2
+ require File.dirname(__FILE__) + "/../lib/csstree.rb"
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: csstree
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matte Noble
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-08-20 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &2158231020 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.6.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2158231020
25
+ description: Ultra-simple CSS parser.
26
+ email:
27
+ - me@mattenoble.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - .gitignore
33
+ - .rspec
34
+ - Gemfile
35
+ - README.md
36
+ - Rakefile
37
+ - csstree.gemspec
38
+ - lib/csstree.rb
39
+ - spec/csstree_spec.rb
40
+ - spec/spec_helper.rb
41
+ homepage:
42
+ licenses: []
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 1.8.6
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: Ultra-simple CSS parser.
65
+ test_files:
66
+ - spec/csstree_spec.rb
67
+ - spec/spec_helper.rb