scale 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f408226378fee538cbc1ee10bbaf1c773d9381b
4
- data.tar.gz: d010bb80f316f1d14bb1d90549ae3fd44df1d264
3
+ metadata.gz: 86687ce7ff6a5fd49f8e64362b33eafdc2918fbb
4
+ data.tar.gz: db33554c486c5f7f8bb5202395898667305bb95b
5
5
  SHA512:
6
- metadata.gz: bca9a3cb166dc50afe02bdb1b4fba814e3dafcd954a0e3bf0711faa14a9e9d4e915f38b9aeb4672aa2d20e863abc056bd4abb43fef4768e2b0dbd3ebcb00cac6
7
- data.tar.gz: 261a7863b70c3b96c204b6f112fa331a8e98a7c6addcf11b1501d7e7a4be65331ed3c143410393df65803a9a81baf1efa73e5f804bb58d15ffda4658991b014e
6
+ metadata.gz: af23fb556e2d43618624455e4c04a24a12e927410bab6f36a4f3be9936225fa5ff6b55ebc5f6dbac11ab9cb873f7e8cf2712a96b3062d4e9dcacb9ee221dd42a
7
+ data.tar.gz: 4b4571e4e4054dddb9a5b278f64c86a953e5d0c588263f8c09849038fc981284e599a016ad773676b6f4d3f5e4907e0f374f42b2f538e9dd407106c646c96a31
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
1
  --format documentation
2
2
  --color
3
+ --require spec_helper
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0"?>
2
+ <svg version="1.1" baseProfile="full" width="300" height="200" xmlns="http://www.w3.org/2000/svg">
3
+ <rect width="100%" height="100%" fill="red" />
4
+ <circle cx="150" cy="100" r="80" fill="green" />
5
+ <text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text>
6
+ </svg>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0"?>
2
+ <svg width="200" height="200" viewBox="0 0 100 100">
3
+ <rect x="0" y="0" width="100" height="100" />
4
+ </svg>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <svg width="200" height="250" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="10" y="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5" />
4
+ <rect x="60" y="10" rx="10" ry="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5"/>
5
+
6
+ <circle cx="25" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
7
+ <ellipse cx="75" cy="75" rx="20" ry="5" stroke="red" fill="transparent" stroke-width="5"/>
8
+
9
+ <line x1="10" x2="50" y1="110" y2="150" stroke="orange" fill="transparent" stroke-width="5"/>
10
+ <polyline points="60 110 65 120 70 115 75 130 80 125 85 140 90 135 95 150 100 145"
11
+ stroke="orange" fill="transparent" stroke-width="5"/>
12
+
13
+ <polygon points="50 160 55 180 70 180 60 190 65 205 50 195 35 205 40 190 30 180 45 180"
14
+ stroke="green" fill="transparent" stroke-width="5"/>
15
+
16
+ <path d="M20,230 Q40,205 50,230 T90,230" fill="none" stroke="blue" stroke-width="5"/>
17
+ </svg>
@@ -1,5 +1,12 @@
1
1
  require "scale/version"
2
+ require "scale/node"
3
+ require "scale/svg"
4
+ require "scale/shapes/rectangle"
5
+ require "scale/shapes/circle"
6
+ require "scale/shapes/ellipse"
7
+ require "scale/text"
8
+ require "scale/dsl"
2
9
 
3
10
  module Scale
4
- # Your code goes here...
11
+ # Your code goes here... NOT!
5
12
  end
