paperclip-phantom_svg 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9efdd038a6daecb6203d76e224b785829405b4bb
4
+ data.tar.gz: 2df4de80642c5d9d2f3c2ffabe7d3539d69caf2f
5
+ SHA512:
6
+ metadata.gz: 664b0ad911a3610819d70c82269cef16a53053a674e449ebd90d7bbbbce82646964677c960f8d012ff9bcba2eb7cc8ec45463f62a7d59ebb6e599275c7986478
7
+ data.tar.gz: 5dce0b4bebf5c8bfc912220939095fdfef986d4d8d1631ac654ba72748c41817170bfe1861ac34ee3d876c8513de42077190159ee25bca2cc07f2da15537da12
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.swo
2
+ *.swp
3
+ tmp/
4
+ Gemfile.lock
5
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,15 @@
1
+ AsciiIdentifiers:
2
+ Enabled: false
3
+
4
+ AsciiComments:
5
+ Enabled: false
6
+
7
+ AccessorMethodName:
8
+ Enabled: false
9
+
10
+ LineLength:
11
+ Max: 99
12
+
13
+ AllCops:
14
+ Exclude:
15
+ - 'Guardfile'
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+
5
+ before_install:
6
+ - sudo add-apt-repository -y ppa:zero-tsuki/ppa
7
+ - sudo apt-get update -qq
8
+ - sudo apt-get install -y libapngasm
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'guard'
7
+ gem 'guard-rspec'
8
+ gem 'rubocop'
9
+ gem 'guard-rubocop'
10
+ end
data/Guardfile ADDED
@@ -0,0 +1,26 @@
1
+ guard :rubocop do
2
+ watch(%r{.+\.rb$})
3
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
4
+ end
5
+
6
+ guard :rspec, cmd: 'bundle exec rspec' do
7
+ watch(%r{^spec/.+_spec\.rb$})
8
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
9
+ watch('spec/spec_helper.rb') { "spec" }
10
+
11
+ # Rails example
12
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
13
+ watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
14
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
15
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
16
+ watch('config/routes.rb') { "spec/routing" }
17
+ watch('app/controllers/application_controller.rb') { "spec/controllers" }
18
+ watch('spec/rails_helper.rb') { "spec" }
19
+
20
+ # Capybara features specs
21
+ watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
22
+
23
+ # Turnip features and steps
24
+ watch(%r{^spec/acceptance/(.+)\.feature$})
25
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
26
+ end
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ paperclip-phantom_svg
2
+ =====================
3
+
4
+ Paperclip high quality SVG ⇔ PNG cross converter with animation support, using Phantom SVG
@@ -0,0 +1,2 @@
1
+ require 'paperclip'
2
+ require 'paperclip_processors/phantom_processor'
@@ -0,0 +1,49 @@
1
+ require 'phantom_svg'
2
+ require 'paperclip'
3
+
4
+ module Paperclip
5
+ # Phantom SVG processor for Paperclip
6
+ class PhantomProcessor < Processor
7
+ attr_accessor :format, :height, :width, :dst
8
+ def initialize(file, options = {}, attachment = nil)
9
+ super
10
+ @src = file
11
+ @options = options
12
+ @format = options[:format] || :svg
13
+ @height = options[:height] || 64
14
+ @width = options[:width] || 64
15
+ @attachment = attachment
16
+ @base_name = File.basename(@file.path, '.*')
17
+ @ouput_name = options[:output_name] || @base_name
18
+ @svg = Phantom::SVG::Base.new(@file.path)
19
+ end
20
+
21
+ def make
22
+ Paperclip.log "[PhantomSVG] Making #{@output_name}" if @whiny
23
+ case @format
24
+ when :svg
25
+ return _create_svg
26
+ when :png
27
+ return _create_png
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def _create_svg
34
+ @dst = Tempfile.new([@output_name, '.svg'])
35
+ Paperclip.log "[PhantomSVG] Creating SVG #{@output_name}" if @whiny
36
+ @svg.save_svg(dst.path)
37
+ @dst
38
+ end
39
+
40
+ def _create_png
41
+ @dst = Tempfile.new([@output_name, '.png'])
42
+ Paperclip.log "[PhantomSVG] Creating SVG #{@output_name} @ #{@height}x#{@width}" if @whiny
43
+ @svg.height = @height if @height
44
+ @svg.width = @width if @width
45
+ @svg.save_apng(@dst.path)
46
+ @dst
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+ Gem::Specification.new do |s|
2
+ s.platform = Gem::Platform::RUBY
3
+ s.name = 'paperclip-phantom_svg'
4
+ s.version = '0.0.1'
5
+ s.license = 'LGPL-3.0'
6
+ s.summary = 'SVG and Raster (primarily PNG) conerters for Paperclip' \
7
+ ' that don\'t suck so much.'
8
+ s.description = 'Hight end SVG conversion suite for Paperclip. ' \
9
+ 'Default PaperClip SVG conversion is awful. Using Phantom SVG we can ' \
10
+ 'cross-convert between SVG and PNG with cleaner results and animation ' \
11
+ 'support.'
12
+ s.authors = ['Rei Kagetsuki']
13
+ s.email = 'info@genshin.org'
14
+ s.homepage = 'http://github.com/Genshin/phantom_svg-paperclip-processor'
15
+
16
+ s.files = `git ls-files`.split($RS)
17
+ s.test_files = s.files.grep(/^spec\//)
18
+ s.require_paths = ['lib']
19
+
20
+ s.add_dependency 'paperclip'
21
+ s.add_dependency 'phantom_svg'
22
+
23
+ s.add_development_dependency 'bundler'
24
+ s.add_development_dependency 'rspec'
25
+ s.add_development_dependency 'activerecord'
26
+ s.add_development_dependency 'sqlite3'
27
+ end
Binary file
@@ -0,0 +1,437 @@
1
+ <?xml version='1.0' encoding='UTF-8'?>
2
+ <!-- Generated by phantom_svg. -->
3
+ <svg id='phantom_svg' width='64px' height='64px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1'>
4
+ <defs>
5
+ <!-- Images. -->
6
+ <svg id='frame0' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
7
+ <defs id='defs2987'>
8
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
9
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
10
+ </marker>
11
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
12
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
13
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
14
+ </linearGradient>
15
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
16
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
17
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
18
+ </linearGradient>
19
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
20
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
21
+ </defs>
22
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.2727273' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
23
+ <metadata id='metadata2990'>
24
+ <rdf:RDF>
25
+ <cc:Work rdf:about=''>
26
+ <dc:format>
27
+ image/svg+xml
28
+ </dc:format>
29
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
30
+ <dc:title/>
31
+ </cc:Work>
32
+ </rdf:RDF>
33
+ </metadata>
34
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
35
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);stroke:url(#radialGradient3781);stroke-width:1.00024381999999989;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(1.632315,0,0,1.6711074,-1.3941512,10.128274)'/>
36
+ <path sodipodi:type='arc' style='color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.65199995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' id='path4246' sodipodi:cx='30.454546' sodipodi:cy='19.454546' sodipodi:rx='30.454546' sodipodi:ry='11.272727' d='m 60.909092,19.454546 a 30.454546,11.272727 0 1 1 -60.909092,0 30.454546,11.272727 0 1 1 60.909092,0 z' transform='translate(1.6363636,0)'/>
37
+ </g>
38
+ </svg>
39
+ <svg id='frame1' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
40
+ <defs id='defs2987'>
41
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
42
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
43
+ </marker>
44
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
45
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
46
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
47
+ </linearGradient>
48
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
49
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
50
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
51
+ </linearGradient>
52
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
53
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
54
+ </defs>
55
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
56
+ <metadata id='metadata2990'>
57
+ <rdf:RDF>
58
+ <cc:Work rdf:about=''>
59
+ <dc:format>
60
+ image/svg+xml
61
+ </dc:format>
62
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
63
+ <dc:title/>
64
+ </cc:Work>
65
+ </rdf:RDF>
66
+ </metadata>
67
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
68
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);stroke:url(#radialGradient3781);stroke-width:1.00024381999999989;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(1.632315,0,0,1.6711074,-1.3941512,10.128274)'/>
69
+ </g>
70
+ </svg>
71
+ <svg id='frame2' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
72
+ <defs id='defs2987'>
73
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
74
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
75
+ </marker>
76
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
77
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
78
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
79
+ </linearGradient>
80
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
81
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
82
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
83
+ </linearGradient>
84
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
85
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
86
+ </defs>
87
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
88
+ <metadata id='metadata2990'>
89
+ <rdf:RDF>
90
+ <cc:Work rdf:about=''>
91
+ <dc:format>
92
+ image/svg+xml
93
+ </dc:format>
94
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
95
+ <dc:title/>
96
+ </cc:Work>
97
+ </rdf:RDF>
98
+ </metadata>
99
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
100
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(1.3842816,-0.86499516,0.885552,1.4171794,-8.1449735,31.220621)'/>
101
+ </g>
102
+ </svg>
103
+ <svg id='frame3' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
104
+ <defs id='defs2987'>
105
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
106
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
107
+ </marker>
108
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
109
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
110
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
111
+ </linearGradient>
112
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
113
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
114
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
115
+ </linearGradient>
116
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
117
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
118
+ </defs>
119
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
120
+ <metadata id='metadata2990'>
121
+ <rdf:RDF>
122
+ <cc:Work rdf:about=''>
123
+ <dc:format>
124
+ image/svg+xml
125
+ </dc:format>
126
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
127
+ <dc:title/>
128
+ </cc:Work>
129
+ </rdf:RDF>
130
+ </metadata>
131
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
132
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(0.71555978,-1.467115,1.5019814,0.73256523,-2.9565128,53.906236)'/>
133
+ </g>
134
+ </svg>
135
+ <svg id='frame4' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
136
+ <defs id='defs2987'>
137
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
138
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
139
+ </marker>
140
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
141
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
142
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
143
+ </linearGradient>
144
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
145
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
146
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
147
+ </linearGradient>
148
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
149
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
150
+ </defs>
151
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
152
+ <metadata id='metadata2990'>
153
+ <rdf:RDF>
154
+ <cc:Work rdf:about=''>
155
+ <dc:format>
156
+ image/svg+xml
157
+ </dc:format>
158
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
159
+ <dc:title/>
160
+ </cc:Work>
161
+ </rdf:RDF>
162
+ </metadata>
163
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
164
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(-0.17062339,-1.623373,1.6619529,-0.17467833,12.958606,70.860369)'/>
165
+ </g>
166
+ </svg>
167
+ <svg id='frame5' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
168
+ <defs id='defs2987'>
169
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
170
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
171
+ </marker>
172
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
173
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
174
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
175
+ </linearGradient>
176
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
177
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
178
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
179
+ </linearGradient>
180
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
181
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
182
+ </defs>
183
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
184
+ <metadata id='metadata2990'>
185
+ <rdf:RDF>
186
+ <cc:Work rdf:about=''>
187
+ <dc:format>
188
+ image/svg+xml
189
+ </dc:format>
190
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
191
+ <dc:title/>
192
+ </cc:Work>
193
+ </rdf:RDF>
194
+ </metadata>
195
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
196
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(-1.0049535,-1.2862818,1.3168506,-1.0288365,34.853384,75.469381)'/>
197
+ </g>
198
+ </svg>
199
+ <svg id='frame6' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
200
+ <defs id='defs2987'>
201
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
202
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
203
+ </marker>
204
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
205
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
206
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
207
+ </linearGradient>
208
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
209
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
210
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
211
+ </linearGradient>
212
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
213
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
214
+ </defs>
215
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
216
+ <metadata id='metadata2990'>
217
+ <rdf:RDF>
218
+ <cc:Work rdf:about=''>
219
+ <dc:format>
220
+ image/svg+xml
221
+ </dc:format>
222
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
223
+ <dc:title/>
224
+ </cc:Work>
225
+ </rdf:RDF>
226
+ </metadata>
227
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
228
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(-1.5338744,-0.55828461,0.57155236,-1.5703273,57.089001,68.041399)'/>
229
+ </g>
230
+ </svg>
231
+ <svg id='frame7' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
232
+ <defs id='defs2987'>
233
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
234
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
235
+ </marker>
236
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
237
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
238
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
239
+ </linearGradient>
240
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
241
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
242
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
243
+ </linearGradient>
244
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
245
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
246
+ </defs>
247
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
248
+ <metadata id='metadata2990'>
249
+ <rdf:RDF>
250
+ <cc:Work rdf:about=''>
251
+ <dc:format>
252
+ image/svg+xml
253
+ </dc:format>
254
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
255
+ <dc:title/>
256
+ </cc:Work>
257
+ </rdf:RDF>
258
+ </metadata>
259
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
260
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(-1.596645,0.33937739,-0.3474428,-1.6345897,72.047901,50.592159)'/>
261
+ </g>
262
+ </svg>
263
+ <svg id='frame8' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
264
+ <defs id='defs2987'>
265
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
266
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
267
+ </marker>
268
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
269
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
270
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
271
+ </linearGradient>
272
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
273
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
274
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
275
+ </linearGradient>
276
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
277
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
278
+ </defs>
279
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
280
+ <metadata id='metadata2990'>
281
+ <rdf:RDF>
282
+ <cc:Work rdf:about=''>
283
+ <dc:format>
284
+ image/svg+xml
285
+ </dc:format>
286
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
287
+ <dc:title/>
288
+ </cc:Work>
289
+ </rdf:RDF>
290
+ </metadata>
291
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
292
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(-1.1741891,1.1339013,-1.1608488,-1.2020941,74.442988,28.121856)'/>
293
+ </g>
294
+ </svg>
295
+ <svg id='frame9' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
296
+ <defs id='defs2987'>
297
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
298
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
299
+ </marker>
300
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
301
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
302
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
303
+ </linearGradient>
304
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
305
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
306
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
307
+ </linearGradient>
308
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
309
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
310
+ </defs>
311
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
312
+ <metadata id='metadata2990'>
313
+ <rdf:RDF>
314
+ <cc:Work rdf:about=''>
315
+ <dc:format>
316
+ image/svg+xml
317
+ </dc:format>
318
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
319
+ <dc:title/>
320
+ </cc:Work>
321
+ </rdf:RDF>
322
+ </metadata>
323
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
324
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(-0.39489269,1.5838283,-1.6214684,-0.40427747,64.841842,6.5878521)'/>
325
+ </g>
326
+ </svg>
327
+ <svg id='frame10' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
328
+ <defs id='defs2987'>
329
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
330
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
331
+ </marker>
332
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
333
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
334
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
335
+ </linearGradient>
336
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
337
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
338
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
339
+ </linearGradient>
340
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
341
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
342
+ </defs>
343
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
344
+ <metadata id='metadata2990'>
345
+ <rdf:RDF>
346
+ <cc:Work rdf:about=''>
347
+ <dc:format>
348
+ image/svg+xml
349
+ </dc:format>
350
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
351
+ <dc:title/>
352
+ </cc:Work>
353
+ </rdf:RDF>
354
+ </metadata>
355
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
356
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(0.50441313,1.5524238,-1.5893176,0.5164006,46.056531,-6.1230106)'/>
357
+ </g>
358
+ </svg>
359
+ <svg id='frame11' width='64px' height='64px' viewBox='0 0 64 64' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
360
+ <defs id='defs2987'>
361
+ <marker inkscape:stockid='Arrow1Lstart' orient='auto' refY='0.0' refX='0.0' id='Arrow1Lstart' style='overflow:visible'>
362
+ <path id='path3787' d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ' style='fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt' transform='scale(0.8) translate(12.5,0)'/>
363
+ </marker>
364
+ <linearGradient inkscape:collect='always' id='linearGradient3771'>
365
+ <stop style='stop-color:#000000;stop-opacity:1;' offset='0' id='stop3773'/>
366
+ <stop style='stop-color:#000000;stop-opacity:0;' offset='1' id='stop3775'/>
367
+ </linearGradient>
368
+ <linearGradient inkscape:collect='always' id='linearGradient3763'>
369
+ <stop style='stop-color:#008080;stop-opacity:1;' offset='0' id='stop3765'/>
370
+ <stop style='stop-color:#008080;stop-opacity:0;' offset='1' id='stop3767'/>
371
+ </linearGradient>
372
+ <linearGradient inkscape:collect='always' xlink:href='#linearGradient3763' id='linearGradient3769' x1='1.6449966' y1='13.354995' x2='39.282725' y2='13.354995' gradientUnits='userSpaceOnUse'/>
373
+ <radialGradient inkscape:collect='always' xlink:href='#linearGradient3771' id='radialGradient3781' cx='20.463861' cy='13.354995' fx='20.463861' fy='13.354995' r='18.818865' gradientTransform='matrix(1,0,0,0.90774142,0,1.2321129)' gradientUnits='userSpaceOnUse'/>
374
+ </defs>
375
+ <sodipodi:namedview id='base' pagecolor='#ffffff' bordercolor='#666666' borderopacity='1.0' inkscape:pageopacity='0.0' inkscape:pageshadow='2' inkscape:zoom='5.5' inkscape:cx='-4.4545455' inkscape:cy='32' inkscape:current-layer='layer1' showgrid='true' inkscape:document-units='px' inkscape:grid-bbox='true' inkscape:window-width='1366' inkscape:window-height='715' inkscape:window-x='0' inkscape:window-y='27' inkscape:window-maximized='1'/>
376
+ <metadata id='metadata2990'>
377
+ <rdf:RDF>
378
+ <cc:Work rdf:about=''>
379
+ <dc:format>
380
+ image/svg+xml
381
+ </dc:format>
382
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
383
+ <dc:title/>
384
+ </cc:Work>
385
+ </rdf:RDF>
386
+ </metadata>
387
+ <g id='layer1' inkscape:label='Layer 1' inkscape:groupmode='layer'>
388
+ <path sodipodi:type='spiral' style='fill:url(#linearGradient3769);fill-opacity:1;stroke:url(#radialGradient3781);stroke-width:1.00024378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart)' id='path2993' sodipodi:cx='18.727272' sodipodi:cy='15.090909' sodipodi:expansion='1' sodipodi:revolution='3' sodipodi:radius='20.959623' sodipodi:argument='-18.082561' sodipodi:t0='0' d='m 18.727272,15.090909 c 0.756635,0.729285 -0.609765,1.379732 -1.21212,1.257577 -1.632345,-0.331034 -1.932014,-2.408544 -1.303034,-3.681817 1.125098,-2.277587 4.1497,-2.59765 6.151514,-1.348491 2.937743,1.833192 3.282497,5.91429 1.393948,8.621211 -2.517139,3.607901 -7.687172,3.975497 -11.090909,1.439404 C 8.3834171,18.187379 7.9939626,11.914792 11.181811,7.8181883 15.042722,2.8566527 22.424864,2.4458299 27.212113,6.2878708 32.85372,10.815583 33.285651,19.31136 28.787887,24.78787 23.595041,31.110717 13.983037,31.563609 7.818191,26.409101 0.81330178,20.552222 0.33953751,9.8222402 6.1515031,2.9697079 12.67165,-4.7177977 24.520848,-5.2123787 32.060593,1.2575632 40.431139,8.4404251 40.946501,21.409749 33.818195,29.63635' transform='matrix(1.2504259,1.0492318,-1.0741671,1.2801426,23.244087,-6.2564708)'/>
389
+ </g>
390
+ </svg>
391
+ <!-- Animation. -->
392
+ <symbol id='animation'>
393
+ <use xlink:href='#frame0' visibility='hidden'>
394
+ <set id='frame0_anim' attributeName='visibility' to='visible' begin='0s;frame11_anim.end' dur='1.0s'/>
395
+ </use>
396
+ <use xlink:href='#frame1' visibility='hidden'>
397
+ <set id='frame1_anim' attributeName='visibility' to='visible' begin='frame0_anim.end' dur='0.1s'/>
398
+ </use>
399
+ <use xlink:href='#frame2' visibility='hidden'>
400
+ <set id='frame2_anim' attributeName='visibility' to='visible' begin='frame1_anim.end' dur='0.1s'/>
401
+ </use>
402
+ <use xlink:href='#frame3' visibility='hidden'>
403
+ <set id='frame3_anim' attributeName='visibility' to='visible' begin='frame2_anim.end' dur='0.1s'/>
404
+ </use>
405
+ <use xlink:href='#frame4' visibility='hidden'>
406
+ <set id='frame4_anim' attributeName='visibility' to='visible' begin='frame3_anim.end' dur='0.1s'/>
407
+ </use>
408
+ <use xlink:href='#frame5' visibility='hidden'>
409
+ <set id='frame5_anim' attributeName='visibility' to='visible' begin='frame4_anim.end' dur='0.1s'/>
410
+ </use>
411
+ <use xlink:href='#frame6' visibility='hidden'>
412
+ <set id='frame6_anim' attributeName='visibility' to='visible' begin='frame5_anim.end' dur='0.1s'/>
413
+ </use>
414
+ <use xlink:href='#frame7' visibility='hidden'>
415
+ <set id='frame7_anim' attributeName='visibility' to='visible' begin='frame6_anim.end' dur='0.1s'/>
416
+ </use>
417
+ <use xlink:href='#frame8' visibility='hidden'>
418
+ <set id='frame8_anim' attributeName='visibility' to='visible' begin='frame7_anim.end' dur='0.1s'/>
419
+ </use>
420
+ <use xlink:href='#frame9' visibility='hidden'>
421
+ <set id='frame9_anim' attributeName='visibility' to='visible' begin='frame8_anim.end' dur='0.1s'/>
422
+ </use>
423
+ <use xlink:href='#frame10' visibility='hidden'>
424
+ <set id='frame10_anim' attributeName='visibility' to='visible' begin='frame9_anim.end' dur='0.1s'/>
425
+ </use>
426
+ <use xlink:href='#frame11' visibility='hidden'>
427
+ <set id='frame11_anim' attributeName='visibility' to='visible' begin='frame10_anim.end' dur='2.0s'/>
428
+ </use>
429
+ </symbol>
430
+ </defs>
431
+ <!-- Main control. -->
432
+ <animate id='controller' begin='0s' dur='4.000000000000001s' repeatCount='indefinite'/>
433
+ <use xlink:href='#frame0'>
434
+ <set attributeName='xlink:href' to='#animation' begin='controller.begin'/>
435
+ <set attributeName='xlink:href' to='#frame11' begin='controller.end'/>
436
+ </use>
437
+ </svg>
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::PhantomProcessor do
4
+ before(:all) do
5
+ clear_tmp
6
+ end
7
+
8
+ let(:svg_source) { File.new(fixture_file('compiled.svg')) }
9
+ let(:png_source) { File.new(fixture_file('apngasm.png')) }
10
+ let(:test_options_svg) { { output_name: 'test_svg', format: :svg } }
11
+ let(:test_options_png) { { output_name: 'test_png', format: :png, height: 128, width: 128 } }
12
+ let(:test_options_png_h) { { output_name: 'test_png_h', format: :png, height: 64 } }
13
+
14
+ describe '.new' do
15
+ let(:test_instance) { Paperclip::PhantomProcessor.new(svg_source, test_options_png) }
16
+
17
+ it 'properly instantiates' do
18
+ expect(test_instance).to be_an_instance_of(Paperclip::PhantomProcessor)
19
+ end
20
+
21
+ it 'properly parses format and size options' do
22
+ expect(test_instance.format).to be(:png)
23
+ expect(test_instance.height).to be(128)
24
+ end
25
+ end
26
+
27
+ context 'with an animated SVG source' do
28
+ describe '.make({format: :svg})' do
29
+ it 'saves an SVG from an SVG' do
30
+ processor = Paperclip::PhantomProcessor.new(svg_source, test_options_svg)
31
+ expect(processor.make).to be_an_instance_of(Paperclip::Tempfile)
32
+ expect(File).to exist(processor.dst.path)
33
+ end
34
+ end
35
+
36
+ describe '.make({format: :png, height: 128, width: 128})' do
37
+ it 'saves a PNG from an SVG' do
38
+ processor = Paperclip::PhantomProcessor.new(svg_source, test_options_png)
39
+ expect(processor.make).to be_an_instance_of(Paperclip::Tempfile)
40
+ expect(File).to exist(processor.dst.path)
41
+ end
42
+ end
43
+
44
+ describe '.make({format: :png, height: 64})' do
45
+ it 'saves a PNG from an SVG' do
46
+ processor = Paperclip::PhantomProcessor.new(svg_source, test_options_png_h)
47
+ expect(processor.make).to be_an_instance_of(Paperclip::Tempfile)
48
+ expect(File).to exist(processor.dst.path)
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'with an animated PNG source' do
54
+ describe '.make({format: :svg})' do
55
+ it 'saves an SVG from an SVG' do
56
+ processor = Paperclip::PhantomProcessor.new(png_source, test_options_svg)
57
+ expect(processor.make).to be_an_instance_of(Paperclip::Tempfile)
58
+ expect(File).to exist(processor.dst.path)
59
+ end
60
+ end
61
+
62
+ describe '.make({format: :png, height: 128, width: 128})' do
63
+ it 'saves a PNG from an SVG' do
64
+ processor = Paperclip::PhantomProcessor.new(png_source, test_options_png)
65
+ expect(processor.make).to be_an_instance_of(Paperclip::Tempfile)
66
+ expect(File).to exist(processor.dst.path)
67
+ end
68
+ end
69
+
70
+ describe '.make({format: :png, height: 64})' do
71
+ it 'saves a PNG from an SVG' do
72
+ processor = Paperclip::PhantomProcessor.new(png_source, test_options_png_h)
73
+ expect(processor.make).to be_an_instance_of(Paperclip::Tempfile)
74
+ expect(File).to exist(processor.dst.path)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,27 @@
1
+ require 'rspec'
2
+ require 'paperclip-phantom_svg'
3
+ require 'active_record'
4
+ require 'fileutils'
5
+
6
+ def attachment(options={})
7
+ Paperclip::Attachment.new(:phantom, DummyPhantom.new, options)
8
+ end
9
+
10
+ def fixture_file(filename)
11
+ File.join(File.dirname(__FILE__), 'fixtures', filename)
12
+ end
13
+
14
+ def tmp_dir_path
15
+ File.dirname(__FILE__) + '/out'
16
+ end
17
+
18
+ def tmp_dir
19
+ unless File.directory?(tmp_dir_path)
20
+ FileUtils.mkdir_p(tmp_dir_path)
21
+ end
22
+ tmp_dir_path
23
+ end
24
+
25
+ def clear_tmp
26
+ FileUtils.rm_rf(tmp_dir)
27
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: paperclip-phantom_svg
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Rei Kagetsuki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: paperclip
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: phantom_svg
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activerecord
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sqlite3
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Hight end SVG conversion suite for Paperclip. Default PaperClip SVG conversion
98
+ is awful. Using Phantom SVG we can cross-convert between SVG and PNG with cleaner
99
+ results and animation support.
100
+ email: info@genshin.org
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ".rubocop.yml"
108
+ - ".travis.yml"
109
+ - Gemfile
110
+ - Guardfile
111
+ - README.md
112
+ - lib/paperclip-phantom_svg.rb
113
+ - lib/paperclip_processors/phantom_processor.rb
114
+ - paperclip-phantom_svg.gemspec
115
+ - spec/fixtures/apngasm.png
116
+ - spec/fixtures/compiled.svg
117
+ - spec/paperclip-phantom_svg_spec.rb
118
+ - spec/spec_helper.rb
119
+ homepage: http://github.com/Genshin/phantom_svg-paperclip-processor
120
+ licenses:
121
+ - LGPL-3.0
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project:
139
+ rubygems_version: 2.2.2
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: SVG and Raster (primarily PNG) conerters for Paperclip that don't suck so
143
+ much.
144
+ test_files:
145
+ - spec/fixtures/apngasm.png
146
+ - spec/fixtures/compiled.svg
147
+ - spec/paperclip-phantom_svg_spec.rb
148
+ - spec/spec_helper.rb
149
+ has_rdoc: