victor-cli 0.2.0 → 0.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9acf122e53e375434a1cad7cf0a5c1e93c7b804304f02e0907d0b95776739d4e
4
- data.tar.gz: 93bbaa1caa3ccc7747f291f60de666fefd90696ed69c48f055f6ef0136c11bce
3
+ metadata.gz: 82fc02c3ba2a1713203ac34aa76bd025ae9fb4cf04139c74b7e9dadb055d8005
4
+ data.tar.gz: 9204eb4ce2e142b989266e7079942f70d13f0051bdeee1618715ef8608eec8c0
5
5
  SHA512:
6
- metadata.gz: f8f6f15561beecff52a10e4ab4c02837a10ac2037a65ea62467bc1a27d78140917b0f6a0f59d597b41f746b42835e30a3613e45b395d891eaa1113efe241c45f
7
- data.tar.gz: de421ce4109502beaffc76f8a3df3b9d27e4f4a5117c411b1f9d417ecc85f01de61030c3623ee76d32e666f04401f94cf803eacd224e2cd80d64d8d0a073e9a9
6
+ metadata.gz: 5c01a4894fa0830e67d55ef0d90d4a67163765896993d52637d31a26f16eb15215c0ac40797be6bd65958f8a52a1019a343c95551f38a7d2abbf01a222b35963
7
+ data.tar.gz: 4430b1433977028919dcc33c67225746cf23f08f8ec5520af821dc7997adcaf3f3a793e19ec79fa289ff39b06457015207fde16f2fabe21cec8aec3bf83df991
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
- ### Convert SVG to Ruby
19
+ ### `init`: Create a sample Ruby file
20
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:
21
+ Run this command to create an initial sample file:
31
22
 
32
23
  ```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
-
24
+ $ victor init example
45
25
  ```
46
26
 
47
- ### Convert Ruby to SVG
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 to-svg example.rb --template minimal
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
@@ -4,6 +4,7 @@ require 'pretty_trace/enable-trim'
4
4
 
5
5
  include Colsole
6
6
  PrettyTrace.filter [/gem/, /lib/, /bin\/victor/]
7
+ PrettyTrace.debug_tip
7
8
 
8
9
  router = Victor::CLI::CommandLine.router
9
10
  exit router.run ARGV
@@ -1,7 +1,5 @@
1
1
  require 'mister_bin'
2
- require_relative 'commands/base'
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 'to-ruby', to: Commands::GenerateRuby
14
- router.route 'to-svg', to: Commands::GenerateSVG
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 GenerateRuby < Base
4
+ class Convert < Base
5
5
  summary "Convert SVG to Ruby code"
6
6
 
7
- usage "victor to-ruby SVG_FILE [RUBY_FILE --template NAME]"
8
- usage "victor to-ruby (-h|--help)"
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,16 @@ 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 to-ruby example.svg example.rb"
18
+ example "victor convert example.svg example.rb"
19
19
 
20
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']
21
+ svg_file = args["SVG_FILE"]
22
+ template = args['--template']
23
+ svg_node = SVGNode.load_file svg_file, layout: template
24
24
 
25
- code = generator.generate
25
+ validate_template template if template
26
+
27
+ code = svg_node.render
26
28
  ruby_file = args["RUBY_FILE"]
27
29
 
28
30
  if ruby_file
@@ -32,6 +34,13 @@ module Victor
32
34
  puts code
33
35
  end
34
36
  end
37
+
38
+ def validate_template(template)
39
+ allowed = %w[cli dsl standalone]
40
+ unless allowed.include? template
41
+ raise "Template not found #{template}\nAvailable templates: #{allowed.join ', '}"
42
+ end
43
+ end
35
44
  end
36
45
  end
37
46
  end
@@ -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
@@ -0,0 +1,27 @@
1
+ require "css_parser"
2
+
3
+ module Victor
4
+ module CLI
5
+ class CSSData
6
+ attr_reader :css_string
7
+
8
+ def initialize(css_string)
9
+ @css_string = css_string
10
+ end
11
+
12
+ def to_h
13
+ parser.load_string! css_string
14
+ parser.to_h['all']
15
+ end
16
+
17
+ private
18
+
19
+ def parser
20
+ @parser ||= CssParser::Parser.new
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+
27
+
@@ -0,0 +1,46 @@
1
+ module Victor
2
+ module CLI
3
+ module Rendering
4
+ refine Hash do
5
+ def render
6
+ # TODO: Reduce cognitive complexity
7
+ map do |key, value|
8
+ key = key.to_key if key.is_a? String
9
+
10
+ if key == "style"
11
+ value = "{ #{value.style_to_hash.render} }"
12
+ elsif value.is_a? String
13
+ value = value.to_value
14
+ end
15
+
16
+ "#{key}: #{value}"
17
+ end.join ", "
18
+ end
19
+
20
+ end
21
+
22
+ refine String do
23
+ def to_key
24
+ gsub('-', '_').to_sym.inspect[1..-1]
25
+ end
26
+
27
+ def to_value
28
+ if to_f.to_s == self or to_i.to_s == self
29
+ self
30
+ else
31
+ %Q["#{self}"]
32
+ end
33
+ end
34
+
35
+ # Transforms the valus of a style attribute to a hash
36
+ # Example: "color: black; top: 10" => { color: black, top: 10 }
37
+ def style_to_hash
38
+ parser = CssParser::Parser.new
39
+ parser.load_string! "victor { #{self} }"
40
+ parser.to_h["all"]["victor"]
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,15 +1,20 @@
1
1
  module Victor
2
2
  module CLI
