victor-cli 0.2.0 → 0.3.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 +32 -25
- data/bin/victor +1 -0
- data/lib/victor/cli.rb +6 -2
- data/lib/victor/cli/command_line.rb +4 -5
- data/lib/victor/cli/commands/{generate_ruby.rb → convert.rb} +7 -8
- data/lib/victor/cli/commands/init.rb +71 -0
- data/lib/victor/cli/commands/render.rb +73 -0
- data/lib/victor/cli/parser.rb +4 -7
- data/lib/victor/cli/refinements/stirng_refinements.rb +19 -0
- data/lib/victor/cli/{ruby_code.rb → ruby_source.rb} +9 -4
- data/lib/victor/cli/svg_source.rb +105 -0
- data/lib/victor/cli/templates/import/cli.rb +8 -0
- data/lib/victor/cli/templates/{dsl.rb → import/dsl.rb} +1 -1
- data/lib/victor/cli/templates/{standalone.rb → import/standalone.rb} +1 -1
- data/lib/victor/cli/templates/init/cli.rb +15 -0
- data/lib/victor/cli/templates/init/dsl.rb +19 -0
- data/lib/victor/cli/templates/init/standalone.rb +19 -0
- data/lib/victor/cli/version.rb +1 -1
- data/lib/victor/cli/xml_node.rb +14 -0
- data/lib/victor/cli/xml_text.rb +11 -0
- metadata +59 -24
- data/lib/victor/cli/code_generator.rb +0 -81
- data/lib/victor/cli/commands/generate_svg.rb +0 -39
- data/lib/victor/cli/templates/cli.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc2b1c5e3ce6627c982daf91c5ecb7c8427f61064f5df3474619ab4eb1e5f220
|
4
|
+
data.tar.gz: 04c775439539bb96ddb866354d7c8f3925ade9ddb768cb6b9e23f1cae22a017f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2453dcea1067196ae6e71ba9ef1c0c509ccc45c2c9ea109632612892a1b115fba64303b43aff65aa590bc75f4ea1a5ba3b8e91d3516a49478750492b2f7b104c
|
7
|
+
data.tar.gz: d5099606414fe52ff0e27c5da5b411751c38c47c8d98ac5968077b9895158f1de881030a7b00b5e405565618a233aac1a51f728ac201aaa0f4682eeb96be8d2c
|
data/README.md
CHANGED
@@ -16,35 +16,15 @@ Command line interface for [Victor][victor], the SVG Library.
|
|
16
16
|
|
17
17
|
## Usage
|
18
18
|
|
19
|
-
###
|
19
|
+
### `init`: Create a sample Ruby file
|
20
20
|
|
21
|
-
|
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:
|
21
|
+
Run this command to create an initial sample file:
|
31
22
|
|
32
23
|
```shell
|
33
|
-
$ victor
|
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
|
-
|
24
|
+
$ victor init example
|
45
25
|
```
|
46
26
|
|
47
|
-
###
|
27
|
+
### `render`: Render Ruby to SVG
|
48
28
|
|
49
29
|
Given this Ruby code:
|
50
30
|
|
@@ -59,7 +39,7 @@ end
|
|
59
39
|
|
60
40
|
Run this command:
|
61
41
|
```shell
|
62
|
-
$ victor
|
42
|
+
$ victor render example.rb --template minimal
|
63
43
|
```
|
64
44
|
|
65
45
|
To generate this code:
|
@@ -70,6 +50,33 @@ To generate this code:
|
|
70
50
|
</svg>
|
71
51
|
```
|
72
52
|
|
53
|
+
### `convert`: Convert SVG to Ruby
|
54
|
+
|
55
|
+
Given this SVG file:
|
56
|
+
|
57
|
+
```xml
|
58
|
+
<!-- example.svg -->
|
59
|
+
<svg width="140" height="100">
|
60
|
+
<circle cx="50" cy="50" r="30" fill="yellow"/>
|
61
|
+
</svg>
|
62
|
+
```
|
63
|
+
|
64
|
+
Run this command:
|
65
|
+
|
66
|
+
```shell
|
67
|
+
$ victor convert example.svg
|
68
|
+
```
|
69
|
+
|
70
|
+
To generate this Ruby code:
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
setup width: 140, height: 100
|
74
|
+
|
75
|
+
build do
|
76
|
+
circle cx: 50, cy: 50, r: 30, fill: "yellow"
|
77
|
+
end
|
78
|
+
|
79
|
+
```
|
73
80
|
---
|
74
81
|
|
75
82
|
[victor]: https://github.com/DannyBen/victor
|
data/bin/victor
CHANGED
data/lib/victor/cli.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
require 'victor'
|
2
|
+
require 'requires'
|
3
|
+
requires 'cli/refinements'
|
2
4
|
require_relative 'cli/parser'
|
3
|
-
require_relative 'cli/
|
4
|
-
require_relative 'cli/
|
5
|
+
require_relative 'cli/svg_source'
|
6
|
+
require_relative 'cli/ruby_source'
|
5
7
|
require_relative 'cli/command_line'
|
8
|
+
require_relative 'cli/xml_node'
|
9
|
+
require_relative 'cli/xml_text'
|
6
10
|
|
7
11
|
require 'byebug' if ENV['BYEBUG']
|
@@ -1,7 +1,5 @@
|
|
1
1
|
require 'mister_bin'
|
2
|
-
|
3
|
-
require_relative 'commands/generate_ruby'
|
4
|
-
require_relative 'commands/generate_svg'
|
2
|
+
requires 'commands/base', 'commands'
|
5
3
|
|
6
4
|
module Victor
|
7
5
|
module CLI
|
@@ -10,8 +8,9 @@ module Victor
|
|
10
8
|
router = MisterBin::Runner.new version: VERSION,
|
11
9
|
header: "Victor SVG Utilities"
|
12
10
|
|
13
|
-
router.route '
|
14
|
-
router.route '
|
11
|
+
router.route 'init', to: Commands::Init
|
12
|
+
router.route 'convert', to: Commands::Convert
|
13
|
+
router.route 'render', to: Commands::Render
|
15
14
|
|
16
15
|
router
|
17
16
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Victor
|
2
2
|
module CLI
|
3
3
|
module Commands
|
4
|
-
class
|
4
|
+
class Convert < Base
|
5
5
|
summary "Convert SVG to Ruby code"
|
6
6
|
|
7
|
-
usage "victor
|
8
|
-
usage "victor
|
7
|
+
usage "victor convert SVG_FILE [RUBY_FILE --template NAME]"
|
8
|
+
usage "victor convert (-h|--help)"
|
9
9
|
|
10
10
|
option "-t, --template NAME", "Name of the Ruby template to use. Can be:\n" +
|
11
11
|
" standalone a full standalone Ruby script\n" +
|
@@ -15,14 +15,13 @@ module Victor
|
|
15
15
|
param "SVG_FILE", "Input SVG file"
|
16
16
|
param "RUBY_FILE", "Output Ruby file. Leave empty to write to stdout"
|
17
17
|
|
18
|
-
example "victor
|
18
|
+
example "victor convert example.svg example.rb"
|
19
19
|
|
20
20
|
def run
|
21
|
-
|
22
|
-
|
23
|
-
generator = CodeGenerator.new svg_tree, template: args['--template']
|
21
|
+
svg_data = File.read(args["SVG_FILE"])
|
22
|
+
svg_source = SVGSource.new svg_data, template: args['--template']
|
24
23
|
|
25
|
-
code =
|
24
|
+
code = svg_source.ruby_code
|
26
25
|
ruby_file = args["RUBY_FILE"]
|
27
26
|
|
28
27
|
if ruby_file
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Victor
|
2
|
+
module CLI
|
3
|
+
module Commands
|
4
|
+
class Init < Base
|
5
|
+
summary "Create a sample Victor Ruby script"
|
6
|
+
|
7
|
+
usage "victor init RUBY_FILE [--template TEMPLATE]"
|
8
|
+
usage "victor init (-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 "RUBY_FILE", "Output Ruby file"
|
16
|
+
|
17
|
+
example "victor init ghost.rb"
|
18
|
+
example "victor init ghost.rb --template standalone"
|
19
|
+
|
20
|
+
def run
|
21
|
+
raise "File already exists #{filename}" if File.exist? filename
|
22
|
+
|
23
|
+
basename = File.basename filename, '.rb'
|
24
|
+
vars = { filename: filename, basename: basename }
|
25
|
+
content = template_content(template) % vars
|
26
|
+
|
27
|
+
File.write filename, content
|
28
|
+
say "Saved #{filename}"
|
29
|
+
|
30
|
+
if template == 'cli'
|
31
|
+
say %Q[Run !txtblu!victor render "#{filename}"!txtrst! to render]
|
32
|
+
else
|
33
|
+
say %Q[Run !txtblu!ruby "#{filename}"!txtrst! to render]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def filename
|
40
|
+
@filename ||= if args["RUBY_FILE"].end_with? '.rb'
|
41
|
+
args["RUBY_FILE"]
|
42
|
+
else
|
43
|
+
args['RUBY_FILE'] + ".rb"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def template
|
48
|
+
@template ||= args['--template'] || 'cli'
|
49
|
+
end
|
50
|
+
|
51
|
+
def template_content(name)
|
52
|
+
filename = File.join templates_path, "#{name}.rb"
|
53
|
+
|
54
|
+
unless available_templates.include? name
|
55
|
+
raise "Invalid template #{name}\nAvailable templates: #{available_templates.join ', '}"
|
56
|
+
end
|
57
|
+
|
58
|
+
File.read filename
|
59
|
+
end
|
60
|
+
|
61
|
+
def templates_path
|
62
|
+
@templates_path ||= File.expand_path "../templates/init", __dir__
|
63
|
+
end
|
64
|
+
|
65
|
+
def available_templates
|
66
|
+
['cli', 'dsl', 'standalone']
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'filewatcher'
|
2
|
+
|
3
|
+
module Victor
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
class Render < Base
|
7
|
+
summary "Render Ruby code to SVG"
|
8
|
+
|
9
|
+
usage "victor render RUBY_FILE [SVG_FILE] [options]"
|
10
|
+
usage "victor render (-h|--help)"
|
11
|
+
|
12
|
+
option '-t, --template TEMPLATE', "Set SVG template\n"+
|
13
|
+
"Can be: default, html, minimal, or a file path"
|
14
|
+
|
15
|
+
option '-w, --watch', 'Watch the source file and regenerate on change'
|
16
|
+
|
17
|
+
param "RUBY_FILE", "Input Ruby file"
|
18
|
+
param "SVG_FILE", "Output SVG file. Leave empty to write to stdout"
|
19
|
+
|
20
|
+
example "victor render input.rb output.svg"
|
21
|
+
example "victor render input.rb --template minimal"
|
22
|
+
|
23
|
+
def run
|
24
|
+
if args['--watch']
|
25
|
+
watch { generate }
|
26
|
+
else
|
27
|
+
generate
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def generate
|
34
|
+
code = File.read ruby_file
|
35
|
+
|
36
|
+
ruby_source = RubySource.new code, ruby_file
|
37
|
+
ruby_source.evaluate
|
38
|
+
ruby_source.template template if template
|
39
|
+
|
40
|
+
if svg_file
|
41
|
+
ruby_source.svg.save svg_file
|
42
|
+
say "Saved #{svg_file}"
|
43
|
+
else
|
44
|
+
puts ruby_source.svg.render
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def watch
|
49
|
+
say "Watching #{ruby_file} for changes"
|
50
|
+
file_watcher.watch do |file, event|
|
51
|
+
yield unless event == :deleted
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def file_watcher
|
56
|
+
@file_watcher ||= Filewatcher.new(ruby_file, immediate: true)
|
57
|
+
end
|
58
|
+
|
59
|
+
def ruby_file
|
60
|
+
args["RUBY_FILE"]
|
61
|
+
end
|
62
|
+
|
63
|
+
def svg_file
|
64
|
+
args["SVG_FILE"]
|
65
|
+
end
|
66
|
+
|
67
|
+
def template
|
68
|
+
args['--template']
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/victor/cli/parser.rb
CHANGED
@@ -15,7 +15,6 @@ module Victor
|
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
|
19
18
|
def parse_node(node)
|
20
19
|
case node
|
21
20
|
when Nokogiri::XML::Comment
|
@@ -28,18 +27,16 @@ module Victor
|
|
28
27
|
end
|
29
28
|
|
30
29
|
def parse_text(node)
|
31
|
-
|
32
|
-
|
33
|
-
return nil unless cleaned_text.length > 0
|
34
|
-
return ["_", {}, cleaned_text]
|
30
|
+
text_node = XMLText.new(node.text)
|
31
|
+
return text_node if text_node.text.length > 0
|
35
32
|
end
|
36
33
|
|
37
34
|
def parse_normal_node(node)
|
38
|
-
|
35
|
+
XMLNode.new(
|
39
36
|
node.name,
|
40
37
|
node_attrs(node),
|
41
38
|
node.children.map(&method(:parse_node)).compact,
|
42
|
-
|
39
|
+
)
|
43
40
|
end
|
44
41
|
|
45
42
|
def node_attrs(node)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Victor
|
2
|
+
module CLI
|
3
|
+
module Refinements
|
4
|
+
refine String do
|
5
|
+
def format_as_key
|
6
|
+
gsub('-', '_')
|
7
|
+
end
|
8
|
+
|
9
|
+
def format_as_value
|
10
|
+
if to_f.to_s == self or to_i.to_s == self
|
11
|
+
self
|
12
|
+
else
|
13
|
+
%Q["#{self}"]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,15 +1,20 @@
|
|
1
1
|
module Victor
|
2
2
|
module CLI
|
3
|
-
class
|
3
|
+
class RubySource
|
4
4
|
include Victor::DSL
|
5
|
-
attr_reader :code
|
5
|
+
attr_reader :code, :filename
|
6
6
|
|
7
|
-
def initialize(code)
|
7
|
+
def initialize(code, filename = nil)
|
8
8
|
@code = code
|
9
|
+
@filename = filename
|
9
10
|
end
|
10
11
|
|
11
12
|
def evaluate
|
12
|
-
|
13
|
+
if filename
|
14
|
+
instance_eval code, filename
|
15
|
+
else
|
16
|
+
instance_eval code
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
20
|
def template(template)
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require "rufo"
|
2
|
+
|
3
|
+
module Victor
|
4
|
+
module CLI
|
5
|
+
class SVGSource
|
6
|
+
using Refinements
|
7
|
+
attr_reader :svg_tree, :template
|
8
|
+
|
9
|
+
def initialize(svg_tree, template: nil)
|
10
|
+
@svg_tree = svg_tree
|
11
|
+
@svg_tree = Parser.new(@svg_tree).parse if @svg_tree.is_a? String
|
12
|
+
@template = template || :cli
|
13
|
+
end
|
14
|
+
|
15
|
+
def ruby_code
|
16
|
+
@ruby_code ||= Rufo::Formatter.format(code_for_node(svg_tree))
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def code_for_node(node)
|
22
|
+
return text_to_ruby node if node.is_a?(XMLText)
|
23
|
+
|
24
|
+
case node.type
|
25
|
+
when "svg"
|
26
|
+
root_to_ruby node
|
27
|
+
when "text", "tspan"
|
28
|
+
text_node_to_ruby node
|
29
|
+
else
|
30
|
+
node_to_ruby node
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def text_node_to_ruby(node)
|
35
|
+
children = node.children
|
36
|
+
if children.length == 1 && children.first.is_a?(XMLText)
|
37
|
+
short_text_to_ruby node
|
38
|
+
else
|
39
|
+
node_to_ruby node
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def short_text_to_ruby(node)
|
44
|
+
attrs = node.attributes.empty? ? "" : ",#{attrs_to_ruby(node.attributes)}"
|
45
|
+
inner_text = node.children.first.text
|
46
|
+
"text #{inner_text.inspect} #{attrs}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def node_to_ruby(node)
|
50
|
+
code = "#{node.type} #{attrs_to_ruby(node.attributes)} "
|
51
|
+
unless node.children.empty?
|
52
|
+
code << " do\n"
|
53
|
+
code << nodes_to_ruby(node.children)
|
54
|
+
code << "\nend\n"
|
55
|
+
end
|
56
|
+
code
|
57
|
+
end
|
58
|
+
|
59
|
+
def nodes_to_ruby(nodes)
|
60
|
+
nodes.map do |node|
|
61
|
+
code_for_node node
|
62
|
+
end.join "\n"
|
63
|
+
end
|
64
|
+
|
65
|
+
def text_to_ruby(node)
|
66
|
+
"_ #{node.text.inspect}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def attrs_to_ruby(attrs)
|
70
|
+
attrs.map do |key, value|
|
71
|
+
"#{key.format_as_key}: #{value.format_as_value}"
|
72
|
+
end.join ", "
|
73
|
+
end
|
74
|
+
|
75
|
+
def root_to_ruby(node)
|
76
|
+
values = {
|
77
|
+
attributes: attrs_to_ruby(node.attributes),
|
78
|
+
nodes: nodes_to_ruby(node.children),
|
79
|
+
}
|
80
|
+
|
81
|
+
template_content(template) % values
|
82
|
+
end
|
83
|
+
|
84
|
+
def template_content(name)
|
85
|
+
filename = File.join templates_path, "#{name}.rb"
|
86
|
+
|
87
|
+
unless File.exist? filename
|
88
|
+
raise "Template not found #{name}\nAvailable templates: #{available_templates.join ', '}"
|
89
|
+
end
|
90
|
+
|
91
|
+
File.read filename
|
92
|
+
end
|
93
|
+
|
94
|
+
def templates_path
|
95
|
+
@templates_path ||= File.expand_path "templates/import", __dir__
|
96
|
+
end
|
97
|
+
|
98
|
+
def available_templates
|
99
|
+
@available_templates ||= Dir["#{templates_path}/*.rb"].map do |path|
|
100
|
+
File.basename path, '.rb'
|
101
|
+
end.sort
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Render this by running:
|
2
|
+
# victor render "%{filename}"
|
3
|
+
|
4
|
+
setup viewBox: "0 0 100 100"
|
5
|
+
|
6
|
+
build do
|
7
|
+
circle cx: 50, cy: 50, r: 40, fill: 'yellow'
|
8
|
+
rect x: 10, y: 50, width: 80, height: 50, fill: 'yellow'
|
9
|
+
|
10
|
+
[25, 50].each do |y|
|
11
|
+
circle cx: y, cy: 40, r: 8, fill: 'white'
|
12
|
+
end
|
13
|
+
|
14
|
+
path d: "M11 100 l13 -15 l13 15 l13 -15 l13 15 l13 -15 l13 15 Z", fill: 'white'
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Render this by running
|
2
|
+
# ruby "%{filename}"
|
3
|
+
require 'victor/script'
|
4
|
+
|
5
|
+
setup viewBox: "0 0 100 100"
|
6
|
+
|
7
|
+
build do
|
8
|
+
circle cx: 50, cy: 50, r: 40, fill: 'yellow'
|
9
|
+
rect x: 10, y: 50, width: 80, height: 50, fill: 'yellow'
|
10
|
+
|
11
|
+
[25, 50].each do |y|
|
12
|
+
circle cx: y, cy: 40, r: 8, fill: 'white'
|
13
|
+
end
|
14
|
+
|
15
|
+
path d: "M11 100 l13 -15 l13 15 l13 -15 l13 15 l13 -15 l13 15 Z", fill: 'white'
|
16
|
+
end
|
17
|
+
|
18
|
+
puts render
|
19
|
+
save "%{basename}"
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Render this by running
|
2
|
+
# ruby "%{filename}"
|
3
|
+
require 'victor'
|
4
|
+
|
5
|
+
svg = Victor::SVG.new viewBox: "0 0 100 100"
|
6
|
+
|
7
|
+
svg.build do
|
8
|
+
circle cx: 50, cy: 50, r: 40, fill: 'yellow'
|
9
|
+
rect x: 10, y: 50, width: 80, height: 50, fill: 'yellow'
|
10
|
+
|
11
|
+
[25, 50].each do |y|
|
12
|
+
circle cx: y, cy: 40, r: 8, fill: 'white'
|
13
|
+
end
|
14
|
+
|
15
|
+
path d: "M11 100 l13 -15 l13 15 l13 -15 l13 15 l13 -15 l13 15 Z", fill: 'white'
|
16
|
+
end
|
17
|
+
|
18
|
+
puts svg.render
|
19
|
+
svg.save "%{basename}"
|
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.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
@@ -9,64 +9,64 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-05-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: filewatcher
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '1.1'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '1.1'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: nokogiri
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
34
|
+
version: '1.10'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
41
|
+
version: '1.10'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: pretty_trace
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: 0.2.5
|
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:
|
55
|
+
version: 0.2.5
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: requires
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
62
|
+
version: '0.2'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
69
|
+
version: '0.2'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rufo
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,19 +82,47 @@ dependencies:
|
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0.12'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
85
|
+
name: colsole
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
88
|
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: '0.
|
90
|
+
version: '0.7'
|
91
91
|
type: :runtime
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: '0.
|
97
|
+
version: '0.7'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: mister_bin
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0.7'
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0.7'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: victor
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0.3'
|
119
|
+
type: :runtime
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0.3'
|
98
126
|
description: CLI for Victor, the SVG Library
|
99
127
|
email: db@dannyben.com
|
100
128
|
executables:
|
@@ -105,17 +133,24 @@ files:
|
|
105
133
|
- README.md
|
106
134
|
- bin/victor
|
107
135
|
- lib/victor/cli.rb
|
108
|
-
- lib/victor/cli/code_generator.rb
|
109
136
|
- lib/victor/cli/command_line.rb
|
110
137
|
- lib/victor/cli/commands/base.rb
|
111
|
-
- lib/victor/cli/commands/
|
112
|
-
- lib/victor/cli/commands/
|
138
|
+
- lib/victor/cli/commands/convert.rb
|
139
|
+
- lib/victor/cli/commands/init.rb
|
140
|
+
- lib/victor/cli/commands/render.rb
|
113
141
|
- lib/victor/cli/parser.rb
|
114
|
-
- lib/victor/cli/
|
115
|
-
- lib/victor/cli/
|
116
|
-
- lib/victor/cli/
|
117
|
-
- lib/victor/cli/templates/
|
142
|
+
- lib/victor/cli/refinements/stirng_refinements.rb
|
143
|
+
- lib/victor/cli/ruby_source.rb
|
144
|
+
- lib/victor/cli/svg_source.rb
|
145
|
+
- lib/victor/cli/templates/import/cli.rb
|
146
|
+
- lib/victor/cli/templates/import/dsl.rb
|
147
|
+
- lib/victor/cli/templates/import/standalone.rb
|
148
|
+
- lib/victor/cli/templates/init/cli.rb
|
149
|
+
- lib/victor/cli/templates/init/dsl.rb
|
150
|
+
- lib/victor/cli/templates/init/standalone.rb
|
118
151
|
- lib/victor/cli/version.rb
|
152
|
+
- lib/victor/cli/xml_node.rb
|
153
|
+
- lib/victor/cli/xml_text.rb
|
119
154
|
homepage: https://github.com/dannyben/victor-cli
|
120
155
|
licenses:
|
121
156
|
- MIT
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require "rufo"
|
2
|
-
|
3
|
-
module Victor
|
4
|
-
module CLI
|
5
|
-
class CodeGenerator
|
6
|
-
attr_reader :svg_tree, :template
|
7
|
-
|
8
|
-
def initialize(svg_tree, template: nil)
|
9
|
-
@svg_tree = svg_tree
|
10
|
-
@template = template || :cli
|
11
|
-
end
|
12
|
-
|
13
|
-
def generate
|
14
|
-
Rufo::Formatter.format(code_for_node(svg_tree))
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def code_for_node(node)
|
20
|
-
case node.first
|
21
|
-
when "svg"
|
22
|
-
root_to_ruby node
|
23
|
-
else
|
24
|
-
node_to_ruby node
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def node_to_ruby(node)
|
29
|
-
name, attrs, children = node
|
30
|
-
code = "#{name} #{attrs_to_ruby(attrs)} "
|
31
|
-
unless children.empty?
|
32
|
-
code << " do\n"
|
33
|
-
code << nodes_to_ruby(children)
|
34
|
-
code << "\nend\n"
|
35
|
-
end
|
36
|
-
code
|
37
|
-
end
|
38
|
-
|
39
|
-
def nodes_to_ruby(nodes)
|
40
|
-
nodes.map(&method(:code_for_node)).join("\n")
|
41
|
-
end
|
42
|
-
|
43
|
-
def attrs_to_ruby(attrs)
|
44
|
-
attrs.reduce([]) do |acc, (k, v)|
|
45
|
-
acc << "#{k.to_sym.inspect[1..-1]}: #{v.inspect}"
|
46
|
-
acc
|
47
|
-
end.join(",")
|
48
|
-
end
|
49
|
-
|
50
|
-
def root_to_ruby(node)
|
51
|
-
_, attrs, children = node
|
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"
|
62
|
-
|
63
|
-
unless File.exist? filename
|
64
|
-
raise "Template not found #{name}\nAvailable templates: #{available_templates.join ', '}"
|
65
|
-
end
|
66
|
-
|
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
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
@@ -1,39 +0,0 @@
|
|
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
|