victor-cli 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +45 -16
- data/bin/victor +4 -8
- data/lib/victor/cli.rb +2 -0
- data/lib/victor/cli/code_generator.rb +31 -14
- data/lib/victor/cli/command_line.rb +4 -2
- data/lib/victor/cli/commands/generate_ruby.rb +38 -0
- data/lib/victor/cli/commands/generate_svg.rb +39 -0
- data/lib/victor/cli/parser.rb +13 -6
- data/lib/victor/cli/ruby_code.rb +33 -0
- data/lib/victor/cli/templates/cli.rb +8 -0
- data/lib/victor/cli/templates/dsl.rb +12 -0
- data/lib/victor/cli/templates/standalone.rb +10 -0
- data/lib/victor/cli/version.rb +1 -1
- metadata +24 -5
- data/lib/victor/cli/commands/generate.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9acf122e53e375434a1cad7cf0a5c1e93c7b804304f02e0907d0b95776739d4e
|
4
|
+
data.tar.gz: 93bbaa1caa3ccc7747f291f60de666fefd90696ed69c48f055f6ef0136c11bce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8f6f15561beecff52a10e4ab4c02837a10ac2037a65ea62467bc1a27d78140917b0f6a0f59d597b41f746b42835e30a3613e45b395d891eaa1113efe241c45f
|
7
|
+
data.tar.gz: de421ce4109502beaffc76f8a3df3b9d27e4f4a5117c411b1f9d417ecc85f01de61030c3623ee76d32e666f04401f94cf803eacd224e2cd80d64d8d0a073e9a9
|
data/README.md
CHANGED
@@ -14,31 +14,60 @@ Command line interface for [Victor][victor], the SVG Library.
|
|
14
14
|
|
15
15
|
$ gem install victor-cli
|
16
16
|
|
17
|
-
|
18
17
|
## Usage
|
19
18
|
|
19
|
+
### Convert SVG to Ruby
|
20
|
+
|
21
|
+
Given this SVG file:
|
22
|
+
|
23
|
+
```xml
|
24
|
+
<!-- example.svg -->
|
25
|
+
<svg width="140" height="100">
|
26
|
+
<circle cx="50" cy="50" r="30" fill="yellow"/>
|
27
|
+
</svg>
|
28
|
+
```
|
29
|
+
|
30
|
+
Run this command:
|
31
|
+
|
32
|
+
```shell
|
33
|
+
$ victor to-ruby example.svg
|
34
|
+
```
|
35
|
+
|
36
|
+
To generate this Ruby code:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
setup width: "140", height: "100"
|
40
|
+
|
41
|
+
build do
|
42
|
+
circle cx: "50", cy: "50", r: "30", fill: "yellow"
|
43
|
+
end
|
44
|
+
|
20
45
|
```
|
21
|
-
$ victor generate --help
|
22
|
-
Generate Ruby code from SVG
|
23
46
|
|
24
|
-
|
25
|
-
victor generate SVG_FILE [RUBY_FILE]
|
26
|
-
victor generate (-h|--help)
|
47
|
+
### Convert Ruby to SVG
|
27
48
|
|
28
|
-
|
29
|
-
-h --help
|
30
|
-
Show this help
|
49
|
+
Given this Ruby code:
|
31
50
|
|
32
|
-
|
33
|
-
|
34
|
-
|
51
|
+
```ruby
|
52
|
+
# example.rb
|
53
|
+
setup width: 140, height: 100
|
35
54
|
|
36
|
-
|
37
|
-
|
55
|
+
build do
|
56
|
+
circle cx: 50, cy: 50, r: 30, fill: "yellow"
|
57
|
+
end
|
58
|
+
```
|
59
|
+
|
60
|
+
Run this command:
|
61
|
+
```shell
|
62
|
+
$ victor to-svg example.rb --template minimal
|
63
|
+
```
|
38
64
|
|
39
|
-
|
40
|
-
victor generate example.svg example.rb
|
65
|
+
To generate this code:
|
41
66
|
|
67
|
+
```xml
|
68
|
+
<svg width="140" height="100">
|
69
|
+
<circle cx="50" cy="50" r="30" fill="yellow"/>
|
70
|
+
</svg>
|
42
71
|
```
|
43
72
|
|
44
73
|
---
|
data/bin/victor
CHANGED
@@ -1,13 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'victor/cli'
|
3
|
+
require 'pretty_trace/enable-trim'
|
4
|
+
|
3
5
|
include Colsole
|
6
|
+
PrettyTrace.filter [/gem/, /lib/, /bin\/victor/]
|
4
7
|
|
5
8
|
router = Victor::CLI::CommandLine.router
|
6
|
-
|
7
|
-
begin
|
8
|
-
exit router.run ARGV
|
9
|
-
rescue => e
|
10
|
-
puts e.backtrace.reverse if ENV['DEBUG']
|
11
|
-
say! "!txtred!#{e.class}: #{e.message}"
|
12
|
-
exit 1
|
13
|
-
end
|
9
|
+
exit router.run ARGV
|
data/lib/victor/cli.rb
CHANGED
@@ -3,24 +3,25 @@ require "rufo"
|
|
3
3
|
module Victor
|
4
4
|
module CLI
|
5
5
|
class CodeGenerator
|
6
|
-
|
6
|
+
attr_reader :svg_tree, :template
|
7
|
+
|
8
|
+
def initialize(svg_tree, template: nil)
|
7
9
|
@svg_tree = svg_tree
|
10
|
+
@template = template || :cli
|
8
11
|
end
|
9
12
|
|
10
13
|
def generate
|
11
14
|
Rufo::Formatter.format(code_for_node(svg_tree))
|
12
15
|
end
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
attr_reader :svg_tree
|
17
|
+
private
|
17
18
|
|
18
19
|
def code_for_node(node)
|
19
20
|
case node.first
|
20
21
|
when "svg"
|
21
|
-
root_to_ruby
|
22
|
+
root_to_ruby node
|
22
23
|
else
|
23
|
-
node_to_ruby
|
24
|
+
node_to_ruby node
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
@@ -48,16 +49,32 @@ module Victor
|
|
48
49
|
|
49
50
|
def root_to_ruby(node)
|
50
51
|
_, attrs, children = node
|
51
|
-
|
52
|
-
|
52
|
+
values = {
|
53
|
+
attributes: attrs_to_ruby(attrs),
|
54
|
+
nodes: nodes_to_ruby(children)
|
55
|
+
}
|
56
|
+
|
57
|
+
template_content(template) % values
|
58
|
+
end
|
59
|
+
|
60
|
+
def template_content(name)
|
61
|
+
filename = File.join templates_path, "#{name}.rb"
|
53
62
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
63
|
+
unless File.exist? filename
|
64
|
+
raise "Template not found #{name}\nAvailable templates: #{available_templates.join ', '}"
|
65
|
+
end
|
58
66
|
|
59
|
-
|
60
|
-
|
67
|
+
File.read filename
|
68
|
+
end
|
69
|
+
|
70
|
+
def templates_path
|
71
|
+
@templates_path ||= File.expand_path "templates", __dir__
|
72
|
+
end
|
73
|
+
|
74
|
+
def available_templates
|
75
|
+
@available_templates ||= Dir["#{templates_path}/*.rb"].map do |path|
|
76
|
+
File.basename path, '.rb'
|
77
|
+
end
|
61
78
|
end
|
62
79
|
end
|
63
80
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'mister_bin'
|
2
2
|
require_relative 'commands/base'
|
3
|
-
require_relative 'commands/
|
3
|
+
require_relative 'commands/generate_ruby'
|
4
|
+
require_relative 'commands/generate_svg'
|
4
5
|
|
5
6
|
module Victor
|
6
7
|
module CLI
|
@@ -9,7 +10,8 @@ module Victor
|
|
9
10
|
router = MisterBin::Runner.new version: VERSION,
|
10
11
|
header: "Victor SVG Utilities"
|
11
12
|
|
12
|
-
router.route '
|
13
|
+
router.route 'to-ruby', to: Commands::GenerateRuby
|
14
|
+
router.route 'to-svg', to: Commands::GenerateSVG
|
13
15
|
|
14
16
|
router
|
15
17
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Victor
|
2
|
+
module CLI
|
3
|
+
module Commands
|
4
|
+
class GenerateRuby < Base
|
5
|
+
summary "Convert SVG to Ruby code"
|
6
|
+
|
7
|
+
usage "victor to-ruby SVG_FILE [RUBY_FILE --template NAME]"
|
8
|
+
usage "victor to-ruby (-h|--help)"
|
9
|
+
|
10
|
+
option "-t, --template NAME", "Name of the Ruby template to use. Can be:\n" +
|
11
|
+
" standalone a full standalone Ruby script\n" +
|
12
|
+
" dsl a Victor DSL script\n" +
|
13
|
+
" cli a Victor CLI compatible DSL script (default)"
|
14
|
+
|
15
|
+
param "SVG_FILE", "Input SVG file"
|
16
|
+
param "RUBY_FILE", "Output Ruby file. Leave empty to write to stdout"
|
17
|
+
|
18
|
+
example "victor to-ruby example.svg example.rb"
|
19
|
+
|
20
|
+
def run
|
21
|
+
svg_file = File.read(args["SVG_FILE"])
|
22
|
+
svg_tree = Parser.new(svg_file).parse
|
23
|
+
generator = CodeGenerator.new svg_tree, template: args['--template']
|
24
|
+
|
25
|
+
code = generator.generate
|
26
|
+
ruby_file = args["RUBY_FILE"]
|
27
|
+
|
28
|
+
if ruby_file
|
29
|
+
File.write ruby_file, code
|
30
|
+
say "Saved #{ruby_file}"
|
31
|
+
else
|
32
|
+
puts code
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Victor
|
2
|
+
module CLI
|
3
|
+
module Commands
|
4
|
+
class GenerateSVG < Base
|
5
|
+
summary "Convert Ruby code to SVG"
|
6
|
+
|
7
|
+
usage "victor to-svg RUBY_FILE [SVG_FILE --template TEMPLATE]"
|
8
|
+
usage "victor to-svg (-h|--help)"
|
9
|
+
|
10
|
+
option '-t, --template TEMPLATE', "Set SVG template\n"+
|
11
|
+
"Can be: default, html, minimal, or a file path"
|
12
|
+
|
13
|
+
param "RUBY_FILE", "Input Ruby file"
|
14
|
+
param "SVG_FILE", "Output SVG file. Leave empty to write to stdout"
|
15
|
+
|
16
|
+
example "victor to-svg input.rb output.svg"
|
17
|
+
example "victor to-svg input.rb --template minimal"
|
18
|
+
|
19
|
+
def run
|
20
|
+
ruby_file = args["RUBY_FILE"]
|
21
|
+
svg_file = args["SVG_FILE"]
|
22
|
+
template = args['--template']
|
23
|
+
code = File.read ruby_file
|
24
|
+
|
25
|
+
ruby_code = RubyCode.new code
|
26
|
+
ruby_code.evaluate
|
27
|
+
ruby_code.template template if template
|
28
|
+
|
29
|
+
if svg_file
|
30
|
+
ruby_code.svg.save svg_file
|
31
|
+
say "Saved #{svg_file}"
|
32
|
+
else
|
33
|
+
puts ruby_code.svg.render
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/victor/cli/parser.rb
CHANGED
@@ -3,21 +3,28 @@ require "nokogiri"
|
|
3
3
|
module Victor
|
4
4
|
module CLI
|
5
5
|
class Parser
|
6
|
+
attr_reader :raw_svg
|
7
|
+
|
6
8
|
def initialize(raw_svg)
|
7
9
|
@raw_svg = raw_svg
|
8
10
|
end
|
9
11
|
|
10
12
|
def parse
|
11
|
-
parse_node
|
13
|
+
parse_node svg_root
|
12
14
|
end
|
13
15
|
|
14
|
-
|
16
|
+
private
|
15
17
|
|
16
|
-
attr_reader :raw_svg
|
17
18
|
|
18
19
|
def parse_node(node)
|
19
|
-
|
20
|
-
|
20
|
+
case node
|
21
|
+
when Nokogiri::XML::Comment
|
22
|
+
nil
|
23
|
+
when Nokogiri::XML::Text
|
24
|
+
parse_text node
|
25
|
+
else
|
26
|
+
parse_normal_node node
|
27
|
+
end
|
21
28
|
end
|
22
29
|
|
23
30
|
def parse_text(node)
|
@@ -46,7 +53,7 @@ module Victor
|
|
46
53
|
end
|
47
54
|
|
48
55
|
def xml_doc
|
49
|
-
Nokogiri::XML
|
56
|
+
Nokogiri::XML raw_svg
|
50
57
|
end
|
51
58
|
|
52
59
|
def svg_root
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Victor
|
2
|
+
module CLI
|
3
|
+
class RubyCode
|
4
|
+
include Victor::DSL
|
5
|
+
attr_reader :code
|
6
|
+
|
7
|
+
def initialize(code)
|
8
|
+
@code = code
|
9
|
+
end
|
10
|
+
|
11
|
+
def evaluate
|
12
|
+
instance_eval code
|
13
|
+
end
|
14
|
+
|
15
|
+
def template(template)
|
16
|
+
if built_in_templates.include? template
|
17
|
+
template = template.to_sym
|
18
|
+
elsif !File.exist? template
|
19
|
+
raise "Template not found #{template}\nAvailable templates: #{built_in_templates.join ', '}, or a file path"
|
20
|
+
end
|
21
|
+
|
22
|
+
svg.template = template
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def built_in_templates
|
28
|
+
%w[default minimal html]
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/victor/cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: victor-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-04-
|
12
|
+
date: 2020-04-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mister_bin
|
@@ -45,14 +45,14 @@ dependencies:
|
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '0.
|
48
|
+
version: '0.3'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '0.
|
55
|
+
version: '0.3'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: nokogiri
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,6 +81,20 @@ dependencies:
|
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0.12'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: pretty_trace
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0.2'
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0.2'
|
84
98
|
description: CLI for Victor, the SVG Library
|
85
99
|
email: db@dannyben.com
|
86
100
|
executables:
|
@@ -94,8 +108,13 @@ files:
|
|
94
108
|
- lib/victor/cli/code_generator.rb
|
95
109
|
- lib/victor/cli/command_line.rb
|
96
110
|
- lib/victor/cli/commands/base.rb
|
97
|
-
- lib/victor/cli/commands/
|
111
|
+
- lib/victor/cli/commands/generate_ruby.rb
|
112
|
+
- lib/victor/cli/commands/generate_svg.rb
|
98
113
|
- lib/victor/cli/parser.rb
|
114
|
+
- lib/victor/cli/ruby_code.rb
|
115
|
+
- lib/victor/cli/templates/cli.rb
|
116
|
+
- lib/victor/cli/templates/dsl.rb
|
117
|
+
- lib/victor/cli/templates/standalone.rb
|
99
118
|
- lib/victor/cli/version.rb
|
100
119
|
homepage: https://github.com/dannyben/victor-cli
|
101
120
|
licenses:
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Victor
|
2
|
-
module CLI
|
3
|
-
module Commands
|
4
|
-
class Generate < Base
|
5
|
-
summary "Generate Ruby code from SVG"
|
6
|
-
|
7
|
-
usage "victor generate SVG_FILE [RUBY_FILE]"
|
8
|
-
usage "victor generate (-h|--help)"
|
9
|
-
|
10
|
-
param "SVG_FILE", "Input SVG file"
|
11
|
-
param "RUBY_FILE", "Output Ruby file. Leave empty to write to stdout"
|
12
|
-
|
13
|
-
example "victor generate example.svg example.rb"
|
14
|
-
|
15
|
-
def run
|
16
|
-
svg_file = File.read(args["SVG_FILE"])
|
17
|
-
svg_tree = Parser.new(svg_file).parse
|
18
|
-
code = CodeGenerator.new(svg_tree).generate
|
19
|
-
ruby_file = args["RUBY_FILE"]
|
20
|
-
|
21
|
-
if ruby_file
|
22
|
-
File.write ruby_file, code
|
23
|
-
else
|
24
|
-
puts code
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|