3
- class RubyCode
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
- instance_eval code
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,141 @@
1
+ require 'nokogiri'
2
+ require 'erb'
3
+ require 'rufo'
4
+
5
+ module Victor
6
+ module CLI
7
+ class SVGNode
8
+ using Rendering
9
+ attr_reader :node, :layout
10
+
11
+ # Returns a new instance from an SVG file
12
+ def self.load_file(path, layout: nil)
13
+ load File.read(path), layout: layout
14
+ end
15
+
16
+ # Returns a new instance from raw SVG string
17
+ def self.load(svg_string, layout: nil)
18
+ doc = Nokogiri::XML svg_string
19
+ root = doc.children.last
20
+ new root, layout: layout
21
+ end
22
+
23
+ # Initializes with a Nokogiri XML node
24
+ def initialize(node, layout: nil)
25
+ @node = node
26
+ @layout = layout || :cli
27
+ end
28
+
29
+ # Returns formatted Ruby code
30
+ def render
31
+ Rufo::Formatter.format ruby_code
32
+ rescue Rufo::SyntaxError => e
33
+ raise ruby_code
34
+ end
35
+
36
+ def inspect
37
+ "#<#{self.class} name=#{name}, type=#{type}>"
38
+ end
39
+
40
+ # Returns the tag name
41
+ def name
42
+ node.name
43
+ end
44
+
45
+ # Returns one of our internal types (symbol)
46
+ def type
47
+ @type ||= type!
48
+ end
49
+
50
+ # Returns a hash of attributes
51
+ def attributes
52
+ @attributes ||= attributes!
53
+ end
54
+
55
+ # Returns the content (body) of the lement
56
+ def content
57
+ @content ||= content!
58
+ end
59
+
60
+ # Returns an array of children elements (SVGNode)
61
+ def children
62
+ @children ||= children!
63
+ end
64
+
65
+ # Returns the ruby code, unformatted
66
+ def ruby_code
67
+ erb erb_template
68
+ end
69
+
70
+ private
71
+
72
+ # Returns true if the element should be ignored
73
+ def rejected?
74
+ (node.text? and node.text.strip.empty?) or type == :junk
75
+ end
76
+
77
+ # Renders ERB code
78
+ def erb(code)
79
+ ERB.new(code, trim_mode: '%-').result(binding)
80
+ end
81
+
82
+ # Returns the content of the appropriate ERB tempalte, based on type
83
+ def erb_template
84
+ @erb_template ||= File.read(erb_template_file)
85
+ end
86
+
87
+ # Returns the path to the appropriate ERB template, based on type
88
+ def erb_template_file
89
+ file = type == :root ? "root_#{layout}" : type
90
+ path = File.expand_path "templates/nodes/#{file}.erb", __dir__
91
+ end
92
+
93
+ # Returns the internal element type
94
+ def type!
95
+ if node.text?
96
+ :text
97
+ elsif node.comment?
98
+ :junk
99
+ elsif node.name == 'style'
100
+ :css
101
+ elsif node.name == 'svg'
102
+ :root
103
+ else
104
+ :element
105
+ end
106
+ end
107
+
108
+ # Returns a filtered list of SVGNode children
109
+ def children!
110
+ node.children.map do |child|
111
+ SVGNode.new child
112
+ end.reject(&:rejected?)
113
+ end
114
+
115
+ # Returns a hash of attributes
116
+ def attributes!
117
+ node.attribute_nodes.map do |attr|
118
+ name = attr.name
119
+ value = attr.value
120
+ key = attr.respond_to?(:prefix) ? "#{attr.prefix}:#{name}" : name
121
+
122
+ [key, value]
123
+ end.to_h
124
+ end
125
+
126
+ def content!
127
+ if type == :css
128
+ CSSData.new(node.content).to_h
129
+ elsif node.content.is_a? String
130
+ node.content.strip
131
+ else
132
+ # TODO: do we need this?
133
+ # :nocov:
134
+ node.content
135
+ # :nocov:
136
+ end
137
+ end
138
+
139
+ end
140
+ end
141
+ 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 |x|
11
+ circle cx: x, 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 |x|
12
+ circle cx: x, 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 |x|
12
+ circle cx: x, 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}"
@@ -0,0 +1,7 @@
1
+ <%= "# :css" if ENV['DEBUG'] -%>
2
+ <%- content.each do |selector, declarations| %>
3
+ css[<%= selector.inspect %>] = {
4
+ <%- declarations.each do |key, value| -%>
5
+ <%= key.to_key %>: <%= value.to_value %>,
6
+ <%- end -%>}
7
+ <%- end -%>
@@ -0,0 +1,18 @@
1
+ <%= "# :element" if ENV['DEBUG'] -%>
2
+ <%- if children.any? -%>
3
+ <%- if children.count == 1 and children.first.node.text? -%>
4
+ <%- if attributes.any? -%>
5
+ <%= name %> "<%= content %>", <%= attributes.render %>
6
+ <%- else -%>
7
+ <%= name %> "<%= content %>"
8
+ <%- end -%>
9
+ <%- else -%>
10
+ <%= name %> <%= attributes.render %> do
11
+ <%- children.each do |child| -%>
12
+ <%= child.render %>
13
+ <%- end -%>
14
+ end
15
+ <%- end -%>
16
+ <%- else -%>
17
+ <%= name %> <%= attributes.render %>
18
+ <%- end -%>
@@ -0,0 +1,12 @@
1
+ <%= "# :root" if ENV['DEBUG'] -%>
2
+ # Render this template by running 'victor render FILE'
3
+
4
+ <%- if attributes.any? -%>
5
+ setup <%= attributes.render %>
6
+ <%- end -%>
7
+
8
+ build do
9
+ <%- children.each do |child| -%>
10
+ <%= child.render %>
11
+ <%- end -%>
12
+ end
@@ -0,0 +1,17 @@
1
+ <%= "# :root" if ENV['DEBUG'] -%>
2
+ # Render this template by running 'ruby FILE' or 'victor render FILE'
3
+
4
+ require 'victor/script'
5
+
6
+ <%- if attributes.any? -%>
7
+ setup <%= attributes.render %>
8
+ <%- end -%>
9
+
10
+ build do
11
+ <%- children.each do |child| -%>
12
+ <%= child.render %>
13
+ <%- end -%>
14
+ end
15
+
16
+ puts render
17
+ save 'output'
@@ -0,0 +1,14 @@
1
+ <%= "# :root" if ENV['DEBUG'] -%>
2
+ # Render this template by running 'ruby FILE' or 'victor render FILE'
3
+
4
+ require "victor"
5
+
6
+ svg = Victor::SVG.new <%= attributes.render %>
7
+
8
+ svg.build do
9
+ <%- children.each do |child| -%>
10
+ <%= child.render %>
11
+ <%- end -%>
12
+ end
13
+
14
+ svg.save "result"
@@ -0,0 +1,2 @@
1
+ <%= "# :text" if ENV['DEBUG'] -%>
2
+ _ "<%= content %>"
@@ -1,5 +1,5 @@
1
1
  module Victor
2
2
  module CLI
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.2"
4
4
  end
5
5
  end
data/lib/victor/cli.rb CHANGED
@@ -1,7 +1,12 @@
1
1
  require 'victor'
2
- require_relative 'cli/parser'
3
- require_relative 'cli/code_generator'
4
- require_relative 'cli/ruby_code'
2
+ require 'requires'
3
+ requires 'cli/refinements'
4
+ require_relative 'cli/ruby_source'
5
+ require_relative 'cli/css_data'
5
6
  require_relative 'cli/command_line'
7
+ require_relative 'cli/svg_node'
6
8
 
7
- require 'byebug' if ENV['BYEBUG']
9
+ if ENV['BYEBUG']
10
+ require 'byebug'
11
+ require 'lp'
12
+ end
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.2.0
4
+ version: 0.3.2
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-04-29 00:00:00.000000000 Z
12
+ date: 2022-06-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: mister_bin
15
+ name: filewatcher
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '0.7'
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: '0.7'
27
+ version: '1.1'
28
28
  - !ruby/object:Gem::Dependency
29
- name: colsole
29
+ name: nokogiri
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '0.7'
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: '0.7'
41
+ version: '1.10'
42
42
  - !ruby/object:Gem::Dependency
43
- name: victor
43
+ name: pretty_trace
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0.3'
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: '0.3'
55
+ version: 0.2.5
56
56
  - !ruby/object:Gem::Dependency
57
- name: nokogiri
57
+ name: requires
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '1.10'
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: '1.10'
69
+ version: '0.2'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rufo
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -82,19 +82,61 @@ dependencies:
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0.12'
84
84
  - !ruby/object:Gem::Dependency
85
- name: pretty_trace
85
+ name: colsole
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '0.2'
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.2'
97
+ version: '0.7'
98
+ - !ruby/object:Gem::Dependency
99
+ name: css_parser
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.7'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1.7'
112
+ - !ruby/object:Gem::Dependency
113
+ name: mister_bin
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '0.7'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '0.7'
126
+ - !ruby/object:Gem::Dependency
127
+ name: victor
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '0.3'
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '0.3'
98
140
  description: CLI for Victor, the SVG Library
99
141
  email: db@dannyben.com
100
142
  executables:
@@ -105,16 +147,24 @@ files:
105
147
  - README.md
106
148
  - bin/victor
107
149
  - lib/victor/cli.rb
108
- - lib/victor/cli/code_generator.rb
109
150
  - lib/victor/cli/command_line.rb
110
151
  - lib/victor/cli/commands/base.rb
111
- - lib/victor/cli/commands/generate_ruby.rb
112
- - lib/victor/cli/commands/generate_svg.rb
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
152
+ - lib/victor/cli/commands/convert.rb
153
+ - lib/victor/cli/commands/init.rb
154
+ - lib/victor/cli/commands/render.rb
155
+ - lib/victor/cli/css_data.rb
156
+ - lib/victor/cli/refinements/rendering.rb
157
+ - lib/victor/cli/ruby_source.rb
158
+ - lib/victor/cli/svg_node.rb
159
+ - lib/victor/cli/templates/init/cli.rb
160
+ - lib/victor/cli/templates/init/dsl.rb
161
+ - lib/victor/cli/templates/init/standalone.rb
162
+ - lib/victor/cli/templates/nodes/css.erb
163
+ - lib/victor/cli/templates/nodes/element.erb
164
+ - lib/victor/cli/templates/nodes/root_cli.erb
165
+ - lib/victor/cli/templates/nodes/root_dsl.erb
166
+ - lib/victor/cli/templates/nodes/root_standalone.erb
167
+ - lib/victor/cli/templates/nodes/text.erb
118
168
  - lib/victor/cli/version.rb
119
169
  homepage: https://github.com/dannyben/victor-cli
120
170
  licenses:
@@ -128,14 +178,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
128
178
  requirements:
129
179
  - - ">="
130
180
  - !ruby/object:Gem::Version
131
- version: 2.4.0
181
+ version: 2.7.0
132
182
  required_rubygems_version: !ruby/object:Gem::Requirement
133
183
  requirements:
134
184
  - - ">="
135
185
  - !ruby/object:Gem::Version
136
186
  version: '0'
137
187
  requirements: []
138
- rubygems_version: 3.0.3
188
+ rubygems_version: 3.3.14
139
189
  signing_key:
140
190
  specification_version: 4
141
191
  summary: CLI for Victor, the SVG Library
@@ -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
@@ -1,64 +0,0 @@
1
- require "nokogiri"
2
-
3
- module Victor
4
- module CLI
5
- class Parser
6
- attr_reader :raw_svg
7
-
8
- def initialize(raw_svg)
9
- @raw_svg = raw_svg
10
- end
11
-
12
- def parse
13
- parse_node svg_root
14
- end
15
-
16
- private
17
-
18
-
19
- def parse_node(node)
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
28
- end
29
-
30
- def parse_text(node)
31
- inner_text = node.text
32
- cleaned_text = inner_text.strip
33
- return nil unless cleaned_text.length > 0
34
- return ["_", {}, cleaned_text]
35
- end
36
-
37
- def parse_normal_node(node)
38
- [
39
- node.name,
40
- node_attrs(node),
41
- node.children.map(&method(:parse_node)).compact,
42
- ]
43
- end
44
-
45
- def node_attrs(node)
46
- node.attributes.values.reduce({}) do |acc, attr|
47
- name = attr.name
48
- value = attr.value
49
- key = attr.respond_to?(:prefix) ? "#{attr.prefix}:#{name}" : name
50
- acc[key] = value
51
- acc
52
- end
53
- end
54
-
55
- def xml_doc
56
- Nokogiri::XML raw_svg
57
- end
58
-
59
- def svg_root
60
- xml_doc.children.last
61
- end
62
- end
63
- end
64
- end
@@ -1,8 +0,0 @@
1
- # Render this template by running 'victor to-svg FILE'
2
-
3
- setup %{attributes}
4
-
5
- build do
6
- %{nodes}
7
- end
8
-
@@ -1,12 +0,0 @@
1
- # Render this template by running 'ruby FILE' or 'victor to-svg FILE'
2
-
3
- require 'victor/script'
4
-
5
- setup %{attributes}
6
-
7
- build do
8
- %{nodes}
9
- end
10
-
11
- puts render
12
- save 'output'
@@ -1,10 +0,0 @@
1
- # Render this template by running 'ruby FILE' or 'victor to-svg FILE'
2
-
3
- require "victor"
4
-
5
- svg = Victor::SVG.new %{attributes}
6
- svg.build do
7
- %{nodes}
8
- end
9
-
10
- svg.save "generated"