stylesheet 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -8,52 +8,66 @@ Get styles from a document:
8
8
 
9
9
  ```ruby
10
10
  document = Stylesheet::Document.new("http://sportspyder.com")
11
+ => #<Document location:http://sportspyder.com/>
12
+
11
13
  document.style_sheets
14
+ => [#<Stylesheet::CssStyleSheet:0x007fa905c58c20>,
15
+ #<Stylesheet::CssStyleSheet:0x007fa905c5f430>,
16
+ #<Stylesheet::CssStyleSheet:0x007fa905c5e968>]
12
17
  ```
13
18
 
14
19
  Get attributes of a stylesheet:
15
20
 
16
21
  ```ruby
17
22
  sheet = document.style_sheets[0]
18
- puts sheet.href
19
- puts sheet.type
23
+ => #<Stylesheet::CssStyleSheet:0x007fa905c58c20>
24
+
25
+ sheet.href
26
+ => "http://sportspyder.com/assets/application-26ff2c8d54ab9cd8e74af60fc650390e.css"
27
+
28
+ sheet.type
29
+ => "text/css"
20
30
  ```
21
31
 
22
32
  Get stylesheet media definitions:
23
33
 
24
34
  ```ruby
25
- sheet = document.style_sheets[0]
26
- sheet.media.each do |media|
27
- puts media
28
- end
35
+ sheet.media.map {|medium| medium }
36
+ => ["screen"]
29
37
  ```
30
38
 
31
39
  Get rules defined in a stylesheet:
32
40
 
33
41
  ```ruby
34
42
  sheet = Stylesheet::CssStyleSheet.new("http://sportspyder.com/stylesheets/screen.css")
35
- sheet.css_rules.each do |rule|
36
- puts rule.css_text
37
- puts rule.selector_text
38
- end
43
+ => #<Stylesheet::CssStyleSheet:0x007fa905c58c20>
44
+
45
+ rule = sheet.css_rules[0]
46
+ => #<Stylesheet::CssStyleRule>
47
+
48
+ rule.css_text
49
+ => "iframe.editor{width:580px;height:150px;border:1px solid #ccc;background-color:#fff}"
50
+
51
+ rule.selector_text
52
+ => "iframe.editor"
39
53
  ```
40
54
 
41
55
  Get declarations defined in a style rules:
42
56
 
43
57
  ```ruby
44
- sheet = document.style_sheets[0]
45
- rule = sheet.css_rules[0]
46
- puts rule.style[0]
47
- puts rule.style.border
58
+ rule.style[0]
59
+ => "width:580px"
60
+
61
+ rule.style.border
62
+ => "1px solid #ccc"
48
63
  ```
49
64
 
50
65
  ## Installation
51
66
 
