paperclip-phantom_svg 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: