forked from Seao/grav-plugin-diagrams
-
Notifications
You must be signed in to change notification settings - Fork 1
/
mermaid-diagrams.php
101 lines (83 loc) · 3.7 KB
/
mermaid-diagrams.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
namespace Grav\Plugin;
use \Grav\Common\Plugin;
use RocketTheme\Toolbox\Event\Event;
class MermaidDiagramsPlugin extends Plugin
{
protected $theme;
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'onPageContentRaw' => ['onPageContentRaw', 0],
'onTwigSiteVariables' => ['onTwigSiteVariables', 0]
];
}
public function onPageContentRaw(Event $event)
{
// Variables
$this->align = $this->config->get('plugins.mermaid-diagrams.align');
$page = $event['page'];
$twig = $this->grav['twig'];
$config = $this->mergeConfig($page);
if ($config->get('enabled')) {
// Get initial content
$raw = $page->getRawContent();
$match_mermaid = function ($matches) use (&$page, &$twig, &$config) {
// Get the matching content
$search_mermaid = $matches[0];
// Remove the tab selector
$search_mermaid = str_replace("[mermaid]", "", $search_mermaid);
$search_mermaid = str_replace("[/mermaid]", "", $search_mermaid);
// Creating the replacement structure
$replace_header = "<div class=\"mermaid\" style=\"text-align:".$this->align."\">";
$replace_footer = "</div>";
$replace_content = $search_mermaid;
$replace = "$replace_header" . "$replace_content" . "$replace_footer";
return $replace;
};
$raw = $this->parseInjectMermaid($raw, $match_mermaid);
$page->setRawContent($raw);
}
}
/**
* Applies a specific function to the result of the flow's regexp
*/
protected function parseInjectMermaid($content, $function)
{
// Regular Expression for selection
$regex = '/\[mermaid\]([\s\S]*?)\[\/mermaid\]/';
return preg_replace_callback($regex, $function, $content);
}
/**
* Set needed ressources to display and convert charts
*/
public function onTwigSiteVariables()
{
// Variables
$this->theme = $this->config->get('plugins.mermaid-diagrams.theme');
$this->font_size = $this->config->get('plugins.mermaid-diagrams.font.size');
$this->font_color = $this->config->get('plugins.mermaid-diagrams.font.color');
$this->line_color = $this->config->get('plugins.mermaid-diagrams.line.color');
$this->element_color = $this->config->get('plugins.mermaid-diagrams.line.color');
$this->condition_yes = $this->config->get('plugins.mermaid-diagrams.condition.yes');
$this->condition_no = $this->config->get('plugins.mermaid-diagrams.condition.no');
$this->gantt_axis = $this->config->get('plugins.mermaid-diagrams.gantt.axis');
// Resources for the conversion
//$this->grav['assets']->addJs('plugin://mermaid-diagrams/js/underscore-min.js');
//$this->grav['assets']->addJs('plugin://mermaid-diagrams/js/lodash.min.js');
//$this->grav['assets']->addJs('plugin://mermaid-diagrams/js/raphael-min.js');
$this->grav['assets']->addJs('plugin://mermaid-diagrams/js/mermaid.min.js');
$this->grav['assets']->addCss('plugin://mermaid-diagrams/css/mermaid.css');
// Used to start the conversion of the div "diagram" when the page is loaded
$init = "$(document).ready(function() {
mermaid.initialize({startOnLoad:true});
mermaid.ganttConfig = {
axisFormatter: [[\"".$this->gantt_axis."\", function (d){return d.getDay() == 1;}]]
};
});";
$this->grav['assets']->addInlineJs($init);
}
}