52
- ```
53
- gem install stylesheet
54
- ```
55
- ```
56
- gem "stylesheet"
67
+ To install Stylesheet, add the gem to your Gemfile:
68
+
69
+ ```ruby
70
+ gem "stylesheet", "~> 0.1.0"
57
71
  ```
58
72
 
59
73
  ## LICENSE
@@ -12,7 +12,9 @@ module Stylesheet
12
12
  end
13
13
 
14
14
  def style_sheet
15
- @style_sheet ||= CssStyleSheet.new(location.href)
15
+ @style_sheet ||= CssStyleSheet.new(:href => location.href,
16
+ :owner_rule => self,
17
+ :parent => parent_style_sheet)
16
18
  end
17
19
 
18
20
  def self.matches_rule?(text)
@@ -1,7 +1,7 @@
1
1
  module Stylesheet
2
2
  class CssRuleList
3
3
  extend Forwardable
4
- def_delegators :@rules, :length, :size, :[], :each, :to_s
4
+ def_delegators :@rules, :length, :size, :[], :each, :insert, :delete_at, :to_s
5
5
  include Enumerable
6
6
 
7
7
  def initialize(rules, parent = nil)
@@ -11,10 +11,13 @@ module Stylesheet
11
11
  def item(index)
12
12
  @rules[index]
13
13
  end
14
-
14
+
15
15
  private
16
16
 
17
17
  def parse(rules, parent)
18
+ # clean out comments
19
+ rules = rules.gsub(/\/\*[\s\S]*?\*\//, '')
20
+
18
21
  # clean extraneous whitespace
19
22
  rules = rules.to_s.gsub(/\s+/m, " ").gsub(/([\};])\s/, '\1')
20
23
 
@@ -1,35 +1,36 @@
1
1
  module Stylesheet
2
2
  class CssStyleDeclaration
3
3
  extend Forwardable
4
- def_delegators :@declarations, :length, :size, :[], :each, :<<, :push, :delete, :to_s
4
+ def_delegators :@declarations_list, :length, :size, :[], :each, :<<, :push, :delete, :to_s
5
5
  include Enumerable
6
6
 
7
- attr_reader :parent_rule
7
+ attr_reader :declarations, :parent_rule
8
8
 
9
9
  def initialize(options={})
10
+ @declarations = Hash.new("")
10
11
  @parent_rule = options[:parent_rule]
11
12
  self.css_text = options[:css_text]
12
13
  end
13
14
 
14
15
  def css_text=(css_text)
15
- @declarations, @rules = [], Hash.new("")
16
+ @declarations_list = []
16
17
 
17
18
  css_text.to_s.strip.chomp(";").split(";").each do |declaration|
18
19
  property, value = declaration.split(":", 2)
19
- @declarations << declaration.strip
20
- @rules[Inflector.camelize(property.strip)] = parse_value(value.strip)
20
+ @declarations_list << declaration.strip
21
+ @declarations[property.strip] = parse_value(value.strip)
21
22
  end
22
23
  end
23
24
 
24
25
  def css_text
25
- css_text = @declarations.join("; ")
26
+ css_text = @declarations_list.join("; ")
26
27
  css_text += ";" if css_text != ""
27
28
  end
28
29
 
29
30
  alias_method :to_s, :css_text
30
31
 
31
32
  def method_missing(name, *args)
32
- @rules[name.to_s]
33
+ @declarations[Inflector.dasherize(name.to_s)]
33
34
  end
34
35
 
35
36
  private
@@ -1,9 +1,9 @@
1
1
  module Stylesheet
2
2
  class CssStyleSheet
3
3
  attr_accessor :parent, :title
4
- attr_reader :href, :media
4
+ attr_reader :href, :media, :owner_rule
5
5
  attr_writer :disabled, :type
6
-
6
+
7
7
  def initialize(args)
8
8
  if args.kind_of?(String)
9
9
  init_with_url(args)
@@ -11,18 +11,19 @@ module Stylesheet
11
11
  init_with_hash(args)
12
12
  end
13
13
  end
14
-
14
+
15
15
  def init_with_url(url)
16
16
  self.href = url
17
17
  self.media = ""
18
18
  self.content = nil
19
19
  end
20
-
20
+
21
21
  def init_with_hash(args)
22
- @parent = args[:parent]
23
- @title = args[:title]
24
- @type = args[:type]
25
-
22
+ @parent = args[:parent]
23
+ @title = args[:title]
24
+ @type = args[:type]
25
+ @owner_rule = args[:owner_rule]
26
+
26
27
  self.href = args[:href]
27
28
  self.location = args[:location]
28
29
  self.media = args[:media]
@@ -32,25 +33,25 @@ module Stylesheet
32
33
  def disabled?
33
34
  @disabled || false
34
35
  end
35
-
36
+
36
37
  def type
37
38
  @type || "text/css"
38
39
  end
39
-
40
+
40
41
  def href=(url)
41
42
  return unless url
42
43
  @url = url
43
44
  @href = location.to_s
44
45
  end
45
-
46
+
46
47
  def media=(media)
47
48
  @media ||= MediaList.new(media)
48
49
  end
49
-
50
+
50
51
  def content=(content)
51
52
  @content = content if content != ""
52
53
  end
53
-
54
+
54
55
  def content
55
56
  @content ||= request_content
56
57
  end
@@ -62,14 +63,22 @@ module Stylesheet
62
63
  alias_method :rules, :css_rules
63
64
 
64
65
  def parent_style_sheet
65
- parent
66
+ @parent if @owner_rule
67
+ end
68
+
69
+ def delete_rule(index)
70
+ @css_rules.delete_at(index)
71
+ end
72
+
73
+ def insert_rule(rule, index)
74
+ @css_rules.insert(index, rule)
66
75
  end
67
-
76
+
68
77
  def location
69
78
  return if inline_css?
70
79
  @location ||= Location.new(@url, parent && parent.location)
71
80
  end
72
-
81
+
73
82
  def location=(location)
74
83
  return unless location
75
84
 
@@ -83,7 +92,7 @@ module Stylesheet
83
92
  def standalone_css?
84
93
  !parent
85
94
  end
86
-
95
+
87
96
  def inline_css?
88
97
  !@url || @url == ""
89
98
  end
@@ -8,12 +8,12 @@ module Stylesheet
8
8
 
9
9
  curl.body_str
10
10
 
11
- rescue Stylsheet::Error
11
+ rescue Stylesheet::Error
12
12
  raise
13
13
 
14
14
  # re-raise external library errors in our namespace
15
15
  rescue => error
16
- raise Stylsheet::Error.new("#{error.class}: #{error.message}")
16
+ raise Stylesheet::Error.new("#{error.class}: #{error.message}")
17
17
  end
18
18
 
19
19
  def user_agent
@@ -1,3 +1,3 @@
1
1
  module Stylesheet
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -21,9 +21,9 @@ describe CssImportRule do
21
21
  let(:parent) do
22
22
  CssStyleSheet.new("http://example.com/css_import/stylesheets/screen.css")
23
23
  end
24
-
24
+
25
25
  let(:rule_url) { "http://example.com/css_import/stylesheets/import1.css" }
26
-
26
+
27
27
  it "parses an url from the style rule" do
28
28
  css_text = "@import url(\"http://example.com/css_import/stylesheets/import1.css\");"
29
29
 
@@ -23,7 +23,19 @@ describe CssRuleList do
23
23
  src: url(\"http://example.com/fonts/VeraSeBd.ttf\");
24
24
  }"
25
25
  end
26
-
26
+
27
+ let(:style_w_comments) do
28
+ "body {
29
+ color: #444;
30
+ background-color: #535353;
31
+ }
32
+
33
+ /* style paragraphs */
34
+ p {
35
+ font-size: 90%;
36
+ }"
37
+ end
38
+
27
39
  describe ".new" do
28
40
  it "parses charset rules" do
29
41
  rules = CssRuleList.new(styles)
@@ -49,6 +61,13 @@ describe CssRuleList do
49
61
  rules = CssRuleList.new(styles)
50
62
  expect(rules[4]).to be_kind_of(CssFontFaceRule)
51
63
  end
64
+
65
+ it "removes comments" do
66
+ rules = CssRuleList.new(style_w_comments)
67
+ expect(rules.length).to eq 2
68
+ expect(rules[0].css_text).to eq "body { color: #444;background-color: #535353;}"
69
+ expect(rules[1].css_text).to eq "p { font-size: 90%;}"
70
+ end
52
71
  end
53
72
 
54
73
  describe "#[]" do
@@ -51,6 +51,17 @@ describe CssStyleDeclaration do
51
51
  end
52
52
  end
53
53
 
54
+ describe "rules" do
55
+ it "returns a hash of rules" do
56
+ expected = {"color" => "#444",
57
+ "font-size" => "12px",
58
+ "font-family" => "Arial, Verdana",
59
+ "border-left" => "1px solid red",
60
+ "border-right-width" => "1px",
61
+ "background-color" => "#535353"}
62
+ expect(declaration.declarations).to eq expected
63
+ end
64
+ end
54
65
 
55
66
  describe "#parent_rule" do
56
67
  it "returns the parent css style rule" do
@@ -90,15 +90,20 @@ describe CssStyleSheet do
90
90
  end
91
91
  end
92
92
 
93
- describe "#owner_node" do
94
- it "references owning node" do
93
+ describe "#parent_style_sheet" do
94
+ let(:parent) do
95
+ CssStyleSheet.new("http://example.com/css_import/stylesheets/screen.css")
96
+ end
95
97
 
98
+ it "should be nil for non-imported sheets" do
99
+ expect(parent.parent_style_sheet).to be_nil
96
100
  end
97
- end
98
-
99
- describe "#parent_style_sheet" do
101
+
100
102
  it "references parent style sheet" do
103
+ text = "@import url(\"import1.css\");"
104
+ rule = CssImportRule.new(:css_text => text, :parent_style_sheet => parent)
101
105
 
106
+ expect(rule.style_sheet.parent_style_sheet).to eq parent
102
107
  end
103
108
  end
104
109
 
@@ -138,20 +143,46 @@ describe CssStyleSheet do
138
143
  end
139
144
 
140
145
  describe "#owner_rule" do
146
+ let(:parent) do
147
+ CssStyleSheet.new("http://example.com/css_import/stylesheets/screen.css")
148
+ end
149
+
150
+ it "should be nil for non-imported sheets" do
151
+ expect(parent.owner_rule).to be_nil
152
+ end
153
+
141
154
  it "references the owner rule" do
155
+ text = "@import url(\"import1.css\");"
156
+ rule = CssImportRule.new(:css_text => text, :parent_style_sheet => parent)
142
157
 
158
+ expect(rule.style_sheet.owner_rule).to eq rule
143
159
  end
144
160
  end
145
161
 
146
162
  describe "#delete_rule" do
147
163
  it "deletes a rule from the css rules" do
164
+ css = "div {\n background-color: #aaa;\n} span {\n color: #444; \n}"
165
+ sheet = CssStyleSheet.new(:content => css)
148
166
 
167
+ sheet.css_rules
168
+ expect(sheet.css_rules.length).to eq 2
169
+
170
+ sheet.delete_rule(0)
171
+ expect(sheet.css_rules.length).to eq 1
172
+ expect(sheet.css_rules[0].css_text).to eq "span { color: #444;}"
149
173
  end
150
174
  end
151
175
 
152
176
  describe "#insert_rule" do
153
177
  it "adds a rule to the css rules" do
178
+ css = "div {\n background-color: #aaa;\n} span {\n color: #444; \n}"
179
+ sheet = CssStyleSheet.new(:content => css)
180
+
181
+ expect(sheet.css_rules.length).to eq 2
154
182
 
183
+ sheet.insert_rule("#blanc { color: white }", 0);
184
+ expect(sheet.css_rules.length).to eq 3
185
+
155
186
  end
156
187
  end
157
188
  end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Stylesheet do
4
+ describe "#get" do
5
+ it "must return results" do
6
+ request = Request.new
7
+
8
+ # body = request.get("http://google.com")
9
+ # expect(body).to include "<html"
10
+ end
11
+ end
12
+ end
data/stylesheet.gemspec CHANGED
@@ -6,7 +6,7 @@ require 'stylesheet/version'
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = "stylesheet"
8
8
  gem.version = Stylesheet::VERSION
9
- gem.summary = %q{Stylesheet is a CSS style sheet parser}
9
+ gem.summary = %q{A CSS parser based on the DOM API}
10
10
  gem.description = gem.summary
11
11
 
12
12
  gem.required_ruby_version = '>= 1.9.3'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stylesheet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-29 00:00:00.000000000 Z
12
+ date: 2013-05-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: curb
@@ -123,7 +123,7 @@ dependencies:
123
123
  - - ~>
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0.9'
126
- description: Stylesheet is a CSS style sheet parser
126
+ description: A CSS parser based on the DOM API
127
127
  email:
128
128
  - derek@sportspyder.com
129
129
  executables: []
@@ -205,6 +205,7 @@ files:
205
205
  - spec/inflector_spec.rb
206
206
  - spec/location_spec.rb
207
207
  - spec/media_list_spec.rb
208
+ - spec/request_spec.rb
208
209
  - spec/spec_helper.rb
209
210
  - spec/stubs/fake_request.rb
210
211
  - spec/style_sheet_list_spec.rb
@@ -234,7 +235,7 @@ rubyforge_project:
234
235
  rubygems_version: 1.8.25
235
236
  signing_key:
236
237
  specification_version: 3
237
- summary: Stylesheet is a CSS style sheet parser
238
+ summary: A CSS parser based on the DOM API
238
239
  test_files:
239
240
  - features/document_styles.feature
240
241
  - features/rule_declarations.feature
@@ -287,6 +288,7 @@ test_files:
287
288
  - spec/inflector_spec.rb
288
289
  - spec/location_spec.rb
289
290
  - spec/media_list_spec.rb
291
+ - spec/request_spec.rb
290
292
  - spec/spec_helper.rb
291
293
  - spec/stubs/fake_request.rb
292
294
  - spec/style_sheet_list_spec.rb