inline_svg 0.3.0 → 0.4.0
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.
Potentially problematic release.
This version of inline_svg might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -1
- data/README.md +14 -3
- data/lib/inline_svg/action_view/helpers.rb +3 -22
- data/lib/inline_svg/transform_pipeline/transformations/class_attribute.rb +10 -0
- data/lib/inline_svg/transform_pipeline/transformations/description.rb +11 -0
- data/lib/inline_svg/transform_pipeline/transformations/no_comment.rb +10 -0
- data/lib/inline_svg/transform_pipeline/transformations/size.rb +19 -0
- data/lib/inline_svg/transform_pipeline/transformations/title.rb +11 -0
- data/lib/inline_svg/transform_pipeline/transformations/transformation.rb +23 -0
- data/lib/inline_svg/transform_pipeline/transformations.rb +22 -0
- data/lib/inline_svg/transform_pipeline.rb +14 -0
- data/lib/inline_svg/version.rb +1 -1
- data/lib/inline_svg.rb +3 -1
- data/spec/helpers/inline_svg_spec.rb +11 -11
- data/spec/transformation_pipeline/transformations/size_spec.rb +21 -0
- data/spec/transformation_pipeline/transformations_spec.rb +41 -0
- metadata +14 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fee50facd0f1019648bd0f7ab4d716c26919c098
|
4
|
+
data.tar.gz: 4987318412fe0646742ceaf185df7a33bf2f1835
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 440f34b97188f0e0733ecc60d31bd436b2b911a708339b759b4729469029a01755498c4ea105eead195867749751049b57b2b6aa064dbc6ded2d23df65f0d79f
|
7
|
+
data.tar.gz: 316936a7b5e273da6ba81e38e6f1f70df6aca4ac73ec8c80fbd3a7658a0e6f13be4ec5e0308c899fbc6b1336a46e3409d5efec7851ceb4b7f0860bd12d172b48
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,17 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
5
5
|
## [Unreleased][unreleased]
|
6
6
|
Nothing.
|
7
7
|
|
8
|
+
## [0.4.0] - 2015-03-22
|
9
|
+
### Added
|
10
|
+
- A new option: `size` adds width and height attributes to an SVG. Thanks, @2metres.
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
- Dramatically simplified the TransformPipeline and Transformations code.
|
14
|
+
- Added tests for the pipeline and new size transformations.
|
15
|
+
|
16
|
+
### Fixed
|
17
|
+
- Transformations can no longer be created with a nil value.
|
18
|
+
|
8
19
|
## [0.3.0] - 2015-03-20
|
9
20
|
### Added
|
10
21
|
- Use Sprockets to find canonical asset paths (fingerprinted, post asset-pipeline).
|
@@ -22,6 +33,8 @@ Nothing.
|
|
22
33
|
### Added
|
23
34
|
- Basic Railtie and view helper to inline SVG documents to Rails views.
|
24
35
|
|
25
|
-
[unreleased]: https://github.com/jamesmartin/inline_svg/compare/v0.
|
36
|
+
[unreleased]: https://github.com/jamesmartin/inline_svg/compare/v0.4.0...HEAD
|
37
|
+
[0.4.0]: https://github.com/jamesmartin/inline_svg/compare/v0.3.0...v0.4.0
|
38
|
+
[0.3.0]: https://github.com/jamesmartin/inline_svg/compare/v0.2.0...v0.3.0
|
26
39
|
[0.2.0]: https://github.com/jamesmartin/inline_svg/compare/v0.1.0...v0.2.0
|
27
40
|
[0.1.0]: https://github.com/jamesmartin/inline_svg/compare/v0.0.1...v0.1.0
|
data/README.md
CHANGED
@@ -32,9 +32,12 @@ Or install it yourself as:
|
|
32
32
|
```
|
33
33
|
inline_svg(file_name, options={})
|
34
34
|
```
|
35
|
+
The `file_name` can be a full path to a file, or just the file's basename. The
|
36
|
+
actual path of the file on disk is resolved using
|
37
|
+
[Sprockets](://github.com/sstephenson/sprockets), which means you can pre-process
|
38
|
+
and fingerprint your SVG files like any other Rails asset.
|
35
39
|
|
36
|
-
|
37
|
-
an example of embedding an SVG document and applying a 'class' attribute in
|
40
|
+
Here's an example of embedding an SVG document and applying a 'class' attribute in
|
38
41
|
HAML:
|
39
42
|
|
40
43
|
```
|
@@ -63,6 +66,9 @@ blue:
|
|
63
66
|
|
64
67
|
## Options
|
65
68
|
* `class`: set a CSS class attribute on the SVG
|
69
|
+
* `size`: set width and height attributes on the SVG
|
70
|
+
* Supplied as "{Width} * {Height}" or "{Number}", so "30px*45px" becomes `width="30px"`
|
71
|
+
and `height="45px"`, and "50%" becomes `width="50%"` and `height="50%"`
|
66
72
|
* `title`: add a \<title\> node inside the top level of the SVG document
|
67
73
|
* `desc`: add a \<desc\> node inside the top level of the SVG document
|
68
74
|
* `nocomment`: remove comment tags (and other unsafe/unknown tags) from svg
|
@@ -71,7 +77,7 @@ blue:
|
|
71
77
|
Example:
|
72
78
|
|
73
79
|
```
|
74
|
-
inline_svg("some-document.svg", class: 'some-class', title: 'Some Title', desc:
|
80
|
+
inline_svg("some-document.svg", class: 'some-class', size: '30% * 20%', title: 'Some Title', desc:
|
75
81
|
'Some interesting description', nocomment: true)
|
76
82
|
```
|
77
83
|
|
@@ -82,3 +88,8 @@ inline_svg("some-document.svg", class: 'some-class', title: 'Some Title', desc:
|
|
82
88
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
83
89
|
4. Push to the branch (`git push origin my-new-feature`)
|
84
90
|
5. Create new Pull Request
|
91
|
+
|
92
|
+
Please write tests for anything you change, add or fix.
|
93
|
+
There is a [basic Rails
|
94
|
+
app](http://github.com/jamesmartin/inline_svg_test_app) that demonstrates the
|
95
|
+
gem's functionality in use.
|
@@ -1,36 +1,17 @@
|
|
1
1
|
require 'action_view/helpers' if defined?(Rails)
|
2
2
|
require 'action_view/context' if defined?(Rails)
|
3
|
-
require 'nokogiri'
|
4
|
-
require 'loofah'
|
5
3
|
|
6
4
|
module InlineSvg
|
7
5
|
module ActionView
|
8
6
|
module Helpers
|
9
|
-
def inline_svg(filename,
|
7
|
+
def inline_svg(filename, transform_params={})
|
10
8
|
begin
|
11
|
-
|
9
|
+
svg_file = AssetFile.named(filename)
|
12
10
|
rescue InlineSvg::AssetFile::FileNotFound
|
13
11
|
return "<svg><!-- SVG file not found: '#{filename}' --></svg>".html_safe
|
14
12
|
end
|
15
13
|
|
16
|
-
|
17
|
-
doc.scrub!(:strip)
|
18
|
-
end
|
19
|
-
|
20
|
-
svg = doc.at_css 'svg'
|
21
|
-
if options[:class]
|
22
|
-
svg['class'] = options[:class]
|
23
|
-
end
|
24
|
-
|
25
|
-
%i(title desc).each do |child|
|
26
|
-
if options[child].present?
|
27
|
-
node = Nokogiri::XML::Node.new(child.to_s, doc)
|
28
|
-
node.content = options[child]
|
29
|
-
svg.add_child node
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
doc.to_html.html_safe
|
14
|
+
InlineSvg::TransformPipeline.generate_html_from(svg_file, transform_params).html_safe
|
34
15
|
end
|
35
16
|
end
|
36
17
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module InlineSvg::TransformPipeline::Transformations
|
2
|
+
class Description < Transformation
|
3
|
+
def transform(doc)
|
4
|
+
doc = Nokogiri::XML::Document.parse(doc.to_html)
|
5
|
+
node = Nokogiri::XML::Node.new('desc', doc)
|
6
|
+
node.content = value
|
7
|
+
doc.at_css('svg').add_child(node)
|
8
|
+
doc
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module InlineSvg::TransformPipeline::Transformations
|
2
|
+
class Size < Transformation
|
3
|
+
def transform(doc)
|
4
|
+
doc = Nokogiri::XML::Document.parse(doc.to_html)
|
5
|
+
svg = doc.at_css 'svg'
|
6
|
+
svg['width'] = width_of(self.value)
|
7
|
+
svg['height'] = height_of(self.value)
|
8
|
+
doc
|
9
|
+
end
|
10
|
+
|
11
|
+
def width_of(value)
|
12
|
+
value.split(/\*/).map(&:strip)[0]
|
13
|
+
end
|
14
|
+
|
15
|
+
def height_of(value)
|
16
|
+
value.split(/\*/).map(&:strip)[1] || width_of(value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module InlineSvg::TransformPipeline::Transformations
|
2
|
+
class Title < Transformation
|
3
|
+
def transform(doc)
|
4
|
+
doc = Nokogiri::XML::Document.parse(doc.to_html)
|
5
|
+
node = Nokogiri::XML::Node.new('title', doc)
|
6
|
+
node.content = value
|
7
|
+
doc.at_css('svg').add_child(node)
|
8
|
+
doc
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module InlineSvg::TransformPipeline::Transformations
|
2
|
+
class Transformation
|
3
|
+
def self.create_with_value(value)
|
4
|
+
self.new(value)
|
5
|
+
end
|
6
|
+
|
7
|
+
attr_reader :value
|
8
|
+
|
9
|
+
def initialize(value)
|
10
|
+
@value = value
|
11
|
+
end
|
12
|
+
|
13
|
+
def transform(*)
|
14
|
+
raise "#transform should be implemented by subclasses of Transformation"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class NullTransformation < Transformation
|
19
|
+
def transform(doc)
|
20
|
+
doc
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module InlineSvg::TransformPipeline::Transformations
|
2
|
+
def self.all_transformations
|
3
|
+
{nocomment: NoComment, class: ClassAttribute, title: Title, desc: Description, size: Size}
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.lookup(transform_params)
|
7
|
+
without_empty_values(transform_params).map do |key, value|
|
8
|
+
all_transformations.fetch(key, NullTransformation).create_with_value(value)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.without_empty_values(params)
|
13
|
+
params.reject {|key, value| value.nil?}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'inline_svg/transform_pipeline/transformations/transformation'
|
18
|
+
require 'inline_svg/transform_pipeline/transformations/no_comment'
|
19
|
+
require 'inline_svg/transform_pipeline/transformations/class_attribute'
|
20
|
+
require 'inline_svg/transform_pipeline/transformations/title'
|
21
|
+
require 'inline_svg/transform_pipeline/transformations/description'
|
22
|
+
require 'inline_svg/transform_pipeline/transformations/size'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module InlineSvg
|
2
|
+
module TransformPipeline
|
3
|
+
def self.generate_html_from(svg_file, transform_params)
|
4
|
+
document = Nokogiri::XML::Document.parse(svg_file)
|
5
|
+
Transformations.lookup(transform_params).reduce(document) do |doc, transformer|
|
6
|
+
transformer.transform(doc)
|
7
|
+
end.to_html
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'nokogiri'
|
13
|
+
require 'loofah'
|
14
|
+
require 'inline_svg/transform_pipeline/transformations'
|
data/lib/inline_svg/version.rb
CHANGED
data/lib/inline_svg.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require "inline_svg/version"
|
2
2
|
require "inline_svg/action_view/helpers"
|
3
|
-
require "inline_svg/finds_asset_paths"
|
4
3
|
require "inline_svg/asset_file"
|
4
|
+
require "inline_svg/finds_asset_paths"
|
5
|
+
require "inline_svg/transform_pipeline"
|
6
|
+
|
5
7
|
require "inline_svg/railtie" if defined?(Rails)
|
6
8
|
require 'active_support/core_ext'
|
7
9
|
require 'nokogiri'
|
@@ -19,9 +19,9 @@ describe InlineSvg::ActionView::Helpers do
|
|
19
19
|
|
20
20
|
context "and no options" do
|
21
21
|
it "returns a html safe version of the file's contents" do
|
22
|
-
example_file = <<-SVG
|
23
|
-
|
24
|
-
|
22
|
+
example_file = <<-SVG
|
23
|
+
<svg xmlns="http://www.w3.org/2000/svg" role="presentation" xml:lang="en"><!-- This is a comment --></svg>
|
24
|
+
SVG
|
25
25
|
allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(example_file)
|
26
26
|
expect(helper.inline_svg('some-file')).to eq example_file
|
27
27
|
end
|
@@ -29,10 +29,10 @@ describe InlineSvg::ActionView::Helpers do
|
|
29
29
|
|
30
30
|
context "and the 'title' option" do
|
31
31
|
it "adds the title node to the SVG output" do
|
32
|
-
input_svg = <<-SVG
|
32
|
+
input_svg = <<-SVG
|
33
33
|
<svg xmlns="http://www.w3.org/2000/svg" role="presentation" xml:lang="en"></svg>
|
34
34
|
SVG
|
35
|
-
expected_output = <<-SVG
|
35
|
+
expected_output = <<-SVG
|
36
36
|
<svg xmlns="http://www.w3.org/2000/svg" role="presentation" xml:lang="en"><title>A title</title></svg>
|
37
37
|
SVG
|
38
38
|
allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
|
@@ -42,10 +42,10 @@ SVG
|
|
42
42
|
|
43
43
|
context "and the 'desc' option" do
|
44
44
|
it "adds the description node to the SVG output" do
|
45
|
-
input_svg = <<-SVG
|
45
|
+
input_svg = <<-SVG
|
46
46
|
<svg xmlns="http://www.w3.org/2000/svg" role="presentation" xml:lang="en"></svg>
|
47
47
|
SVG
|
48
|
-
expected_output = <<-SVG
|
48
|
+
expected_output = <<-SVG
|
49
49
|
<svg xmlns="http://www.w3.org/2000/svg" role="presentation" xml:lang="en"><desc>A description</desc></svg>
|
50
50
|
SVG
|
51
51
|
allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
|
@@ -55,10 +55,10 @@ SVG
|
|
55
55
|
|
56
56
|
context "and the 'nocomment' option" do
|
57
57
|
it "strips comments and other unknown/unsafe nodes from the output" do
|
58
|
-
input_svg = <<-SVG
|
58
|
+
input_svg = <<-SVG
|
59
59
|
<svg xmlns="http://www.w3.org/2000/svg" role="presentation" xml:lang="en"><!-- This is a comment --></svg>
|
60
60
|
SVG
|
61
|
-
expected_output = <<-SVG
|
61
|
+
expected_output = <<-SVG
|
62
62
|
<svg xmlns="http://www.w3.org/2000/svg" xml:lang="en"></svg>
|
63
63
|
SVG
|
64
64
|
allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
|
@@ -68,10 +68,10 @@ SVG
|
|
68
68
|
|
69
69
|
context "and all options" do
|
70
70
|
it "applies all expected transformations to the output" do
|
71
|
-
input_svg = <<-SVG
|
71
|
+
input_svg = <<-SVG
|
72
72
|
<svg xmlns="http://www.w3.org/2000/svg" role="presentation" xml:lang="en"><!-- This is a comment --></svg>
|
73
73
|
SVG
|
74
|
-
expected_output = <<-SVG
|
74
|
+
expected_output = <<-SVG
|
75
75
|
<svg xmlns="http://www.w3.org/2000/svg" xml:lang="en"><title>A title</title>
|
76
76
|
<desc>A description</desc></svg>
|
77
77
|
SVG
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'inline_svg/transform_pipeline'
|
2
|
+
|
3
|
+
describe InlineSvg::TransformPipeline::Transformations::Size do
|
4
|
+
it "adds width and height attributes to a SVG document" do
|
5
|
+
document = Nokogiri::XML::Document.parse('<svg>Some document</svg>')
|
6
|
+
transformation = InlineSvg::TransformPipeline::Transformations::Size.create_with_value("5% * 5%")
|
7
|
+
|
8
|
+
expect(transformation.transform(document).to_html).to eq(
|
9
|
+
"<svg width=\"5%\" height=\"5%\">Some document</svg>\n"
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "adds the same width and height value when only passed one attribute" do
|
14
|
+
document = Nokogiri::XML::Document.parse('<svg>Some document</svg>')
|
15
|
+
transformation = InlineSvg::TransformPipeline::Transformations::Size.create_with_value("5%")
|
16
|
+
|
17
|
+
expect(transformation.transform(document).to_html).to eq(
|
18
|
+
"<svg width=\"5%\" height=\"5%\">Some document</svg>\n"
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'inline_svg/transform_pipeline'
|
2
|
+
|
3
|
+
describe InlineSvg::TransformPipeline::Transformations do
|
4
|
+
context "looking up transformations" do
|
5
|
+
it "returns configured transformations when parameters are supplied" do
|
6
|
+
transformations = InlineSvg::TransformPipeline::Transformations.lookup(
|
7
|
+
nocomment: 'irrelevant',
|
8
|
+
class: 'irrelevant',
|
9
|
+
title: 'irrelevant',
|
10
|
+
desc: 'irrelevant',
|
11
|
+
size: 'irrelevant'
|
12
|
+
)
|
13
|
+
|
14
|
+
expect(transformations.map(&:class)).to match_array([
|
15
|
+
InlineSvg::TransformPipeline::Transformations::NoComment,
|
16
|
+
InlineSvg::TransformPipeline::Transformations::ClassAttribute,
|
17
|
+
InlineSvg::TransformPipeline::Transformations::Title,
|
18
|
+
InlineSvg::TransformPipeline::Transformations::Description,
|
19
|
+
InlineSvg::TransformPipeline::Transformations::Size
|
20
|
+
])
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns a benign transformation when asked for an unknown transform" do
|
24
|
+
transformations = InlineSvg::TransformPipeline::Transformations.lookup(
|
25
|
+
not_a_real_transform: 'irrelevant'
|
26
|
+
)
|
27
|
+
|
28
|
+
expect(transformations.map(&:class)).to match_array([
|
29
|
+
InlineSvg::TransformPipeline::Transformations::NullTransformation
|
30
|
+
])
|
31
|
+
end
|
32
|
+
|
33
|
+
it "does not return a transformation when a value is not supplied" do
|
34
|
+
transformations = InlineSvg::TransformPipeline::Transformations.lookup(
|
35
|
+
title: nil
|
36
|
+
)
|
37
|
+
|
38
|
+
expect(transformations.map(&:class)).to match_array([])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inline_svg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Martin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -113,12 +113,22 @@ files:
|
|
113
113
|
- lib/inline_svg/asset_file.rb
|
114
114
|
- lib/inline_svg/finds_asset_paths.rb
|
115
115
|
- lib/inline_svg/railtie.rb
|
116
|
+
- lib/inline_svg/transform_pipeline.rb
|
117
|
+
- lib/inline_svg/transform_pipeline/transformations.rb
|
118
|
+
- lib/inline_svg/transform_pipeline/transformations/class_attribute.rb
|
119
|
+
- lib/inline_svg/transform_pipeline/transformations/description.rb
|
120
|
+
- lib/inline_svg/transform_pipeline/transformations/no_comment.rb
|
121
|
+
- lib/inline_svg/transform_pipeline/transformations/size.rb
|
122
|
+
- lib/inline_svg/transform_pipeline/transformations/title.rb
|
123
|
+
- lib/inline_svg/transform_pipeline/transformations/transformation.rb
|
116
124
|
- lib/inline_svg/version.rb
|
117
125
|
- spec/asset_file_spec.rb
|
118
126
|
- spec/files/example.svg
|
119
127
|
- spec/finds_asset_paths_spec.rb
|
120
128
|
- spec/helpers/inline_svg_spec.rb
|
121
129
|
- spec/inline_svg_spec.rb
|
130
|
+
- spec/transformation_pipeline/transformations/size_spec.rb
|
131
|
+
- spec/transformation_pipeline/transformations_spec.rb
|
122
132
|
homepage: ''
|
123
133
|
licenses:
|
124
134
|
- MIT
|
@@ -149,3 +159,5 @@ test_files:
|
|
149
159
|
- spec/finds_asset_paths_spec.rb
|
150
160
|
- spec/helpers/inline_svg_spec.rb
|
151
161
|
- spec/inline_svg_spec.rb
|
162
|
+
- spec/transformation_pipeline/transformations/size_spec.rb
|
163
|
+
- spec/transformation_pipeline/transformations_spec.rb
|