@@ -0,0 +1,40 @@
1
+ module Scale
2
+ class DSL
3
+ def run
4
+ DSLBuilder.new.tap do |builder|
5
+ yield builder
6
+ end.to_xml
7
+ end
8
+ end
9
+
10
+ class DSLCommand
11
+ def initialize(name, args, block)
12
+ @name = name
13
+ @args = args
14
+ @block = block
15
+ end
16
+
17
+ def run(svg)
18
+ type = Kernel.const_get("Scale::#{@name.to_s.capitalize}")
19
+ svg.add(type.new(*@args))
20
+ end
21
+ end
22
+
23
+ class DSLBuilder
24
+ def initialize(commands = [])
25
+ @commands = commands
26
+ end
27
+
28
+ def method_missing(name, *args, &block)
29
+ @commands.push(DSLCommand.new(name, args, block))
30
+ end
31
+
32
+ def to_xml
33
+ svg = SVG.new
34
+ @commands.each do |command|
35
+ command.run(svg)
36
+ end
37
+ svg.to_xml
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,49 @@
1
+ require 'virtus'
2
+
3
+ module Scale
4
+ module Node
5
+ include Enumerable
6
+ include Virtus.module
7
+ attr_reader :content
8
+
9
+ def children
10
+ @children ||= []
11
+ end
12
+
13
+ def add(node)
14
+ children.push(node)
15
+ end
16
+
17
+ def each
18
+ children.each do |child|
19
+ yield child
20
+ end
21
+ end
22
+
23
+ def to_xml
24
+ builder = Nokogiri::XML::Builder.new do |xml|
25
+ append_to(xml)
26
+ end
27
+ builder.to_xml
28
+ end
29
+
30
+ def append_to(builder)
31
+ builder.send(xml_tag.to_sym, *xml_parameters) do
32
+ each do |node|
33
+ node.append_to(builder)
34
+ end
35
+ end
36
+ end
37
+
38
+ def xml_attributes
39
+ attributes.delete_if { |key, value| value.nil? }
40
+ end
41
+
42
+ private
43
+
44
+ def xml_parameters
45
+ return [xml_attributes] if content.nil?
46
+ [content, xml_attributes]
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,12 @@
1
+ module Scale
2
+ class Circle
3
+ include Node
4
+ attribute :cx, Integer
5
+ attribute :cy, Integer
6
+ attribute :r, Integer
7
+
8
+ def xml_tag
9
+ :circle
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module Scale
2
+ class Ellipse
3
+ include Node
4
+ attribute :rx, Integer
5
+ attribute :ry, Integer
6
+ attribute :cx, Integer
7
+ attribute :cy, Integer
8
+
9
+ def xml_tag
10
+ :ellipse
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ module Scale
2
+ class Rectangle
3
+ include Node
4
+ attribute :width, String
5
+ attribute :height, String
6
+ attribute :fill, String
7
+ attribute :x, Integer
8
+ attribute :y, Integer
9
+ attribute :rx, Integer
10
+ attribute :ry, Integer
11
+
12
+ def xml_tag
13
+ :rect
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,29 @@
1
+ require 'nokogiri'
2
+
3
+ module Scale
4
+ class SVG
5
+ include Node
6
+ attr_accessor :width, :height
7
+
8
+ def initialize(width: nil, height: nil)
9
+ @width, @height = width, height
10
+ end
11
+
12
+ private
13
+
14
+ def xml_tag
15
+ :svg
16
+ end
17
+
18
+ def attributes
19
+ attributes = {
20
+ version: "1.1",
21
+ baseProfile: "full",
22
+ xmlns: "http://www.w3.org/2000/svg",
23
+ }
24
+ attributes[:width] = width unless width.nil?
25
+ attributes[:height] = height unless height.nil?
26
+ attributes
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module Scale
2
+ class Text
3
+ include Node
4
+ attribute :x, Integer
5
+ attribute :y, Integer
6
+
7
+ def initialize(text, attributes = {})
8
+ @content = text
9
+ super(attributes)
10
+ end
11
+
12
+ def xml_tag
13
+ :text_
14
+ end
15
+ end
16
+ end
@@ -1,3 +1,3 @@
1
1
  module Scale
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -19,6 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
+ spec.add_dependency "nokogiri", "~> 1.6.6"
23
+ spec.add_dependency "virtus", "~> 1.0"
22
24
  spec.add_development_dependency "bundler", "~> 1.9"
23
25
  spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "rspec", "~> 3.2"
24
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scale
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - mo khan
@@ -10,6 +10,34 @@ bindir: exe
10
10
  cert_chain: []
11
11
  date: 2015-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: virtus
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: bundler
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +66,20 @@ dependencies:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
68
  version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.2'
41
83
  description: A simple DSL for producing SVG images.
42
84
  email:
43
85
  - mo@mokhan.ca
@@ -55,7 +97,17 @@ files:
55
97
  - Rakefile
56
98
  - bin/console
57
99
  - bin/setup
100
+ - examples/example.svg
101
+ - examples/positions.svg
102
+ - examples/shapes.svg
58
103
  - lib/scale.rb
104
+ - lib/scale/dsl.rb
105
+ - lib/scale/node.rb
106
+ - lib/scale/shapes/circle.rb
107
+ - lib/scale/shapes/ellipse.rb
108
+ - lib/scale/shapes/rectangle.rb
109
+ - lib/scale/svg.rb
110
+ - lib/scale/text.rb
59
111
  - lib/scale/version.rb
60
112
  - scale.gemspec
61
113
  homepage: http://www.mokhan.ca/