jekyll-diagrams 0.9.1 → 0.9.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 +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
@@ -0,0 +1,21 @@
|
|
1
|
+
Feature: Mermaid
|
2
|
+
|
3
|
+
|
4
|
+
Scenario: Default configuration
|
5
|
+
Given I have a file 'mermaid.md' with content:
|
6
|
+
"""
|
7
|
+
---
|
8
|
+
---
|
9
|
+
|
10
|
+
{% mermaid %}
|
11
|
+
sequenceDiagram
|
12
|
+
participant John
|
13
|
+
participant Alice
|
14
|
+
Alice->>John: Hello John, how are you?
|
15
|
+
John-->>Alice: Great!
|
16
|
+
{% endmermaid %}
|
17
|
+
"""
|
18
|
+
When I run jekyll build
|
19
|
+
Then the file '_site/mermaid.html' should exist
|
20
|
+
And I should see 'diagrams mermaid' in '_site/mermaid.html'
|
21
|
+
And I should see svg output in '_site/mermaid.html'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Feature: Nomnoml
|
2
|
+
|
3
|
+
|
4
|
+
Scenario: Default configuration
|
5
|
+
Given I have a file 'nomnoml.md' with content:
|
6
|
+
"""
|
7
|
+
---
|
8
|
+
---
|
9
|
+
|
10
|
+
{% nomnoml %}
|
11
|
+
[Pirate|eyeCount: Int|raid();pillage()|
|
12
|
+
[beard]--[parrot]
|
13
|
+
[beard]-:>[foul mouth]
|
14
|
+
]
|
15
|
+
|
16
|
+
[<abstract>Marauder]<:--[Pirate]
|
17
|
+
[Pirate]- 0..7[mischief]
|
18
|
+
[jollyness]->[Pirate]
|
19
|
+
[jollyness]->[rum]
|
20
|
+
[jollyness]->[singing]
|
21
|
+
[Pirate]-> *[rum|tastiness: Int|swig()]
|
22
|
+
[Pirate]->[singing]
|
23
|
+
[singing]<->[rum]
|
24
|
+
|
25
|
+
[<start>st]->[<state>plunder]
|
26
|
+
[plunder]->[<choice>more loot]
|
27
|
+
[more loot]->[st]
|
28
|
+
[more loot] no ->[<end>e]
|
29
|
+
|
30
|
+
[<actor>Sailor] - [<usecase>shiver me;timbers]
|
31
|
+
{% endnomnoml %}
|
32
|
+
"""
|
33
|
+
When I run jekyll build
|
34
|
+
Then the file '_site/nomnoml.html' should exist
|
35
|
+
And I should see 'diagrams nomnoml' in '_site/nomnoml.html'
|
36
|
+
And I should see svg output in '_site/nomnoml.html'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: PlantUML
|
2
|
+
|
3
|
+
|
4
|
+
Scenario: Default configuration
|
5
|
+
Given I have a file 'plantuml.md' with content:
|
6
|
+
"""
|
7
|
+
---
|
8
|
+
---
|
9
|
+
|
10
|
+
{% plantuml %}
|
11
|
+
@startuml
|
12
|
+
class Car
|
13
|
+
|
14
|
+
Driver - Car : drives >
|
15
|
+
Car *- Wheel : have 4 >
|
16
|
+
Car -- Person : < owns
|
17
|
+
|
18
|
+
@enduml
|
19
|
+
{% endplantuml %}
|
20
|
+
"""
|
21
|
+
When I run jekyll build
|
22
|
+
Then the file '_site/plantuml.html' should exist
|
23
|
+
And I should see 'diagrams plantuml' in '_site/plantuml.html'
|
24
|
+
And I should see svg output in '_site/plantuml.html'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Feature: SMCat
|
2
|
+
|
3
|
+
|
4
|
+
Scenario: Default configuration
|
5
|
+
Given I have a file 'smcat.md' with content:
|
6
|
+
"""
|
7
|
+
---
|
8
|
+
---
|
9
|
+
|
10
|
+
{% smcat %}
|
11
|
+
initial,
|
12
|
+
"tape player off",
|
13
|
+
"tape player on" {
|
14
|
+
stopped => playing : play;
|
15
|
+
playing => stopped : stop;
|
16
|
+
playing => paused : pause;
|
17
|
+
paused => playing : pause;
|
18
|
+
paused => stopped : stop;
|
19
|
+
};
|
20
|
+
|
21
|
+
initial => "tape player off";
|
22
|
+
"tape player off" => stopped : power;
|
23
|
+
"tape player on" => "tape player off" : power;
|
24
|
+
{% endsmcat %}
|
25
|
+
"""
|
26
|
+
When I run jekyll build
|
27
|
+
Then the file '_site/smcat.html' should exist
|
28
|
+
And I should see 'diagrams smcat' in '_site/smcat.html'
|
29
|
+
And I should see svg output in '_site/smcat.html'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Given('I have a file {string} with content:') do |file, content|
|
4
|
+
File.write(file, content)
|
5
|
+
end
|
6
|
+
|
7
|
+
When('I run jekyll build') do
|
8
|
+
run_jekyll
|
9
|
+
end
|
10
|
+
|
11
|
+
Then('the file {string} should exist') do |file|
|
12
|
+
assert File.exist?(file)
|
13
|
+
end
|
14
|
+
|
15
|
+
Then('I should see svg output in {string}') do |file|
|
16
|
+
assert_match %r{<svg(.|\r|\n)*?>(.|\r|\n)*</svg>}, File.read(file)
|
17
|
+
end
|
18
|
+
|
19
|
+
Then('I should see {string} in {string}') do |pattern, file|
|
20
|
+
assert_match Regexp.new(pattern), File.read(file)
|
21
|
+
end
|
22
|
+
|
23
|
+
Then('I should not see {string} in {string}') do |pattern, file|
|
24
|
+
refute_match Regexp.new(pattern), File.read(file)
|
25
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'coveralls'
|
7
|
+
Coveralls.wear!
|
8
|
+
|
9
|
+
require 'tmpdir'
|
10
|
+
require 'minitest'
|
11
|
+
require 'jekyll'
|
12
|
+
require 'jekyll-diagrams'
|
13
|
+
|
14
|
+
TEST_DIR = File.join(Dir.tmpdir, 'jekyll-diagrams-features')
|
15
|
+
|
16
|
+
Before do
|
17
|
+
FileUtils.rm_rf(TEST_DIR) if File.exist?(TEST_DIR)
|
18
|
+
FileUtils.mkdir_p(TEST_DIR)
|
19
|
+
Dir.chdir(TEST_DIR)
|
20
|
+
end
|
21
|
+
|
22
|
+
After do
|
23
|
+
if File.exist?(TEST_DIR)
|
24
|
+
Dir.chdir(File.dirname(TEST_DIR))
|
25
|
+
FileUtils.rm_rf(TEST_DIR)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def run_jekyll
|
30
|
+
options = Jekyll.configuration(source: TEST_DIR, quiet: true)
|
31
|
+
|
32
|
+
Jekyll::Site.new(options).process
|
33
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Feature: Svgbob
|
2
|
+
|
3
|
+
|
4
|
+
Scenario: Default configuration
|
5
|
+
Given I have a file 'svgbob.md' with content:
|
6
|
+
"""
|
7
|
+
---
|
8
|
+
---
|
9
|
+
|
10
|
+
{% svgbob %}
|
11
|
+
.---> F
|
12
|
+
A B C D /
|
13
|
+
*-------*-----*---*----*-----> E
|
14
|
+
\ ^ \
|
15
|
+
v / '---> G
|
16
|
+
B --> C -'
|
17
|
+
{% endsvgbob %}
|
18
|
+
"""
|
19
|
+
When I run jekyll build
|
20
|
+
Then the file '_site/svgbob.html' should exist
|
21
|
+
And I should see 'diagrams svgbob' in '_site/svgbob.html'
|
22
|
+
And I should see svg output in '_site/svgbob.html'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Feature: Syntrax
|
2
|
+
|
3
|
+
|
4
|
+
Scenario: Default configuration
|
5
|
+
Given I have a file 'syntrax.md' with content:
|
6
|
+
"""
|
7
|
+
---
|
8
|
+
---
|
9
|
+
|
10
|
+
{% syntrax %}
|
11
|
+
indentstack(10,
|
12
|
+
line(opt('-'), choice('0', line('1-9', loop(None, '0-9'))),
|
13
|
+
opt('.', loop('0-9', None))),
|
14
|
+
|
15
|
+
line(opt(choice('e', 'E'), choice(None, '+', '-'), loop('0-9', None)))
|
16
|
+
)
|
17
|
+
{% endsyntrax %}
|
18
|
+
"""
|
19
|
+
When I run jekyll build
|
20
|
+
Then the file '_site/syntrax.html' should exist
|
21
|
+
And I should see 'diagrams syntrax' in '_site/syntrax.html'
|
22
|
+
And I should see svg output in '_site/syntrax.html'
|
@@ -0,0 +1,32 @@
|
|
1
|
+
Feature: Vega
|
2
|
+
|
3
|
+
|
4
|
+
Scenario: Default configuration
|
5
|
+
Given I have a file 'vega.md' with content:
|
6
|
+
"""
|
7
|
+
---
|
8
|
+
---
|
9
|
+
|
10
|
+
{% vega %}
|
11
|
+
{
|
12
|
+
"": "https://vega.github.io/schema/vega-lite/v4.json",
|
13
|
+
"description": "A simple bar chart with embedded data.",
|
14
|
+
"data": {
|
15
|
+
"values": [
|
16
|
+
{"a": "A", "b": 28}, {"a": "B", "b": 55}, {"a": "C", "b": 43},
|
17
|
+
{"a": "D", "b": 91}, {"a": "E", "b": 81}, {"a": "F", "b": 53},
|
18
|
+
{"a": "G", "b": 19}, {"a": "H", "b": 87}, {"a": "I", "b": 52}
|
19
|
+
]
|
20
|
+
},
|
21
|
+
"mark": "bar",
|
22
|
+
"encoding": {
|
23
|
+
"x": {"field": "a", "type": "ordinal"},
|
24
|
+
"y": {"field": "b", "type": "quantitative"}
|
25
|
+
}
|
26
|
+
}
|
27
|
+
{% endvega %}
|
28
|
+
"""
|
29
|
+
When I run jekyll build
|
30
|
+
Then the file '_site/vega.html' should exist
|
31
|
+
And I should see 'diagrams vega' in '_site/vega.html'
|
32
|
+
And I should see svg output in '_site/vega.html'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Feature: Wavedrom
|
2
|
+
|
3
|
+
|
4
|
+
Scenario: Default configuration
|
5
|
+
Given I have a file 'wavedrom.md' with content:
|
6
|
+
"""
|
7
|
+
---
|
8
|
+
---
|
9
|
+
|
10
|
+
{% wavedrom %}
|
11
|
+
{signal: [
|
12
|
+
{name: 'clk', wave: 'p.....|...'},
|
13
|
+
{name: 'dat', wave: 'x.345x|=.x', data: ['head', 'body', 'tail', 'data']},
|
14
|
+
{name: 'req', wave: '0.1..0|1.0'},
|
15
|
+
{name: 'ack', wave: '1.....|01.'}
|
16
|
+
]}
|
17
|
+
{% endwavedrom %}
|
18
|
+
"""
|
19
|
+
When I run jekyll build
|
20
|
+
Then the file '_site/wavedrom.html' should exist
|
21
|
+
And I should see 'diagrams wavedrom' in '_site/wavedrom.html'
|
22
|
+
And I should see svg output in '_site/wavedrom.html'
|
data/jekyll-diagrams.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
lib = File.expand_path('lib', __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
|
@@ -6,20 +8,24 @@ require 'jekyll-diagrams/version'
|
|
6
8
|
Gem::Specification.new do |spec|
|
7
9
|
spec.name = 'jekyll-diagrams'
|
8
10
|
spec.version = Jekyll::Diagrams::VERSION
|
9
|
-
spec.
|
10
|
-
spec.email =
|
11
|
+
spec.author = 'zhustec'
|
12
|
+
spec.email = 'zhustec@foxmail.com'
|
11
13
|
spec.homepage = 'https://github.com/zhustec/jekyll-diagrams'
|
12
|
-
spec.description = 'Jekyll plugins for diagrams support.'
|
13
|
-
spec.summary = 'Jekyll plugins for diagrams support, including Graphviz, Blockdiag, PlantUML and so on.'
|
14
14
|
spec.license = 'MIT'
|
15
|
+
spec.summary = 'Jekyll plugins for diagrams support'
|
16
|
+
spec.description = <<~DESC
|
17
|
+
Jekyll plugins for diagrams support, including Graphviz, Blockdiag,
|
18
|
+
PlantUML and so on.
|
19
|
+
DESC
|
15
20
|
|
16
21
|
spec.files = `git ls-files -z`.split("\x0")
|
17
|
-
spec.test_files = spec.files.grep(
|
22
|
+
spec.test_files = spec.files.grep(/^(test|spec|features)/)
|
18
23
|
spec.require_paths = ['lib']
|
19
24
|
|
20
25
|
spec.add_dependency 'jekyll', '>= 3.7', '< 5.0'
|
21
26
|
|
22
27
|
spec.add_development_dependency 'bundler'
|
23
|
-
spec.add_development_dependency '
|
28
|
+
spec.add_development_dependency 'cucumber'
|
24
29
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
25
|
-
|
30
|
+
spec.add_development_dependency 'rake'
|
31
|
+
end
|
data/lib/jekyll-diagrams.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'jekyll-diagrams/util'
|
2
|
-
require_relative 'jekyll-diagrams/renderer'
|
3
4
|
require_relative 'jekyll-diagrams/block'
|
4
5
|
|
5
6
|
require_relative 'jekyll-diagrams/blockdiag'
|
@@ -12,4 +13,4 @@ require_relative 'jekyll-diagrams/smcat'
|
|
12
13
|
require_relative 'jekyll-diagrams/svgbob'
|
13
14
|
require_relative 'jekyll-diagrams/syntrax'
|
14
15
|
require_relative 'jekyll-diagrams/vega'
|
15
|
-
require_relative 'jekyll-diagrams/wavedrom'
|
16
|
+
require_relative 'jekyll-diagrams/wavedrom'
|
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class Block < Liquid::Block
|
4
|
-
include Renderer
|
5
6
|
include Util
|
6
7
|
|
7
8
|
def render(context)
|
@@ -9,8 +10,8 @@ module Jekyll
|
|
9
10
|
wrap_class(svg)
|
10
11
|
end
|
11
12
|
|
12
|
-
def render_svg(
|
13
|
-
|
13
|
+
def render_svg(_, _)
|
14
|
+
''
|
14
15
|
end
|
15
16
|
|
16
17
|
def read_config(context)
|
@@ -22,4 +23,4 @@ module Jekyll
|
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
25
|
-
end
|
26
|
+
end
|
@@ -1,13 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class BlockdiagBlock < Block
|
4
|
-
CONFIGURATIONS = %w
|
6
|
+
CONFIGURATIONS = %w[config font fontmap size].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} -o #{output}"
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
@@ -17,10 +19,10 @@ module Jekyll
|
|
17
19
|
|
18
20
|
def build_command(config)
|
19
21
|
command = "#{block_name} -T svg --nodoctype"
|
20
|
-
command << ' --antialias' if config.
|
22
|
+
command << ' --antialias' if config.fetch('antialias', false) != false
|
21
23
|
|
22
24
|
CONFIGURATIONS.each do |conf|
|
23
|
-
command << " --#{conf}=#{config[conf]}" if config.
|
25
|
+
command << " --#{conf}=#{config[conf]}" if config.key?(conf)
|
24
26
|
end
|
25
27
|
|
26
28
|
command
|
@@ -29,6 +31,6 @@ module Jekyll
|
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
|
-
%i
|
34
|
+
%i[blockdiag seqdiag actdiag nwdiag rackdiag packetdiag].each do |tag|
|
33
35
|
Liquid::Template.register_tag(tag, Jekyll::Diagrams::BlockdiagBlock)
|
34
|
-
end
|
36
|
+
end
|
data/lib/jekyll-diagrams/erd.rb
CHANGED
@@ -1,21 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class ErdBlock < Block
|
4
|
-
|
6
|
+
XML_REGEX = /^<\?xml(([^>]|\n)*>\n?){2}/.freeze
|
7
|
+
CONFIGURATIONS = %w[config edge].freeze
|
5
8
|
|
6
9
|
def render_svg(code, config)
|
7
10
|
command = build_command(config)
|
8
11
|
|
9
12
|
svg = render_with_stdin_stdout(command, code)
|
10
|
-
svg.sub!(
|
13
|
+
svg.sub!(XML_REGEX, '')
|
11
14
|
end
|
12
15
|
|
13
16
|
def build_command(config)
|
14
|
-
command = 'erd --fmt=svg'
|
15
|
-
command << ' --dot-entity' if config.
|
17
|
+
command = +'erd --fmt=svg'
|
18
|
+
command << ' --dot-entity' if config.fetch('dot-entity', false) != false
|
16
19
|
|
17
20
|
CONFIGURATIONS.each do |conf|
|
18
|
-
command << " --#{conf}=#{config[conf]}" if config.
|
21
|
+
command << " --#{conf}=#{config[conf]}" if config.key?(conf)
|
19
22
|
end
|
20
23
|
|
21
24
|
command
|
@@ -24,4 +27,4 @@ module Jekyll
|
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
27
|
-
Liquid::Template.register_tag(:erd, Jekyll::Diagrams::ErdBlock)
|
30
|
+
Liquid::Template.register_tag(:erd, Jekyll::Diagrams::ErdBlock)
|
@@ -1,6 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Diagrams
|
3
5
|
class GraphvizBlock < Block
|
6
|
+
XML_REGEX = /^<\?xml(([^>]|\n)*>\n?){2}/.freeze
|
4
7
|
CONFIGRATIONS = {
|
5
8
|
'K' => 'default_layout',
|
6
9
|
'G' => 'graph_attributes',
|
@@ -11,28 +14,20 @@ module Jekyll
|
|
11
14
|
def render_svg(code, config)
|
12
15
|
command = build_command(config)
|
13
16
|
|
14
|
-
svg = render_with_stdin_stdout(command, code)
|
15
|
-
|
17
|
+
svg = render_with_stdin_stdout(command, code).force_encoding(
|
18
|
+
config.fetch('encoding', 'utf-8')
|
19
|
+
)
|
20
|
+
|
21
|
+
svg.sub!(XML_REGEX, '')
|
16
22
|
end
|
17
23
|
|
18
24
|
def build_command(config)
|
19
|
-
command = 'dot -Tsvg'
|
25
|
+
command = +'dot -Tsvg'
|
20
26
|
|
21
27
|
CONFIGRATIONS.each do |prefix, conf|
|
22
|
-
next unless config.
|
23
|
-
|
24
|
-
attrs = config[conf]
|
25
|
-
|
26
|
-
attrs = case attrs
|
27
|
-
when String
|
28
|
-
attrs
|
29
|
-
when Array
|
30
|
-
attrs.join(" -#{prefix}")
|
31
|
-
when Hash
|
32
|
-
attrs.map { |k, v| "#{k}=#{v}" }.join(" -#{prefix}")
|
33
|
-
end
|
28
|
+
next unless config.key?(conf)
|
34
29
|
|
35
|
-
command << " -#{prefix}
|
30
|
+
command << normalized_attrs(config[conf], prefix: " -#{prefix}")
|
36
31
|
end
|
37
32
|
|
38
33
|
command
|
@@ -41,4 +36,4 @@ module Jekyll
|
|
41
36
|
end
|
42
37
|
end
|
43
38
|
|
44
|
-
Liquid::Template.register_tag(:graphviz, Jekyll::Diagrams::GraphvizBlock)
|
39
|
+
Liquid::Template.register_tag(:graphviz, Jekyll::Diagrams::GraphvizBlock)
|