attributer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
@@ -0,0 +1,8 @@
1
+ # Contributing to vatsim_online
2
+
3
+ 1. Fork it
4
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
5
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
6
+ 4. Make sure all tests are passing!
7
+ 5. Push to the branch (`git push origin my-new-feature`)
8
+ 6. Create new Pull Request
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in attributer.gemspec
4
+ gemspec
@@ -0,0 +1,5 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Svilen Vassilev
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,133 @@
1
+ # Attributer
2
+
3
+ Ruby gem for adding width and height attributes to image tags within HTML blocks.
4
+
5
+ This library will parse a piece of HTML, find all the image tags inside it, obtain
6
+ the width and height of these images and insert them as attributes to the `img` tag.
7
+ It will then return the entire HTML with the image attributes properly in place.
8
+
9
+ Useful for example as a callback with WYSIWYG editors that don't automatically add
10
+ `width` and `height` attributes to images or for instantly optimizing all your old blog
11
+ or CMS posts with img tag attributes for speed and standarts compliance.
12
+
13
+ [![Build Status](https://secure.travis-ci.org/tarakanbg/attributer.png?branch=master)](http://travis-ci.org/tarakanbg/attributer)
14
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/tarakanbg/attributer)
15
+ [![Gemnasium](https://gemnasium.com/tarakanbg/attributer.png?travis)](https://gemnasium.com/tarakanbg/attributer)
16
+ [![Gem Version](https://badge.fury.io/rb/attributer.png)](http://badge.fury.io/rb/attributer)
17
+
18
+ ## Installation
19
+
20
+ Add this line to your application's Gemfile:
21
+
22
+ gem 'attributer'
23
+
24
+ And then execute:
25
+
26
+ $ bundle
27
+
28
+ Or install it yourself as:
29
+
30
+ $ gem install attributer
31
+
32
+ ## Usage
33
+
34
+ This library augments the default Ruby `String` class with 1 public method:
35
+ `.image_attributes`. You can attach this method to a string variable containing a piece of HTML
36
+ of any length or complexity. This method takes one of 2 mandatory arguments:
37
+ `(:domain => "http://my-domain.com")` or `(:path => /my/local/filesystem/path)`.
38
+ It will raise an `ArgumentError` exception if neither argument is passed.
39
+
40
+ These arguments are **only used** to locate the images referenced in your HTML and poll their width and height;
41
+ they are **not** written in the resulting HTML: the `src` attribute of the `img` tag
42
+ remains unchanged. Either a full local path or a URL prefix is needed.
43
+
44
+ For discovery purposes these arguments are concatenated to the `src` attribute of the image tag,
45
+ i.e. if your images are accessible via `http://my-domain.com/assets/test.jpg` and you
46
+ already have `src="/assets/test.jpg"` in your image tag, then you only need to use
47
+ `(:domain => "http://my-domain.com")` as an argument.
48
+
49
+ Likewise if your images are locally accessible via `/home/www/site/assets/test.jpg` and you
50
+ already have `src="/assets/test.jpg"` in your image tag, then you only need to use
51
+ `(:path => "/home/www/site")` as an argument.
52
+
53
+ The `.image_attributes` method will return a string of the entire HTML block with the image
54
+ attributes properly in place.
55
+
56
+ ### Examples
57
+
58
+ ```ruby
59
+ html = '<img alt="test" class="gallery" src="/assets/test.jpg">'
60
+ html.image_attributes(:domain => "http://my-domain.com")
61
+ # => '<img alt="test" class="gallery" src="/assets/test.jpg" width="200" height="266">'
62
+
63
+ html = '<img alt="test2" class="fuzzy" src="/images/test2.jpg">'
64
+ html.image_attributes(:path => "/home/www/site")
65
+ # => '<img alt="test2" class="fuzzy" src="/images/test2.jpg" width="340" height="155">'
66
+
67
+ html = Post.find(20).body # =>
68
+ # <div id='gallery'>
69
+ # <img alt="1" class="gallery" src="/assets/1.jpg" />
70
+ # <img alt="2" class="gallery" src="/assets/2.jpg" />
71
+ # <img alt="3" class="gallery" src="/assets/3.jpg" />
72
+ # <img alt="4" class="gallery" src="/assets/4.jpg" />
73
+ # <img alt="5" class="gallery" src="/assets/5.jpg" />
74
+ # <img alt="6" class="gallery" src="/assets/6.jpg" />
75
+ # <img alt="7" class="gallery" src="/assets/7.jpg" />
76
+ # <img alt="8" class="gallery" src="/assets/8.jpg" />
77
+ # <img alt="9" class="gallery" src="/assets/9.jpg" />
78
+ # <img alt="10" class="gallery" src="/assets/10.jpg" />
79
+ # <img alt="11" class="gallery" src="/assets/11.jpg" />
80
+ # <img alt="12" class="gallery" src="/assets/12.jpg" />
81
+ # <img alt="13" class="gallery" src="/assets/13.jpg" />
82
+ # <img alt="14" class="gallery" src="/assets/14.jpg" />
83
+ # <img alt="15" class="gallery" src="/assets/15.jpg" />
84
+ # <img alt="16" class="gallery" src="/assets/16.jpg" />
85
+ # <img alt="17" class="gallery" src="/assets/17.jpg" />
86
+ # <img alt="18" class="gallery" src="/assets/18.jpg" />
87
+ # <img alt="19" class="gallery" src="/assets/19.jpg" />
88
+ # <img alt="20" class="gallery" src="/assets/20.jpg" />
89
+ # </div>
90
+ html.image_attributes(:domain => "http://my-domain.com") # =>
91
+ # <div id='gallery'>
92
+ # <img alt="1" class="gallery" src="/assets/1.jpg" width="200" height="266">
93
+ # <img alt="2" class="gallery" src="/assets/2.jpg" width="200" height="266">
94
+ # <img alt="3" class="gallery" src="/assets/3.jpg" width="200" height="266">
95
+ # <img alt="4" class="gallery" src="/assets/4.jpg" width="200" height="266">
96
+ # <img alt="5" class="gallery" src="/assets/5.jpg" width="200" height="266">
97
+ # <img alt="6" class="gallery" src="/assets/6.jpg" width="200" height="266">
98
+ # <img alt="7" class="gallery" src="/assets/7.jpg" width="200" height="266">
99
+ # <img alt="8" class="gallery" src="/assets/8.jpg" width="200" height="266">
100
+ # <img alt="9" class="gallery" src="/assets/9.jpg" width="200" height="266">
101
+ # <img alt="10" class="gallery" src="/assets/10.jpg" width="200" height="266">
102
+ # <img alt="11" class="gallery" src="/assets/11.jpg" width="200" height="266">
103
+ # <img alt="12" class="gallery" src="/assets/12.jpg" width="200" height="266">
104
+ # <img alt="13" class="gallery" src="/assets/13.jpg" width="200" height="266">
105
+ # <img alt="14" class="gallery" src="/assets/14.jpg" width="200" height="266">
106
+ # <img alt="15" class="gallery" src="/assets/15.jpg" width="200" height="266">
107
+ # <img alt="16" class="gallery" src="/assets/16.jpg" width="200" height="266">
108
+ # <img alt="17" class="gallery" src="/assets/17.jpg" width="200" height="266">
109
+ # <img alt="18" class="gallery" src="/assets/18.jpg" width="200" height="266">
110
+ # <img alt="19" class="gallery" src="/assets/19.jpg" width="200" height="266">
111
+ # <img alt="20" class="gallery" src="/assets/20.jpg" width="200" height="266">
112
+ # </div>
113
+ ```
114
+
115
+ ## Contributing
116
+
117
+ 1. Fork it
118
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
119
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
120
+ 4. Make sure all rspec tests pass!
121
+ 5. Push to the branch (`git push origin my-new-feature`)
122
+ 6. Create new Pull Request
123
+
124
+ ## Credits
125
+
126
+ Copyright © 2013 [Svilen Vassilev](http://svilen.rubystudio.net)
127
+
128
+ *If you find my work useful or time-saving, you can endorse it or buy me a cup of coffee:*
129
+
130
+ [![endorse](http://api.coderwall.com/svilenv/endorsecount.png)](http://coderwall.com/svilenv)
131
+ [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5FR7AQA4PLD8A)
132
+
133
+ Released under the [MIT LICENSE](https://github.com/tarakanbg/attributer/blob/master/LICENSE.txt)
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task default: :spec
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'attributer/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "attributer"
8
+ gem.version = Attributer::VERSION
9
+ gem.authors = ["Svilen Vassilev"]
10
+ gem.email = ["svilen@rubystudio.net"]
11
+ gem.description = %q{Ruby gem for adding width and height attributes to image tags within HTML blocks}
12
+ gem.summary = %q{Ruby gem for adding width and height attributes to image tags within HTML blocks}
13
+ gem.homepage = "https://github.com/tarakanbg/attributer"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_development_dependency "rspec"
21
+ gem.add_development_dependency "rake"
22
+ gem.add_development_dependency "guard"
23
+ gem.add_development_dependency "libnotify"
24
+ gem.add_development_dependency "guard-rspec"
25
+ gem.add_dependency "fastimage", "~> 1.2.13"
26
+ gem.add_dependency "nokogiri", "~> 1.5.6"
27
+ end
@@ -0,0 +1,65 @@
1
+ require "attributer/version"
2
+
3
+ class String
4
+ def image_attributes(args={})
5
+ Attributer::Attributer.new(self, args).parsed_string
6
+ end
7
+ end
8
+
9
+ module Attributer
10
+ class Attributer
11
+ require "fastimage"
12
+ require "nokogiri"
13
+
14
+ attributes = %w{lpost images old_htmls new_htmls uri new_post}
15
+ attributes.each {|attribute| attr_accessor attribute.to_sym }
16
+
17
+ def initialize(string, args = nil)
18
+ args[:domain] ? @uri = args[:domain] : @uri = args[:path]
19
+ raise ArgumentError, "No domain or local path specified! Attributer can't find image!\nPlease use either :domain or :path options in your\n'image_attributes' method!" if @uri.nil?
20
+ @lpost = Nokogiri::HTML::DocumentFragment.parse( string.force_encoding "UTF-8" )
21
+ @new_post = string.force_encoding "UTF-8"
22
+ parse_image_tags
23
+ add_attributes
24
+ replace_images
25
+ end
26
+
27
+ def parsed_string
28
+ @new_post
29
+ end
30
+
31
+ private
32
+
33
+ def parse_image_tags
34
+ @old_htmls = []; @new_htmls = []
35
+ @images = @lpost.css("img")
36
+ @images.each {|i| @old_htmls << i.to_html}
37
+ process_trailing_slashes
38
+ end
39
+
40
+ def add_attributes
41
+ for image in @old_htmls
42
+ imagetag = Nokogiri::HTML::DocumentFragment.parse( image )
43
+ img = imagetag.at_css "img"
44
+ size = FastImage.size(@uri + img['src'], :timeout => 5)
45
+ img['width'] = size.first.to_s
46
+ img['height'] = size.last.to_s
47
+ @new_htmls << imagetag.to_html
48
+ end
49
+ end
50
+
51
+ def replace_images
52
+ @old_htmls.each do |old|
53
+ @new_post.sub!(old, @new_htmls.shift)
54
+ end
55
+ end
56
+
57
+ def process_trailing_slashes
58
+ @old_htmls.each do |image|
59
+ image.sub!(">", " />") unless @new_post.include? image
60
+ image.sub!(" />", "/>") unless @new_post.include? image
61
+ end
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,3 @@
1
+ module Attributer
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,152 @@
1
+ require 'spec_helper.rb'
2
+
3
+ local_test_file
4
+
5
+ describe String do
6
+
7
+ describe "local_test_file" do
8
+ it "should return a string" do
9
+ local_test_file.class.should eq(String)
10
+ end
11
+ it "should be read corectly" do
12
+ local_test_file.should eq(File.open(File.realpath("spec/test.html"), "rb").read)
13
+ end
14
+ end
15
+
16
+ describe "image_attributes" do
17
+ it "should return a string" do
18
+ local_test_file.image_attributes(:domain => "http://darvazaogrev.com").class.should eq(String)
19
+ end
20
+
21
+ it "should handle domains" do
22
+ test_string = '<img alt="1" class="gallery" src="/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg">'
23
+ test_string.image_attributes(:domain => "http://darvazaogrev.com").should eq("<img alt=\"1\" class=\"gallery\" src=\"/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg\" width=\"200\" height=\"266\">")
24
+ end
25
+
26
+ it "should raise exception if used without args" do
27
+ test_string = "<img alt=\"1\" class=\"gallery\" src=\"/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg\">"
28
+ expect {test_string.image_attributes}.to raise_error(ArgumentError)
29
+ end
30
+
31
+ it "should handle local path" do
32
+ path = File.realpath("spec")
33
+ test_string = "<img alt=\"test\" src=\"/test.png\">"
34
+ test_string.image_attributes(:path => path).should eq("<img alt=\"test\" src=\"/test.png\" width=\"500\" height=\"333\">")
35
+ end
36
+
37
+ it "should produce matching results" do
38
+ local_test_file.image_attributes(:domain => "http://darvazaogrev.com").should eq(results_file)
39
+ end
40
+
41
+ it "should handle HTML with or without trailing slashes in the img tag" do
42
+ local_test_file_2.image_attributes(:domain => "http://darvazaogrev.com").should eq(results_file)
43
+ end
44
+ end
45
+
46
+ end
47
+
48
+
49
+ describe Attributer::Attributer do
50
+
51
+ describe "parsing the html block" do
52
+ it "should be successful" do
53
+ parsed = Nokogiri::HTML::DocumentFragment.parse(local_test_file)
54
+ parsed.class.should eq(Nokogiri::HTML::DocumentFragment)
55
+ images = parsed.css("img")
56
+ images.class.should eq(Nokogiri::XML::NodeSet)
57
+ images.count.should eq(20)
58
+ end
59
+
60
+ it "should yield a valid array of img tags" do
61
+ old_htmls = []; new_htmls = []
62
+ parsed = Nokogiri::HTML::DocumentFragment.parse(local_test_file)
63
+ parsed.class.should eq(Nokogiri::HTML::DocumentFragment)
64
+ images = parsed.css("img")
65
+ images.class.should eq(Nokogiri::XML::NodeSet)
66
+ images.count.should eq(20)
67
+ images.each {|i| old_htmls << i.to_html}
68
+ old_htmls.count.should eq(20)
69
+ old_htmls.class.should eq(Array)
70
+ old_htmls.first.should eq("<img alt=\"1\" class=\"gallery\" src=\"/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg\">")
71
+ old_htmls.last.should eq("<img alt=\"20\" class=\"gallery\" src=\"/assets/thumbnails/20-7edabdea6a94e8b70ffc37ee324b9fab.jpg\">")
72
+ end
73
+
74
+ it "should parse down to XML element" do
75
+ old_htmls = []; new_htmls = []
76
+ parsed = Nokogiri::HTML::DocumentFragment.parse(local_test_file)
77
+ images = parsed.css("img")
78
+ images.each {|i| old_htmls << i.to_html}
79
+ imagetag = Nokogiri::HTML::DocumentFragment.parse( old_htmls.first )
80
+ imagetag.class.should eq(Nokogiri::HTML::DocumentFragment)
81
+ img = imagetag.at_css "img"
82
+ img.class.should eq(Nokogiri::XML::Element)
83
+ img['src'].class.should eq(String)
84
+ img['src'].should eq("/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg")
85
+ end
86
+
87
+ it "should construct valid paths" do
88
+ old_htmls = []; new_htmls = []
89
+ parsed = Nokogiri::HTML::DocumentFragment.parse(local_test_file)
90
+ images = parsed.css("img")
91
+ images.each {|i| old_htmls << i.to_html}
92
+ imagetag = Nokogiri::HTML::DocumentFragment.parse( old_htmls.first )
93
+ img = imagetag.at_css "img"
94
+ img['src'].class.should eq(String)
95
+ domain = "http://darvazaogrev.com"
96
+ path = domain + img['src']
97
+ path.should eq("http://darvazaogrev.com/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg")
98
+ end
99
+
100
+ it "should pull dimensions" do
101
+ old_htmls = []; new_htmls = []
102
+ parsed = Nokogiri::HTML::DocumentFragment.parse(local_test_file)
103
+ images = parsed.css("img")
104
+ images.each {|i| old_htmls << i.to_html}
105
+ imagetag = Nokogiri::HTML::DocumentFragment.parse( old_htmls.first )
106
+ img = imagetag.at_css "img"
107
+ domain = "http://darvazaogrev.com"
108
+ path = domain + img['src']
109
+ size = FastImage.size(path)
110
+ size.should eq([200, 266])
111
+ size.class.should eq(Array)
112
+ img['width'] = size.first.to_s
113
+ img['height'] = size.last.to_s
114
+ imagetag.to_html.should eq("<img alt=\"1\" class=\"gallery\" src=\"/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg\" width=\"200\" height=\"266\">")
115
+ end
116
+
117
+ it "should sub old with new" do
118
+ old_htmls = []; new_htmls = []
119
+ parsed = Nokogiri::HTML::DocumentFragment.parse(local_test_file)
120
+ images = parsed.css("img")
121
+ images.each {|i| old_htmls << i.to_html}
122
+ for image in old_htmls
123
+ imagetag = Nokogiri::HTML::DocumentFragment.parse( image )
124
+ img = imagetag.at_css "img"
125
+ domain = "http://darvazaogrev.com"
126
+ path = domain + img['src']
127
+ size = FastImage.size(path, :timeout => 5)
128
+ img['width'] = size.first.to_s
129
+ img['height'] = size.last.to_s
130
+ new_htmls << imagetag.to_html
131
+ end
132
+ new_htmls.should eq(["<img alt=\"1\" class=\"gallery\" src=\"/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg\" width=\"200\" height=\"266\">", "<img alt=\"2\" class=\"gallery\" src=\"/assets/thumbnails/2-413bd5c8b6b7263beffbbbad112568fd.jpg\" width=\"200\" height=\"266\">", "<img alt=\"3\" class=\"gallery\" src=\"/assets/thumbnails/3-50cea3d1ecb37bc0a7158adfee38d020.jpg\" width=\"200\" height=\"266\">", "<img alt=\"4\" class=\"gallery\" src=\"/assets/thumbnails/4-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg\" width=\"200\" height=\"266\">", "<img alt=\"5\" class=\"gallery\" src=\"/assets/thumbnails/5-900f1e2e061af1ea2f0ea622d0be5c38.jpg\" width=\"200\" height=\"266\">", "<img alt=\"6\" class=\"gallery\" src=\"/assets/thumbnails/6-4837c7ac224fc26dd995f4441aa7a458.jpg\" width=\"200\" height=\"266\">", "<img alt=\"7\" class=\"gallery\" src=\"/assets/thumbnails/7-79120b81863981edf1a997711e8268fb.jpg\" width=\"200\" height=\"266\">", "<img alt=\"8\" class=\"gallery\" src=\"/assets/thumbnails/8-2057ca29648dc1530b752918f09fba8d.jpg\" width=\"200\" height=\"266\">", "<img alt=\"9\" class=\"gallery\" src=\"/assets/thumbnails/9-413bd5c8b6b7263beffbbbad112568fd.jpg\" width=\"200\" height=\"266\">", "<img alt=\"10\" class=\"gallery\" src=\"/assets/thumbnails/10-900f1e2e061af1ea2f0ea622d0be5c38.jpg\" width=\"200\" height=\"266\">", "<img alt=\"11\" class=\"gallery\" src=\"/assets/thumbnails/11-900f1e2e061af1ea2f0ea622d0be5c38.jpg\" width=\"200\" height=\"266\">", "<img alt=\"12\" class=\"gallery\" src=\"/assets/thumbnails/12-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg\" width=\"200\" height=\"266\">", "<img alt=\"13\" class=\"gallery\" src=\"/assets/thumbnails/13-4837c7ac224fc26dd995f4441aa7a458.jpg\" width=\"200\" height=\"266\">", "<img alt=\"14\" class=\"gallery\" src=\"/assets/thumbnails/14-79120b81863981edf1a997711e8268fb.jpg\" width=\"200\" height=\"266\">", "<img alt=\"15\" class=\"gallery\" src=\"/assets/thumbnails/15-51330c678115d1236ce46e1ea8e6c019.jpg\" width=\"200\" height=\"267\">", "<img alt=\"16\" class=\"gallery\" src=\"/assets/thumbnails/16-1883f9ecb69aebe721037b4b19c6cec4.jpg\" width=\"200\" height=\"267\">", "<img alt=\"17\" class=\"gallery\" src=\"/assets/thumbnails/17-7b163458e971099e316f1d28f686b01a.jpg\" width=\"200\" height=\"267\">", "<img alt=\"18\" class=\"gallery\" src=\"/assets/thumbnails/18-c2b893d1a1b624bf740afebf1464d78d.jpg\" width=\"200\" height=\"267\">", "<img alt=\"19\" class=\"gallery\" src=\"/assets/thumbnails/19-6ea454cbc4a895408c9ad38dd8edce4e.jpg\" width=\"200\" height=\"267\">", "<img alt=\"20\" class=\"gallery\" src=\"/assets/thumbnails/20-7edabdea6a94e8b70ffc37ee324b9fab.jpg\" width=\"200\" height=\"267\">"])
133
+ old_htmls.should eq(["<img alt=\"1\" class=\"gallery\" src=\"/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg\">", "<img alt=\"2\" class=\"gallery\" src=\"/assets/thumbnails/2-413bd5c8b6b7263beffbbbad112568fd.jpg\">", "<img alt=\"3\" class=\"gallery\" src=\"/assets/thumbnails/3-50cea3d1ecb37bc0a7158adfee38d020.jpg\">", "<img alt=\"4\" class=\"gallery\" src=\"/assets/thumbnails/4-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg\">", "<img alt=\"5\" class=\"gallery\" src=\"/assets/thumbnails/5-900f1e2e061af1ea2f0ea622d0be5c38.jpg\">", "<img alt=\"6\" class=\"gallery\" src=\"/assets/thumbnails/6-4837c7ac224fc26dd995f4441aa7a458.jpg\">", "<img alt=\"7\" class=\"gallery\" src=\"/assets/thumbnails/7-79120b81863981edf1a997711e8268fb.jpg\">", "<img alt=\"8\" class=\"gallery\" src=\"/assets/thumbnails/8-2057ca29648dc1530b752918f09fba8d.jpg\">", "<img alt=\"9\" class=\"gallery\" src=\"/assets/thumbnails/9-413bd5c8b6b7263beffbbbad112568fd.jpg\">", "<img alt=\"10\" class=\"gallery\" src=\"/assets/thumbnails/10-900f1e2e061af1ea2f0ea622d0be5c38.jpg\">", "<img alt=\"11\" class=\"gallery\" src=\"/assets/thumbnails/11-900f1e2e061af1ea2f0ea622d0be5c38.jpg\">", "<img alt=\"12\" class=\"gallery\" src=\"/assets/thumbnails/12-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg\">", "<img alt=\"13\" class=\"gallery\" src=\"/assets/thumbnails/13-4837c7ac224fc26dd995f4441aa7a458.jpg\">", "<img alt=\"14\" class=\"gallery\" src=\"/assets/thumbnails/14-79120b81863981edf1a997711e8268fb.jpg\">", "<img alt=\"15\" class=\"gallery\" src=\"/assets/thumbnails/15-51330c678115d1236ce46e1ea8e6c019.jpg\">", "<img alt=\"16\" class=\"gallery\" src=\"/assets/thumbnails/16-1883f9ecb69aebe721037b4b19c6cec4.jpg\">", "<img alt=\"17\" class=\"gallery\" src=\"/assets/thumbnails/17-7b163458e971099e316f1d28f686b01a.jpg\">", "<img alt=\"18\" class=\"gallery\" src=\"/assets/thumbnails/18-c2b893d1a1b624bf740afebf1464d78d.jpg\">", "<img alt=\"19\" class=\"gallery\" src=\"/assets/thumbnails/19-6ea454cbc4a895408c9ad38dd8edce4e.jpg\">", "<img alt=\"20\" class=\"gallery\" src=\"/assets/thumbnails/20-7edabdea6a94e8b70ffc37ee324b9fab.jpg\">"])
134
+ new_post = local_test_file.force_encoding "UTF-8"
135
+ new_post.should eq(local_test_file)
136
+ old_htmls.first.should eq("<img alt=\"1\" class=\"gallery\" src=\"/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg\">")
137
+ new_htmls.first.should eq("<img alt=\"1\" class=\"gallery\" src=\"/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg\" width=\"200\" height=\"266\">")
138
+ old_htmls.each do |image|
139
+ image.sub!(">", " />") unless new_post.include? image
140
+ image.sub!(" />", "/>") unless new_post.include? image
141
+ end
142
+ old_htmls.first.should eq("<img alt=\"1\" class=\"gallery\" src=\"/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg\" />")
143
+ new_post.include?(old_htmls.first).should be(true)
144
+ old_htmls.each do |old|
145
+ new_post.sub!(old, new_htmls.shift)
146
+ end
147
+ new_post.should eq(results_file)
148
+ end
149
+ end
150
+
151
+
152
+ end
@@ -0,0 +1,23 @@
1
+ <div id='gallery'>
2
+ <a href="/assets/gallery/1-00ddf8ce5eff6b1ba814e42861762ba3.jpg"><img alt="1" class="gallery" src="/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg" width="200" height="266"></a>
3
+ <a href="/assets/gallery/2-d53fb77c8f41a8f024afd0ae91559f6e.jpg"><img alt="2" class="gallery" src="/assets/thumbnails/2-413bd5c8b6b7263beffbbbad112568fd.jpg" width="200" height="266"></a>
4
+ <a href="/assets/gallery/3-161da8a490d8b303e514a58bbcc206d4.jpg"><img alt="3" class="gallery" src="/assets/thumbnails/3-50cea3d1ecb37bc0a7158adfee38d020.jpg" width="200" height="266"></a>
5
+ <a href="/assets/gallery/4-aa69df4395880f01bc9ab63fd8e0ed7d.jpg"><img alt="4" class="gallery" src="/assets/thumbnails/4-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg" width="200" height="266"></a>
6
+ <a href="/assets/gallery/5-eab72fa06f26bb2b92f94feece17cdc8.jpg"><img alt="5" class="gallery" src="/assets/thumbnails/5-900f1e2e061af1ea2f0ea622d0be5c38.jpg" width="200" height="266"></a>
7
+ <a href="/assets/gallery/6-72531cf7122d2628fc1436275b44a588.jpg"><img alt="6" class="gallery" src="/assets/thumbnails/6-4837c7ac224fc26dd995f4441aa7a458.jpg" width="200" height="266"></a>
8
+ <a href="/assets/gallery/7-4a7a7a05eeab9818897e820b106e0f68.jpg"><img alt="7" class="gallery" src="/assets/thumbnails/7-79120b81863981edf1a997711e8268fb.jpg" width="200" height="266"></a>
9
+ <a href="/assets/gallery/8-00ddf8ce5eff6b1ba814e42861762ba3.jpg"><img alt="8" class="gallery" src="/assets/thumbnails/8-2057ca29648dc1530b752918f09fba8d.jpg" width="200" height="266"></a>
10
+ <a href="/assets/gallery/9-d53fb77c8f41a8f024afd0ae91559f6e.jpg"><img alt="9" class="gallery" src="/assets/thumbnails/9-413bd5c8b6b7263beffbbbad112568fd.jpg" width="200" height="266"></a>
11
+ <a href="/assets/gallery/10-eab72fa06f26bb2b92f94feece17cdc8.jpg"><img alt="10" class="gallery" src="/assets/thumbnails/10-900f1e2e061af1ea2f0ea622d0be5c38.jpg" width="200" height="266"></a>
12
+ <a href="/assets/gallery/11-eab72fa06f26bb2b92f94feece17cdc8.jpg"><img alt="11" class="gallery" src="/assets/thumbnails/11-900f1e2e061af1ea2f0ea622d0be5c38.jpg" width="200" height="266"></a>
13
+ <a href="/assets/gallery/12-aa69df4395880f01bc9ab63fd8e0ed7d.jpg"><img alt="12" class="gallery" src="/assets/thumbnails/12-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg" width="200" height="266"></a>
14
+ <a href="/assets/gallery/13-72531cf7122d2628fc1436275b44a588.jpg"><img alt="13" class="gallery" src="/assets/thumbnails/13-4837c7ac224fc26dd995f4441aa7a458.jpg" width="200" height="266"></a>
15
+ <a href="/assets/gallery/14-4a7a7a05eeab9818897e820b106e0f68.jpg"><img alt="14" class="gallery" src="/assets/thumbnails/14-79120b81863981edf1a997711e8268fb.jpg" width="200" height="266"></a>
16
+ <a href="/assets/gallery/15-6fce044628982154e4973a09b01e0b10.jpg"><img alt="15" class="gallery" src="/assets/thumbnails/15-51330c678115d1236ce46e1ea8e6c019.jpg" width="200" height="267"></a>
17
+ <a href="/assets/gallery/16-7ae3cf25358e1875f1573e57e6f4dba5.jpg"><img alt="16" class="gallery" src="/assets/thumbnails/16-1883f9ecb69aebe721037b4b19c6cec4.jpg" width="200" height="267"></a>
18
+ <a href="/assets/gallery/17-1614a92550727f54beb2cfb0aa486be3.jpg"><img alt="17" class="gallery" src="/assets/thumbnails/17-7b163458e971099e316f1d28f686b01a.jpg" width="200" height="267"></a>
19
+ <a href="/assets/gallery/18-ab272eb68dd0503398177e807cc8cf45.jpg"><img alt="18" class="gallery" src="/assets/thumbnails/18-c2b893d1a1b624bf740afebf1464d78d.jpg" width="200" height="267"></a>
20
+ <a href="/assets/gallery/19-9a93d133120b8bc0212049288251c38e.jpg"><img alt="19" class="gallery" src="/assets/thumbnails/19-6ea454cbc4a895408c9ad38dd8edce4e.jpg" width="200" height="267"></a>
21
+ <a href="/assets/gallery/20-92b6c80cc58d833c7d2095c099d2a2a7.jpg"><img alt="20" class="gallery" src="/assets/thumbnails/20-7edabdea6a94e8b70ffc37ee324b9fab.jpg" width="200" height="267"></a>
22
+ <div class='clear'></div>
23
+ </div>
@@ -0,0 +1,18 @@
1
+ require 'attributer'
2
+
3
+ def local_test_file
4
+ path = File.realpath("spec/test.html")
5
+ string = File.open(path, "rb").read
6
+ string.force_encoding "UTF-8"
7
+ end
8
+
9
+ def results_file
10
+ path = File.realpath("spec/results.html")
11
+ string = File.open(path, "rb").read
12
+ end
13
+
14
+ def local_test_file_2
15
+ path = File.realpath("spec/test2.html")
16
+ string = File.open(path, "rb").read
17
+ string.force_encoding "UTF-8"
18
+ end
@@ -0,0 +1,23 @@
1
+ <div id='gallery'>
2
+ <a href="/assets/gallery/1-00ddf8ce5eff6b1ba814e42861762ba3.jpg"><img alt="1" class="gallery" src="/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg" /></a>
3
+ <a href="/assets/gallery/2-d53fb77c8f41a8f024afd0ae91559f6e.jpg"><img alt="2" class="gallery" src="/assets/thumbnails/2-413bd5c8b6b7263beffbbbad112568fd.jpg" /></a>
4
+ <a href="/assets/gallery/3-161da8a490d8b303e514a58bbcc206d4.jpg"><img alt="3" class="gallery" src="/assets/thumbnails/3-50cea3d1ecb37bc0a7158adfee38d020.jpg" /></a>
5
+ <a href="/assets/gallery/4-aa69df4395880f01bc9ab63fd8e0ed7d.jpg"><img alt="4" class="gallery" src="/assets/thumbnails/4-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg" /></a>
6
+ <a href="/assets/gallery/5-eab72fa06f26bb2b92f94feece17cdc8.jpg"><img alt="5" class="gallery" src="/assets/thumbnails/5-900f1e2e061af1ea2f0ea622d0be5c38.jpg" /></a>
7
+ <a href="/assets/gallery/6-72531cf7122d2628fc1436275b44a588.jpg"><img alt="6" class="gallery" src="/assets/thumbnails/6-4837c7ac224fc26dd995f4441aa7a458.jpg" /></a>
8
+ <a href="/assets/gallery/7-4a7a7a05eeab9818897e820b106e0f68.jpg"><img alt="7" class="gallery" src="/assets/thumbnails/7-79120b81863981edf1a997711e8268fb.jpg" /></a>
9
+ <a href="/assets/gallery/8-00ddf8ce5eff6b1ba814e42861762ba3.jpg"><img alt="8" class="gallery" src="/assets/thumbnails/8-2057ca29648dc1530b752918f09fba8d.jpg" /></a>
10
+ <a href="/assets/gallery/9-d53fb77c8f41a8f024afd0ae91559f6e.jpg"><img alt="9" class="gallery" src="/assets/thumbnails/9-413bd5c8b6b7263beffbbbad112568fd.jpg" /></a>
11
+ <a href="/assets/gallery/10-eab72fa06f26bb2b92f94feece17cdc8.jpg"><img alt="10" class="gallery" src="/assets/thumbnails/10-900f1e2e061af1ea2f0ea622d0be5c38.jpg" /></a>
12
+ <a href="/assets/gallery/11-eab72fa06f26bb2b92f94feece17cdc8.jpg"><img alt="11" class="gallery" src="/assets/thumbnails/11-900f1e2e061af1ea2f0ea622d0be5c38.jpg" /></a>
13
+ <a href="/assets/gallery/12-aa69df4395880f01bc9ab63fd8e0ed7d.jpg"><img alt="12" class="gallery" src="/assets/thumbnails/12-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg" /></a>
14
+ <a href="/assets/gallery/13-72531cf7122d2628fc1436275b44a588.jpg"><img alt="13" class="gallery" src="/assets/thumbnails/13-4837c7ac224fc26dd995f4441aa7a458.jpg" /></a>
15
+ <a href="/assets/gallery/14-4a7a7a05eeab9818897e820b106e0f68.jpg"><img alt="14" class="gallery" src="/assets/thumbnails/14-79120b81863981edf1a997711e8268fb.jpg" /></a>
16
+ <a href="/assets/gallery/15-6fce044628982154e4973a09b01e0b10.jpg"><img alt="15" class="gallery" src="/assets/thumbnails/15-51330c678115d1236ce46e1ea8e6c019.jpg" /></a>
17
+ <a href="/assets/gallery/16-7ae3cf25358e1875f1573e57e6f4dba5.jpg"><img alt="16" class="gallery" src="/assets/thumbnails/16-1883f9ecb69aebe721037b4b19c6cec4.jpg" /></a>
18
+ <a href="/assets/gallery/17-1614a92550727f54beb2cfb0aa486be3.jpg"><img alt="17" class="gallery" src="/assets/thumbnails/17-7b163458e971099e316f1d28f686b01a.jpg" /></a>
19
+ <a href="/assets/gallery/18-ab272eb68dd0503398177e807cc8cf45.jpg"><img alt="18" class="gallery" src="/assets/thumbnails/18-c2b893d1a1b624bf740afebf1464d78d.jpg" /></a>
20
+ <a href="/assets/gallery/19-9a93d133120b8bc0212049288251c38e.jpg"><img alt="19" class="gallery" src="/assets/thumbnails/19-6ea454cbc4a895408c9ad38dd8edce4e.jpg" /></a>
21
+ <a href="/assets/gallery/20-92b6c80cc58d833c7d2095c099d2a2a7.jpg"><img alt="20" class="gallery" src="/assets/thumbnails/20-7edabdea6a94e8b70ffc37ee324b9fab.jpg" /></a>
22
+ <div class='clear'></div>
23
+ </div>
Binary file
@@ -0,0 +1,23 @@
1
+ <div id='gallery'>
2
+ <a href="/assets/gallery/1-00ddf8ce5eff6b1ba814e42861762ba3.jpg"><img alt="1" class="gallery" src="/assets/thumbnails/1-2057ca29648dc1530b752918f09fba8d.jpg"></a>
3
+ <a href="/assets/gallery/2-d53fb77c8f41a8f024afd0ae91559f6e.jpg"><img alt="2" class="gallery" src="/assets/thumbnails/2-413bd5c8b6b7263beffbbbad112568fd.jpg"></a>
4
+ <a href="/assets/gallery/3-161da8a490d8b303e514a58bbcc206d4.jpg"><img alt="3" class="gallery" src="/assets/thumbnails/3-50cea3d1ecb37bc0a7158adfee38d020.jpg"></a>
5
+ <a href="/assets/gallery/4-aa69df4395880f01bc9ab63fd8e0ed7d.jpg"><img alt="4" class="gallery" src="/assets/thumbnails/4-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg"></a>
6
+ <a href="/assets/gallery/5-eab72fa06f26bb2b92f94feece17cdc8.jpg"><img alt="5" class="gallery" src="/assets/thumbnails/5-900f1e2e061af1ea2f0ea622d0be5c38.jpg"></a>
7
+ <a href="/assets/gallery/6-72531cf7122d2628fc1436275b44a588.jpg"><img alt="6" class="gallery" src="/assets/thumbnails/6-4837c7ac224fc26dd995f4441aa7a458.jpg"></a>
8
+ <a href="/assets/gallery/7-4a7a7a05eeab9818897e820b106e0f68.jpg"><img alt="7" class="gallery" src="/assets/thumbnails/7-79120b81863981edf1a997711e8268fb.jpg"></a>
9
+ <a href="/assets/gallery/8-00ddf8ce5eff6b1ba814e42861762ba3.jpg"><img alt="8" class="gallery" src="/assets/thumbnails/8-2057ca29648dc1530b752918f09fba8d.jpg"></a>
10
+ <a href="/assets/gallery/9-d53fb77c8f41a8f024afd0ae91559f6e.jpg"><img alt="9" class="gallery" src="/assets/thumbnails/9-413bd5c8b6b7263beffbbbad112568fd.jpg"></a>
11
+ <a href="/assets/gallery/10-eab72fa06f26bb2b92f94feece17cdc8.jpg"><img alt="10" class="gallery" src="/assets/thumbnails/10-900f1e2e061af1ea2f0ea622d0be5c38.jpg"></a>
12
+ <a href="/assets/gallery/11-eab72fa06f26bb2b92f94feece17cdc8.jpg"><img alt="11" class="gallery" src="/assets/thumbnails/11-900f1e2e061af1ea2f0ea622d0be5c38.jpg"></a>
13
+ <a href="/assets/gallery/12-aa69df4395880f01bc9ab63fd8e0ed7d.jpg"><img alt="12" class="gallery" src="/assets/thumbnails/12-a958b0ef2ef3ef8419736ef9aa5f9f6a.jpg"></a>
14
+ <a href="/assets/gallery/13-72531cf7122d2628fc1436275b44a588.jpg"><img alt="13" class="gallery" src="/assets/thumbnails/13-4837c7ac224fc26dd995f4441aa7a458.jpg"></a>
15
+ <a href="/assets/gallery/14-4a7a7a05eeab9818897e820b106e0f68.jpg"><img alt="14" class="gallery" src="/assets/thumbnails/14-79120b81863981edf1a997711e8268fb.jpg"></a>
16
+ <a href="/assets/gallery/15-6fce044628982154e4973a09b01e0b10.jpg"><img alt="15" class="gallery" src="/assets/thumbnails/15-51330c678115d1236ce46e1ea8e6c019.jpg"></a>
17
+ <a href="/assets/gallery/16-7ae3cf25358e1875f1573e57e6f4dba5.jpg"><img alt="16" class="gallery" src="/assets/thumbnails/16-1883f9ecb69aebe721037b4b19c6cec4.jpg"></a>
18
+ <a href="/assets/gallery/17-1614a92550727f54beb2cfb0aa486be3.jpg"><img alt="17" class="gallery" src="/assets/thumbnails/17-7b163458e971099e316f1d28f686b01a.jpg"></a>
19
+ <a href="/assets/gallery/18-ab272eb68dd0503398177e807cc8cf45.jpg"><img alt="18" class="gallery" src="/assets/thumbnails/18-c2b893d1a1b624bf740afebf1464d78d.jpg"></a>
20
+ <a href="/assets/gallery/19-9a93d133120b8bc0212049288251c38e.jpg"><img alt="19" class="gallery" src="/assets/thumbnails/19-6ea454cbc4a895408c9ad38dd8edce4e.jpg"></a>
21
+ <a href="/assets/gallery/20-92b6c80cc58d833c7d2095c099d2a2a7.jpg"><img alt="20" class="gallery" src="/assets/thumbnails/20-7edabdea6a94e8b70ffc37ee324b9fab.jpg"></a>
22
+ <div class='clear'></div>
23
+ </div>
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: attributer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Svilen Vassilev
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: guard
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: libnotify
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: guard-rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: fastimage
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 1.2.13
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.2.13
110
+ - !ruby/object:Gem::Dependency
111
+ name: nokogiri
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 1.5.6
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 1.5.6
126
+ description: Ruby gem for adding width and height attributes to image tags within
127
+ HTML blocks
128
+ email:
129
+ - svilen@rubystudio.net
130
+ executables: []
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - .gitignore
135
+ - .travis.yml
136
+ - CONTRIBUTING.md
137
+ - Gemfile
138
+ - Guardfile
139
+ - LICENSE.txt
140
+ - README.md
141
+ - Rakefile
142
+ - attributer.gemspec
143
+ - lib/attributer.rb
144
+ - lib/attributer/version.rb
145
+ - spec/attributer_spec.rb
146
+ - spec/results.html
147
+ - spec/spec_helper.rb
148
+ - spec/test.html
149
+ - spec/test.png
150
+ - spec/test2.html
151
+ homepage: https://github.com/tarakanbg/attributer
152
+ licenses: []
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ! '>='
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ required_rubygems_version: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ! '>='
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubyforge_project:
171
+ rubygems_version: 1.8.24
172
+ signing_key:
173
+ specification_version: 3
174
+ summary: Ruby gem for adding width and height attributes to image tags within HTML
175
+ blocks
176
+ test_files:
177
+ - spec/attributer_spec.rb
178
+ - spec/results.html
179
+ - spec/spec_helper.rb
180
+ - spec/test.html
181
+ - spec/test.png
182
+ - spec/test2.html