jekyll-diagrams 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +83 -0
- data/.gitignore +4 -5
- data/.rubocop.yml +22 -0
- data/.simplecov +5 -0
- data/.travis.yml +48 -1
- data/Dockerfile +14 -12
- data/Gemfile +4 -1
- data/README.md +49 -21
- data/Rakefile +20 -2
- data/features/blockdiag.feature +20 -0
- data/features/graphviz.feature +22 -0
- data/features/mermaid.feature +21 -0
- data/features/nomnoml.feature +36 -0
- data/features/plantuml.feature +24 -0
- data/features/smcat.feature +29 -0
- data/features/step_definitions/jekyll-diagrams.rb +25 -0
- data/features/support/env.rb +33 -0
- data/features/svgbob.feature +22 -0
- data/features/syntrax.feature +22 -0
- data/features/vega.feature +32 -0
- data/features/wavedrom.feature +22 -0
- data/jekyll-diagrams.gemspec +13 -7
- data/lib/jekyll-diagrams.rb +3 -2
- data/lib/jekyll-diagrams/block.rb +5 -4
- data/lib/jekyll-diagrams/blockdiag.rb +9 -7
- data/lib/jekyll-diagrams/erd.rb +9 -6
- data/lib/jekyll-diagrams/graphviz.rb +12 -17
- data/lib/jekyll-diagrams/mermaid.rb +21 -18
- data/lib/jekyll-diagrams/nomnoml.rb +6 -4
- data/lib/jekyll-diagrams/plantuml.rb +8 -4
- data/lib/jekyll-diagrams/smcat.rb +10 -7
- data/lib/jekyll-diagrams/svgbob.rb +6 -4
- data/lib/jekyll-diagrams/syntrax.rb +8 -6
- data/lib/jekyll-diagrams/util.rb +78 -11
- data/lib/jekyll-diagrams/vega.rb +8 -5
- data/lib/jekyll-diagrams/version.rb +4 -2
- data/lib/jekyll-diagrams/wavedrom.rb +6 -4
- data/test/erd_test.rb +22 -0
- data/test/test_helper.rb +4 -7
- data/test/util_test.rb +20 -0
- metadata +54 -11
- data/lib/jekyll-diagrams/renderer.rb +0 -53
@@ -1,29 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
module Diagrams
|
5
|
+
class MermaidBlock < Block
|
6
|
+
CONFIGURATIONS = %w[backgroundColor height theme width].freeze
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
def render_svg(code, config)
|
9
|
+
command = build_command(config)
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
end
|
11
|
+
render_with_tempfile(command, code) do |input, output|
|
12
|
+
"--input #{input} --output #{output}"
|
12
13
|
end
|
14
|
+
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
CONFIGURATIONS.each do |conf|
|
20
|
-
command << " --#{conf} #{config[conf]}" if config.has_key?(conf)
|
21
|
-
end
|
16
|
+
def build_command(config)
|
17
|
+
command = +'mmdc'
|
18
|
+
command << ' --puppeteerConfigFile '
|
19
|
+
command << vendor_path('mermaid_puppeteer_config.json')
|
20
|
+
command << ' --transparent' if config.fetch('transparent', false) != false
|
22
21
|
|
23
|
-
|
22
|
+
CONFIGURATIONS.each do |conf|
|
23
|
+
command << " --#{conf} #{config[conf]}" if config.key?(conf)
|
24
24
|
end
|
25
|
+
|
26
|
+
command
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
30
|
+
end
|
28
31
|
|
29
|
-
|
32
|
+
Liquid::Template.register_tag(:mermaid, Jekyll::Diagrams::MermaidBlock)
|
@@ -1,19 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class NomnomlBlock < Block
|
4
6
|
def render_svg(code, config)
|
5
7
|
command = build_command(config)
|
6
8
|
|
7
|
-
render_with_tempfile(command, code, stdout: true) do |
|
8
|
-
|
9
|
+
render_with_tempfile(command, code, stdout: true) do |input|
|
10
|
+
input
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
|
-
def build_command(
|
14
|
+
def build_command(_config)
|
13
15
|
'nomnoml'
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
|
-
Liquid::Template.register_tag(:nomnoml, Jekyll::Diagrams::NomnomlBlock)
|
21
|
+
Liquid::Template.register_tag(:nomnoml, Jekyll::Diagrams::NomnomlBlock)
|
@@ -1,15 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class PlantUMLBlock < Block
|
6
|
+
XML_REGEX = /^<\?xml([^>]|\n)*>\n?/.freeze
|
7
|
+
|
4
8
|
def render_svg(code, config)
|
5
9
|
command = build_command(config)
|
6
10
|
|
7
11
|
svg = render_with_stdin_stdout(command, code)
|
8
|
-
svg.sub!(
|
12
|
+
svg.sub!(XML_REGEX, '')
|
9
13
|
end
|
10
14
|
|
11
|
-
def build_command(
|
12
|
-
options = 'java'
|
15
|
+
def build_command(_config)
|
16
|
+
options = +'java'
|
13
17
|
options << ' -Djava.awt.headless=true'
|
14
18
|
options << ' -jar '
|
15
19
|
options << vendor_path('plantuml.1.2020.1.jar')
|
@@ -19,4 +23,4 @@ module Jekyll
|
|
19
23
|
end
|
20
24
|
end
|
21
25
|
|
22
|
-
Liquid::Template.register_tag(:plantuml, Jekyll::Diagrams::PlantUMLBlock)
|
26
|
+
Liquid::Template.register_tag(:plantuml, Jekyll::Diagrams::PlantUMLBlock)
|
@@ -1,23 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class SMCatBlock < Block
|
4
|
-
|
6
|
+
XML_REGEX = /^<\?xml(([^>]|\n)*>\n?){2}/.freeze
|
7
|
+
CONFIGURATIONS = %w[direction engine input-type].freeze
|
5
8
|
|
6
9
|
def render_svg(code, config)
|
7
10
|
command = build_command(config)
|
8
11
|
|
9
|
-
svg = render_with_tempfile(command, code, stdout: true) do |
|
10
|
-
"#{
|
12
|
+
svg = render_with_tempfile(command, code, stdout: true) do |input|
|
13
|
+
"#{input} --output-to -"
|
11
14
|
end
|
12
15
|
|
13
|
-
svg.sub!(
|
16
|
+
svg.sub!(XML_REGEX, '')
|
14
17
|
end
|
15
18
|
|
16
19
|
def build_command(config)
|
17
|
-
command = 'smcat'
|
20
|
+
command = +'smcat'
|
18
21
|
|
19
22
|
CONFIGURATIONS.each do |conf|
|
20
|
-
command << " --#{conf} #{config[conf]}" if config.
|
23
|
+
command << " --#{conf} #{config[conf]}" if config.key?(conf)
|
21
24
|
end
|
22
25
|
|
23
26
|
command
|
@@ -26,4 +29,4 @@ module Jekyll
|
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
29
|
-
Liquid::Template.register_tag(:smcat, Jekyll::Diagrams::SMCatBlock)
|
32
|
+
Liquid::Template.register_tag(:smcat, Jekyll::Diagrams::SMCatBlock)
|
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class SvgbobBlock < Block
|
4
|
-
CONFIGURATIONS = %w
|
6
|
+
CONFIGURATIONS = %w[font-family font-size scale stroke-width].freeze
|
5
7
|
|
6
8
|
def render_svg(code, config)
|
7
9
|
command = build_command(config)
|
@@ -10,10 +12,10 @@ module Jekyll
|
|
10
12
|
end
|
11
13
|
|
12
14
|
def build_command(config)
|
13
|
-
command = 'svgbob'
|
15
|
+
command = +'svgbob'
|
14
16
|
|
15
17
|
CONFIGURATIONS.each do |conf|
|
16
|
-
command << " --#{conf} #{config[conf]}" if config.
|
18
|
+
command << " --#{conf} #{config[conf]}" if config.key?(conf)
|
17
19
|
end
|
18
20
|
|
19
21
|
command
|
@@ -22,4 +24,4 @@ module Jekyll
|
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
25
|
-
Liquid::Template.register_tag(:svgbob, Jekyll::Diagrams::SvgbobBlock)
|
27
|
+
Liquid::Template.register_tag(:svgbob, Jekyll::Diagrams::SvgbobBlock)
|
@@ -1,21 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class SyntraxBlock < Block
|
4
|
-
CONFIGURATIONS = %w
|
6
|
+
CONFIGURATIONS = %w[scale style].freeze
|
5
7
|
|
6
8
|
def render_svg(code, config)
|
7
9
|
command = build_command(config)
|
8
10
|
|
9
|
-
render_with_tempfile(command, code) do |
|
10
|
-
"
|
11
|
+
render_with_tempfile(command, code) do |input, output|
|
12
|
+
"--input #{input} --output #{output}"
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
14
16
|
def build_command(config)
|
15
|
-
command = 'syntrax'
|
17
|
+
command = +'syntrax'
|
16
18
|
|
17
19
|
CONFIGURATIONS.each do |conf|
|
18
|
-
command << " --#{conf} #{config[conf]}" if config.
|
20
|
+
command << " --#{conf} #{config[conf]}" if config.key?(conf)
|
19
21
|
end
|
20
22
|
|
21
23
|
command
|
@@ -24,4 +26,4 @@ module Jekyll
|
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
27
|
-
Liquid::Template.register_tag(:syntrax, Jekyll::Diagrams::SyntraxBlock)
|
29
|
+
Liquid::Template.register_tag(:syntrax, Jekyll::Diagrams::SyntraxBlock)
|
data/lib/jekyll-diagrams/util.rb
CHANGED
@@ -1,28 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'open3'
|
4
|
+
require 'tempfile'
|
5
|
+
|
1
6
|
module Jekyll
|
2
7
|
module Diagrams
|
3
8
|
module Util
|
4
|
-
|
9
|
+
module_function
|
5
10
|
|
6
11
|
def diagrams_config(context)
|
7
|
-
site_config = context.registers[:site].config
|
8
|
-
|
9
|
-
old_config = site_config.fetch('diagrams', {})
|
10
|
-
|
11
|
-
return new_config if old_config.empty?
|
12
|
+
site_config = context.registers[:site].config.fetch(config_name, {})
|
13
|
+
page_config = context.registers[:page].fetch(config_name, {})
|
12
14
|
|
13
|
-
|
14
|
-
Jekyll.warn " Rename it to `jekyll-diagram` instead."
|
15
|
-
|
16
|
-
old_config.merge(new_config)
|
15
|
+
site_config.merge(page_config)
|
17
16
|
end
|
18
17
|
|
19
18
|
def config_for(context, name)
|
20
19
|
diagrams_config(context).fetch(name, {})
|
21
20
|
end
|
22
21
|
|
22
|
+
def config_name
|
23
|
+
'jekyll-diagrams'
|
24
|
+
end
|
25
|
+
|
23
26
|
def vendor_path(file = '')
|
24
27
|
File.join(File.expand_path('../../vendor', __dir__), file)
|
25
28
|
end
|
29
|
+
|
30
|
+
def normalized_attrs(attrs, prefix:, sep: '=')
|
31
|
+
attrs = case attrs
|
32
|
+
when String
|
33
|
+
attrs
|
34
|
+
when Array
|
35
|
+
attrs.join(prefix)
|
36
|
+
when Hash
|
37
|
+
attrs.map { |k, v| "#{k}#{sep}#{v}" }.join(prefix)
|
38
|
+
end
|
39
|
+
|
40
|
+
"#{prefix}#{attrs}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def render_with_stdin_stdout(command, content)
|
44
|
+
render_with_stdin(command, content, stdout: true)
|
45
|
+
end
|
46
|
+
|
47
|
+
def render_with_stdin(command, content, stdout: false, &block)
|
48
|
+
if stdout == true
|
49
|
+
render_with_command(command, :stdout, stdin_data: content)
|
50
|
+
else
|
51
|
+
output = Tempfile.open(['jekyll_diagrams_output', '.svg'])
|
52
|
+
output.close
|
53
|
+
extra = block.call(ouput.path)
|
54
|
+
command = "#{command} #{extra}"
|
55
|
+
|
56
|
+
render_with_command(command, output.path, stdin_data: content)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def render_with_tempfile(command, content, stdout: false, &block)
|
61
|
+
Tempfile.open('jekyll_diagrams_input') do |input|
|
62
|
+
File.write(input.path, content)
|
63
|
+
|
64
|
+
if stdout == true
|
65
|
+
extra = block.call(input.path)
|
66
|
+
command = "#{command} #{extra}"
|
67
|
+
|
68
|
+
render_with_command(command, :stdout)
|
69
|
+
else
|
70
|
+
output = Tempfile.open(['jekyll_diagrams_output', '.svg'])
|
71
|
+
output.close
|
72
|
+
extra = block.call(input.path, output.path)
|
73
|
+
command = "#{command} #{extra}"
|
74
|
+
|
75
|
+
render_with_command(command, output.path)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def render_with_command(command, output, options = {})
|
81
|
+
stdout, stderr, status = Open3.capture3(command, options)
|
82
|
+
|
83
|
+
unless status.success?
|
84
|
+
raise <<~MESSAGE
|
85
|
+
Failed to render command: #{command}
|
86
|
+
#{stdout}
|
87
|
+
#{stderr}
|
88
|
+
MESSAGE
|
89
|
+
end
|
90
|
+
|
91
|
+
output == :stdout ? stdout : File.read(output)
|
92
|
+
end
|
26
93
|
end
|
27
94
|
end
|
28
|
-
end
|
95
|
+
end
|
data/lib/jekyll-diagrams/vega.rb
CHANGED
@@ -1,20 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class VegaBlock < Block
|
4
|
-
CONFIGURATIONS = %w
|
6
|
+
CONFIGURATIONS = %w[scale].freeze
|
5
7
|
|
6
8
|
def render_svg(code, config)
|
7
9
|
code = render_with_stdin_stdout('vl2vg', code) if block_name == 'vegalite'
|
10
|
+
|
8
11
|
command = build_command(config)
|
9
12
|
|
10
13
|
render_with_stdin_stdout(command, code)
|
11
14
|
end
|
12
15
|
|
13
16
|
def build_command(config)
|
14
|
-
command = 'vg2svg'
|
17
|
+
command = +'vg2svg'
|
15
18
|
|
16
19
|
CONFIGURATIONS.each do |conf|
|
17
|
-
command << " --#{conf} #{config[conf]}" if config.
|
20
|
+
command << " --#{conf} #{config[conf]}" if config.key?(conf)
|
18
21
|
end
|
19
22
|
|
20
23
|
command
|
@@ -23,6 +26,6 @@ module Jekyll
|
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
26
|
-
%i
|
29
|
+
%i[vega vegalite].each do |tag|
|
27
30
|
Liquid::Template.register_tag(tag, Jekyll::Diagrams::VegaBlock)
|
28
|
-
end
|
31
|
+
end
|
@@ -1,19 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class WavedromBlock < Block
|
4
6
|
def render_svg(code, config)
|
5
7
|
command = build_command(config)
|
6
8
|
|
7
|
-
render_with_tempfile(command, code) do |
|
8
|
-
"
|
9
|
+
render_with_tempfile(command, code) do |input, output|
|
10
|
+
"--input #{input} --svg #{output}"
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
|
-
def build_command(
|
14
|
+
def build_command(_config)
|
13
15
|
'wavedrom-cli'
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
|
-
Liquid::Template.register_tag(:wavedrom, Jekyll::Diagrams::WavedromBlock)
|
21
|
+
Liquid::Template.register_tag(:wavedrom, Jekyll::Diagrams::WavedromBlock)
|
data/test/erd_test.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class ErdTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@block = Jekyll::Diagrams::ErdBlock.send(
|
8
|
+
:new, 'erd', '', Liquid::ParseContext.new
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_build_command_with_default_config
|
13
|
+
config = {}
|
14
|
+
assert_equal 'erd --fmt=svg', @block.build_command(config)
|
15
|
+
|
16
|
+
config = { 'edge' => 'compound' }
|
17
|
+
assert_match 'edge', @block.build_command(config)
|
18
|
+
|
19
|
+
config = { 'dot-entity' => true }
|
20
|
+
assert_match 'dot-entity', @block.build_command(config)
|
21
|
+
end
|
22
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,16 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
lib = File.expand_path('../lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
|
5
6
|
require 'coveralls'
|
6
|
-
|
7
7
|
Coveralls.wear!
|
8
8
|
|
9
|
+
require 'minitest/autorun'
|
10
|
+
|
9
11
|
require 'fileutils'
|
10
12
|
require 'jekyll'
|
11
|
-
|
12
|
-
require 'jekyll-diagrams/util'
|
13
|
-
require 'jekyll-diagrams/renderer'
|
14
|
-
require 'jekyll-diagrams/block'
|
15
|
-
|
16
|
-
require 'minitest/autorun'
|
13
|
+
require 'jekyll-diagrams'
|
data/test/util_test.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class UtilTest < Minitest::Test
|
6
|
+
include Jekyll::Diagrams::Util
|
7
|
+
|
8
|
+
def test_normalized_attrs
|
9
|
+
attrs = 'color=red'
|
10
|
+
assert_equal ' -Ecolor=red', normalized_attrs(attrs, prefix: ' -E')
|
11
|
+
|
12
|
+
attrs = %w[color=red background=green]
|
13
|
+
assert_equal ' -Gcolor=red -Gbackground=green',
|
14
|
+
normalized_attrs(attrs, prefix: ' -G')
|
15
|
+
|
16
|
+
attrs = { 'color' => 'red', 'background' => 'green' }
|
17
|
+
assert_equal ' -Ncolor=red -Nbackground=green',
|
18
|
+
normalized_attrs(attrs, prefix: ' -N')
|
19
|
+
end
|
20
|
+
end
|