liquid-diagrams 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.
- checksums.yaml +4 -4
- data/README.md +15 -16
- data/features/diagrams/bitfield.feature +48 -0
- data/features/diagrams/blockdiag.feature +19 -0
- data/features/diagrams/erd.feature +19 -0
- data/features/diagrams/graphviz.feature +19 -0
- data/features/diagrams/mermaid.feature +20 -0
- data/features/diagrams/netlistsvg.feature +27 -0
- data/features/diagrams/nomnoml.feature +19 -0
- data/features/diagrams/plantuml.feature +17 -0
- data/features/diagrams/smcat.feature +23 -0
- data/features/diagrams/svgbob.feature +19 -0
- data/features/diagrams/syntrax.feature +20 -0
- data/features/diagrams/vega.feature +23 -0
- data/features/diagrams/vegalite.feature +23 -0
- data/features/diagrams/wavedrom.feature +24 -0
- data/features/step_definitions/diagrams.rb +21 -0
- data/features/support/env.rb +15 -0
- data/lib/liquid_diagrams.rb +9 -17
- data/lib/liquid_diagrams/basic_block.rb +12 -42
- data/lib/liquid_diagrams/basic_renderer.rb +43 -1
- data/lib/liquid_diagrams/blocks.rb +14 -0
- data/lib/liquid_diagrams/renderers.rb +10 -0
- data/lib/liquid_diagrams/renderers/bitfield_renderer.rb +9 -13
- data/lib/liquid_diagrams/renderers/blockdiag_renderer.rb +7 -15
- data/lib/liquid_diagrams/renderers/erd_renderer.rb +7 -15
- data/lib/liquid_diagrams/renderers/graphviz_renderer.rb +10 -10
- data/lib/liquid_diagrams/renderers/mermaid_renderer.rb +2 -9
- data/lib/liquid_diagrams/renderers/netlistsvg_renderer.rb +13 -0
- data/lib/liquid_diagrams/renderers/nomnoml_renderer.rb +0 -4
- data/lib/liquid_diagrams/renderers/plantuml_renderer.rb +5 -5
- data/lib/liquid_diagrams/renderers/smcat_renderer.rb +0 -10
- data/lib/liquid_diagrams/renderers/svgbob_renderer.rb +0 -10
- data/lib/liquid_diagrams/renderers/syntrax_renderer.rb +0 -10
- data/lib/liquid_diagrams/renderers/vega_renderer.rb +9 -23
- data/lib/liquid_diagrams/renderers/vegalite_renderer.rb +19 -0
- data/lib/liquid_diagrams/renderers/wavedrom_renderer.rb +1 -1
- data/lib/liquid_diagrams/rendering.rb +8 -6
- data/lib/liquid_diagrams/utils.rb +21 -14
- data/lib/liquid_diagrams/version.rb +1 -1
- data/spec/liquid_diagrams/basic_block_spec.rb +25 -62
- data/spec/liquid_diagrams/basic_renderer_spec.rb +27 -5
- data/spec/liquid_diagrams/blocks_spec.rb +0 -0
- data/spec/liquid_diagrams/renderers/bitfield_renderer_spec.rb +1 -19
- data/spec/liquid_diagrams/renderers/blockdiag_renderer_spec.rb +3 -31
- data/spec/liquid_diagrams/renderers/erd_renderer_spec.rb +3 -37
- data/spec/liquid_diagrams/renderers/graphviz_renderer_spec.rb +11 -21
- data/spec/liquid_diagrams/renderers/mermaid_renderer_spec.rb +3 -19
- data/spec/liquid_diagrams/renderers/netlistsvg_renderer_spec.rb +9 -0
- data/spec/liquid_diagrams/renderers/nomnoml_renderer_spec.rb +1 -7
- data/spec/liquid_diagrams/renderers/plantuml_renderer_spec.rb +4 -14
- data/spec/liquid_diagrams/renderers/smcat_renderer_spec.rb +1 -25
- data/spec/liquid_diagrams/renderers/svgbob_renderer_spec.rb +1 -23
- data/spec/liquid_diagrams/renderers/syntrax_renderer_spec.rb +1 -23
- data/spec/liquid_diagrams/renderers/vega_renderer_spec.rb +3 -21
- data/spec/liquid_diagrams/renderers/vegalite_renderer_spec.rb +15 -0
- data/spec/liquid_diagrams/renderers/wavedrom_renderer_spec.rb +3 -3
- data/spec/liquid_diagrams/utils_spec.rb +20 -8
- data/spec/liquid_diagrams_spec.rb +52 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/shared_examples.rb +8 -19
- data/vendor/{mermaid_puppeteer_config.json → puppeteer.json} +0 -0
- metadata +70 -19
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
|
5
|
+
require 'pry-byebug'
|
6
|
+
|
7
|
+
require 'liquid_diagrams'
|
8
|
+
|
9
|
+
LiquidDiagrams.register_diagrams(LiquidDiagrams.diagrams)
|
10
|
+
|
11
|
+
def render_liquid(content, options = {})
|
12
|
+
template = Liquid::Template.parse(content, liquid_diagrams: options)
|
13
|
+
|
14
|
+
template.render
|
15
|
+
end
|
data/lib/liquid_diagrams.rb
CHANGED
@@ -11,28 +11,20 @@ require_relative 'liquid_diagrams/rendering'
|
|
11
11
|
require_relative 'liquid_diagrams/basic_renderer'
|
12
12
|
require_relative 'liquid_diagrams/basic_block'
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
module Renderers
|
17
|
-
pattern = File.join(__dir__, 'liquid_diagrams/renderers/*_renderer.rb')
|
18
|
-
|
19
|
-
Dir[pattern].sort.each { |renderer| require renderer }
|
20
|
-
end
|
14
|
+
require_relative 'liquid_diagrams/renderers'
|
15
|
+
require_relative 'liquid_diagrams/blocks'
|
21
16
|
|
22
|
-
|
23
|
-
|
24
|
-
Renderers.constants.grep(/Renderer$/).each do |renderer|
|
25
|
-
block_name = "#{renderer.to_s.chomp('Renderer')}Block"
|
17
|
+
module LiquidDiagrams
|
18
|
+
OPTIONS_KEY = :liquid_diagrams
|
26
19
|
|
27
|
-
|
20
|
+
class << self
|
21
|
+
# Return configuration of diagram
|
22
|
+
def configuration(options, key: nil, default: {})
|
23
|
+
config = options[OPTIONS_KEY.to_sym] || options[OPTIONS_KEY.to_s] || {}
|
28
24
|
|
29
|
-
|
25
|
+
key ? (config.dig(key.to_sym) || config.dig(key.to_s) || default) : config
|
30
26
|
end
|
31
|
-
end
|
32
27
|
|
33
|
-
OPTIONS_KEY = :liquid_diagrams
|
34
|
-
|
35
|
-
class << self
|
36
28
|
# Return all diagrams defined in {Renderers}
|
37
29
|
#
|
38
30
|
# @return [Array<Symbol>]
|
@@ -1,70 +1,40 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module LiquidDiagrams
|
4
|
-
# @abstract Subclass and override {#
|
5
|
-
# {#render_without_rescue} to implement
|
4
|
+
# @abstract Subclass and override {#render_content} to implement
|
6
5
|
class BasicBlock < ::Liquid::Block
|
7
6
|
# Return the renderer class matching the block
|
8
|
-
#
|
9
|
-
# @return [BasicRenderer]
|
10
|
-
#
|
11
|
-
# @raise [NameError] if renderer class not found
|
12
7
|
def self.renderer
|
13
8
|
@renderer ||= Renderers.const_get(
|
14
9
|
name.split('::').last.gsub(/Block$/, 'Renderer')
|
15
10
|
)
|
16
11
|
end
|
17
12
|
|
18
|
-
# @note Do not
|
19
|
-
# {#render_without_recue} instead
|
13
|
+
# @note Do not override this method, override {#render_content} instead
|
20
14
|
def render(context)
|
21
|
-
@content = super.to_s
|
22
15
|
@context = context
|
16
|
+
@content = super.to_s
|
17
|
+
@config = read_config
|
23
18
|
|
24
|
-
|
19
|
+
render_content
|
25
20
|
end
|
26
21
|
|
27
|
-
|
28
|
-
|
29
|
-
# @return [String]
|
30
|
-
def render_with_rescue
|
31
|
-
render_without_rescue
|
22
|
+
def render_content
|
23
|
+
self.class.renderer.render(@content, @config)
|
32
24
|
rescue Errors::BasicError => error
|
33
25
|
handle_error(error)
|
34
26
|
end
|
35
27
|
|
36
|
-
# Render diagram without error rescued
|
37
|
-
#
|
38
|
-
# @return [String]
|
39
|
-
#
|
40
|
-
# @raise [NameError] @see {.renderer}
|
41
|
-
# @raise [Errors::BasicError] if rendering failed
|
42
|
-
def render_without_rescue
|
43
|
-
self.class.renderer.render(@content, config)
|
44
|
-
end
|
45
|
-
|
46
|
-
# Default error handler
|
47
28
|
def handle_error(error)
|
48
29
|
error
|
49
30
|
end
|
50
31
|
|
51
|
-
#
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
template_options.merge(inline_options)
|
56
|
-
end
|
57
|
-
|
58
|
-
# Read block options from parse context
|
59
|
-
def template_options
|
60
|
-
opts = parse_context[OPTIONS_KEY] || parse_context[OPTIONS_KEY.to_s] || {}
|
61
|
-
|
62
|
-
opts.fetch(block_name.to_sym) { opts.fetch(block_name, {}) }
|
63
|
-
end
|
32
|
+
# @api private
|
33
|
+
def read_config
|
34
|
+
options = LiquidDiagrams.configuration(parse_context, key: block_name)
|
35
|
+
inline_options = Utils.parse_inline_options(@markup.strip)
|
64
36
|
|
65
|
-
|
66
|
-
def inline_options
|
67
|
-
Utils.parse_inline_options(@markup.strip)
|
37
|
+
options.merge(inline_options)
|
68
38
|
end
|
69
39
|
end
|
70
40
|
end
|
@@ -1,8 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module LiquidDiagrams
|
4
|
-
# @abstract Subclass and override {#render} to implement
|
4
|
+
# @abstract Subclass and override {#render} to implement.
|
5
5
|
class BasicRenderer
|
6
|
+
include Rendering
|
7
|
+
|
8
|
+
# Configuration key for argument with boolean value.
|
9
|
+
FLAGS = [].freeze
|
10
|
+
|
11
|
+
# Prefix for {FLAGS}
|
12
|
+
FLAGS_PREFIX = '--'
|
13
|
+
|
14
|
+
# Configuration key for argument with key-value pairs.
|
15
|
+
OPTIONS = [].freeze
|
16
|
+
|
17
|
+
# Separator for key and value of {OPTIONS}.
|
18
|
+
OPTIONS_SEPARATOR = ' '
|
19
|
+
|
20
|
+
# Prefix for {OPTIONS}
|
21
|
+
OPTIONS_PREFIX = '--'
|
22
|
+
|
6
23
|
def self.render(content, options = {})
|
7
24
|
new(content, options).render
|
8
25
|
end
|
@@ -12,8 +29,33 @@ module LiquidDiagrams
|
|
12
29
|
@config = options
|
13
30
|
end
|
14
31
|
|
32
|
+
# Default render method with {Errors::NotImplementedError} raised
|
33
|
+
#
|
34
|
+
# @important You should overrite this method in your own renderer class
|
15
35
|
def render
|
16
36
|
raise Errors::NotImplementedError
|
17
37
|
end
|
38
|
+
|
39
|
+
def build_command
|
40
|
+
"#{executable} #{arguments}".strip
|
41
|
+
end
|
42
|
+
|
43
|
+
def executable
|
44
|
+
self.class.name.split('::').last.sub(/Renderer$/, '').downcase
|
45
|
+
end
|
46
|
+
|
47
|
+
def arguments
|
48
|
+
flags = Utils.build_flags(
|
49
|
+
@config, self.class.const_get(:FLAGS),
|
50
|
+
prefix: self.class.const_get(:FLAGS_PREFIX)
|
51
|
+
)
|
52
|
+
options = Utils.build_options(
|
53
|
+
@config, self.class.const_get(:OPTIONS),
|
54
|
+
prefix: self.class.const_get(:OPTIONS_PREFIX),
|
55
|
+
sep: self.class.const_get(:OPTIONS_SEPARATOR)
|
56
|
+
)
|
57
|
+
|
58
|
+
"#{flags} #{options}".strip
|
59
|
+
end
|
18
60
|
end
|
19
61
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LiquidDiagrams
|
4
|
+
# @note All blocks are automaticly define under this module if not defined
|
5
|
+
module Blocks
|
6
|
+
Renderers.constants.grep(/Renderer$/).each do |renderer|
|
7
|
+
block_name = "#{renderer.to_s.chomp('Renderer')}Block"
|
8
|
+
|
9
|
+
next if Blocks.const_defined?(block_name)
|
10
|
+
|
11
|
+
Blocks.const_set(block_name, Class.new(BasicBlock))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LiquidDiagrams
|
4
|
+
# @note All renderers should be defined under this module
|
5
|
+
module Renderers
|
6
|
+
pattern = File.join(__dir__, 'renderers/*_renderer.rb')
|
7
|
+
|
8
|
+
Dir[pattern].sort.each { |renderer| require renderer }
|
9
|
+
end
|
10
|
+
end
|
@@ -3,11 +3,17 @@
|
|
3
3
|
module LiquidDiagrams
|
4
4
|
module Renderers
|
5
5
|
class BitfieldRenderer < BasicRenderer
|
6
|
+
FLAGS = %w[
|
7
|
+
compact
|
8
|
+
hflip
|
9
|
+
vflip
|
10
|
+
].freeze
|
11
|
+
|
6
12
|
OPTIONS = %w[
|
7
|
-
vspace
|
8
|
-
hspace
|
9
|
-
lanes
|
10
13
|
bits
|
14
|
+
lanes
|
15
|
+
hspace
|
16
|
+
vspace
|
11
17
|
fontsize
|
12
18
|
fontfamily
|
13
19
|
fontweight
|
@@ -18,16 +24,6 @@ module LiquidDiagrams
|
|
18
24
|
"--input #{input} > #{output}"
|
19
25
|
end
|
20
26
|
end
|
21
|
-
|
22
|
-
def build_command
|
23
|
-
command = +'bitfield'
|
24
|
-
|
25
|
-
@config.slice(*OPTIONS).each do |opt, value|
|
26
|
-
command << " --#{opt} #{value}"
|
27
|
-
end
|
28
|
-
|
29
|
-
command
|
30
|
-
end
|
31
27
|
end
|
32
28
|
end
|
33
29
|
end
|
@@ -4,6 +4,10 @@ module LiquidDiagrams
|
|
4
4
|
module Renderers
|
5
5
|
%i[Blockdiag Seqdiag Actdiag Nwdiag Rackdiag Packetdiag].each do |diagram|
|
6
6
|
renderer = Class.new(BasicRenderer) do
|
7
|
+
const_set :FLAGS, %w[
|
8
|
+
antialias
|
9
|
+
].freeze
|
10
|
+
|
7
11
|
const_set :OPTIONS, %w[
|
8
12
|
config
|
9
13
|
font
|
@@ -11,9 +15,7 @@ module LiquidDiagrams
|
|
11
15
|
size
|
12
16
|
].freeze
|
13
17
|
|
14
|
-
const_set :
|
15
|
-
'antialias' => false
|
16
|
-
}.freeze
|
18
|
+
const_set :OPTIONS_SEPARATOR, '='
|
17
19
|
|
18
20
|
def render
|
19
21
|
Rendering.render_with_tempfile(build_command, @content) do |input, output|
|
@@ -21,18 +23,8 @@ module LiquidDiagrams
|
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
|
-
define_method :
|
25
|
-
|
26
|
-
|
27
|
-
@config.slice(*self.class.const_get(:OPTIONS)).each do |opt, value|
|
28
|
-
command << " --#{opt}=#{value}"
|
29
|
-
end
|
30
|
-
|
31
|
-
Utils.merge(self.class.const_get(:SWITCHES), @config).each do |swc, value|
|
32
|
-
command << " --#{swc}" if value
|
33
|
-
end
|
34
|
-
|
35
|
-
command
|
26
|
+
define_method :executable do
|
27
|
+
"#{diagram.downcase} -Tsvg --nodoctype"
|
36
28
|
end
|
37
29
|
end
|
38
30
|
|
@@ -3,14 +3,16 @@
|
|
3
3
|
module LiquidDiagrams
|
4
4
|
module Renderers
|
5
5
|
class ErdRenderer < BasicRenderer
|
6
|
+
FLAGS = %w[
|
7
|
+
dot-entity
|
8
|
+
].freeze
|
9
|
+
|
6
10
|
OPTIONS = %w[
|
7
11
|
config
|
8
12
|
edge
|
9
13
|
].freeze
|
10
14
|
|
11
|
-
|
12
|
-
'dot-entity' => false
|
13
|
-
}.freeze
|
15
|
+
OPTIONS_SEPARATOR = '='
|
14
16
|
|
15
17
|
XML_REGEX = /^<\?xml(([^>]|\n)*>\n?){2}/.freeze
|
16
18
|
|
@@ -18,18 +20,8 @@ module LiquidDiagrams
|
|
18
20
|
Rendering.render_with_stdin_stdout(build_command, @content).sub(XML_REGEX, '')
|
19
21
|
end
|
20
22
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
24
|
-
@config.slice(*OPTIONS).each do |opt, value|
|
25
|
-
command << " --#{opt}=#{value}"
|
26
|
-
end
|
27
|
-
|
28
|
-
Utils.merge(SWITCHES, @config).each do |switch, value|
|
29
|
-
command << " --#{switch}" if value
|
30
|
-
end
|
31
|
-
|
32
|
-
command
|
23
|
+
def executable
|
24
|
+
'erd --fmt=svg'
|
33
25
|
end
|
34
26
|
end
|
35
27
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module LiquidDiagrams
|
4
4
|
module Renderers
|
5
5
|
class GraphvizRenderer < BasicRenderer
|
6
|
-
|
6
|
+
CONFIG_MAPPERS = {
|
7
7
|
'layout' => 'K',
|
8
8
|
'graph_attributes' => 'G',
|
9
9
|
'node_attributes' => 'N',
|
@@ -13,20 +13,20 @@ module LiquidDiagrams
|
|
13
13
|
XML_REGEX = /^<\?xml(([^>]|\n)*>\n?){2}/.freeze
|
14
14
|
|
15
15
|
def render
|
16
|
-
|
17
|
-
|
16
|
+
Rendering.render_with_stdin_stdout(build_command, @content)
|
17
|
+
.encode('utf-8').sub(XML_REGEX, '')
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
|
20
|
+
def executable
|
21
|
+
'dot -Tsvg'
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
24
|
+
def arguments
|
25
|
+
@config.slice(*CONFIG_MAPPERS.keys).map do |opt, attrs|
|
26
|
+
Utils.join(attrs, with: " -#{CONFIG_MAPPERS[opt]}") do |attr|
|
25
27
|
Array(attr).join('=')
|
26
28
|
end
|
27
|
-
end
|
28
|
-
|
29
|
-
command
|
29
|
+
end.join(' ')
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -19,15 +19,8 @@ module LiquidDiagrams
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
|
24
|
-
command << Utils.vendor_path('mermaid_puppeteer_config.json')
|
25
|
-
|
26
|
-
@config.slice(*OPTIONS).each do |opt, value|
|
27
|
-
command << " --#{opt} #{value}"
|
28
|
-
end
|
29
|
-
|
30
|
-
command
|
22
|
+
def executable
|
23
|
+
"mmdc --puppeteerConfigFile #{Utils.vendor_path('puppeteer.json')}"
|
31
24
|
end
|
32
25
|
end
|
33
26
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LiquidDiagrams
|
4
|
+
module Renderers
|
5
|
+
class NetlistsvgRenderer < BasicRenderer
|
6
|
+
def render
|
7
|
+
Rendering.render_with_tempfile(build_command, @content) do |input, output|
|
8
|
+
"#{input} -o #{output}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -6,14 +6,14 @@ module LiquidDiagrams
|
|
6
6
|
XML_REGEX = /^<\?xml([^>]|\n)*>\n?/.freeze
|
7
7
|
|
8
8
|
def render
|
9
|
-
Rendering.render_with_stdin_stdout(build_command, @content)
|
9
|
+
Rendering.render_with_stdin_stdout(build_command, @content)
|
10
|
+
.sub(XML_REGEX, '')
|
10
11
|
end
|
11
12
|
|
12
|
-
def
|
13
|
-
|
13
|
+
def executable
|
14
|
+
jar_path = Utils.vendor_path('plantuml.1.2020.1.jar')
|
14
15
|
|
15
|
-
|
16
|
-
options << ' -tsvg -pipe'
|
16
|
+
"#{Utils.run_jar(jar_path)} -tsvg -pipe"
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|