2022-12-03 20:15:54 +00:00
//go:build !noelk
2022-11-11 19:43:56 +00:00
package d2plugin
import (
"context"
2022-12-30 08:09:28 +00:00
"encoding/json"
2022-11-11 19:43:56 +00:00
"oss.terrastruct.com/d2/d2graph"
"oss.terrastruct.com/d2/d2layouts/d2elklayout"
2022-12-30 05:09:53 +00:00
"oss.terrastruct.com/util-go/xmain"
2022-11-11 19:43:56 +00:00
)
var ELKPlugin = elkPlugin { }
func init ( ) {
2022-12-30 06:43:01 +00:00
plugins = append ( plugins , & ELKPlugin )
2022-11-11 19:43:56 +00:00
}
2022-12-30 05:09:53 +00:00
type elkPlugin struct {
2022-12-30 06:43:01 +00:00
opts * d2elklayout . ConfigurableOpts
2022-12-30 05:09:53 +00:00
}
2022-12-30 19:33:32 +00:00
func ( p elkPlugin ) Flags ( context . Context ) ( [ ] PluginSpecificFlag , error ) {
2022-12-30 08:09:28 +00:00
return [ ] PluginSpecificFlag {
{
Name : "elk-algorithm" ,
Type : "string" ,
Default : d2elklayout . DefaultOpts . Algorithm ,
2022-12-30 20:34:25 +00:00
Usage : "layout algorithm. https://www.eclipse.org/elk/reference/options/org-eclipse-elk-algorithm.html" ,
2022-12-30 08:09:28 +00:00
Tag : "elk.algorithm" ,
} ,
2022-12-30 20:34:25 +00:00
{
Name : "elk-nodeNodeBetweenLayers" ,
Type : "int64" ,
2022-12-30 20:40:52 +00:00
Default : int64 ( d2elklayout . DefaultOpts . NodeSpacing ) ,
2022-12-30 20:34:25 +00:00
Usage : "the spacing to be preserved between any pair of nodes of two adjacent layers. https://www.eclipse.org/elk/reference/options/org-eclipse-elk-layered-spacing-nodeNodeBetweenLayers.html" ,
Tag : "spacing.nodeNodeBetweenLayers" ,
} ,
{
Name : "elk-padding" ,
Type : "string" ,
Default : d2elklayout . DefaultOpts . Padding ,
Usage : "the padding to be left to a parent element’ s border when placing child elements. https://www.eclipse.org/elk/reference/options/org-eclipse-elk-padding.html" ,
Tag : "elk.padding" ,
} ,
{
Name : "elk-edgeNodeBetweenLayers" ,
Type : "int64" ,
2022-12-30 20:40:52 +00:00
Default : int64 ( d2elklayout . DefaultOpts . EdgeNodeSpacing ) ,
2022-12-30 20:34:25 +00:00
Usage : "the spacing to be preserved between nodes and edges that are routed next to the node’ s layer. https://www.eclipse.org/elk/reference/options/org-eclipse-elk-layered-spacing-edgeNodeBetweenLayers.html" ,
Tag : "spacing.edgeNodeBetweenLayers" ,
} ,
{
Name : "elk-nodeSelfLoop" ,
Type : "int64" ,
2022-12-30 20:40:52 +00:00
Default : int64 ( d2elklayout . DefaultOpts . SelfLoopSpacing ) ,
2022-12-30 20:34:25 +00:00
Usage : "spacing to be preserved between a node and its self loops. https://www.eclipse.org/elk/reference/options/org-eclipse-elk-spacing-nodeSelfLoop.html" ,
Tag : "elk.spacing.nodeSelfLoop" ,
} ,
2022-12-30 19:33:32 +00:00
} , nil
2022-12-30 08:09:28 +00:00
}
func ( p * elkPlugin ) HydrateOpts ( opts [ ] byte ) error {
2022-12-30 05:09:53 +00:00
if opts != nil {
2022-12-30 08:09:28 +00:00
var elkOpts d2elklayout . ConfigurableOpts
err := json . Unmarshal ( opts , & elkOpts )
if err != nil {
// TODO not right
2022-12-30 05:09:53 +00:00
return xmain . UsageErrorf ( "non-dagre layout options given for dagre" )
}
p . opts = & elkOpts
}
return nil
}
2022-11-11 19:43:56 +00:00
2022-12-30 08:09:28 +00:00
func ( p elkPlugin ) Info ( context . Context ) ( * PluginInfo , error ) {
2022-11-11 19:43:56 +00:00
return & PluginInfo {
2022-11-13 03:45:36 +00:00
Name : "elk" ,
2022-11-11 19:43:56 +00:00
ShortHelp : "Eclipse Layout Kernel (ELK) with the Layered algorithm." ,
LongHelp : ` ELK is a layout engine offered by Eclipse .
Originally written in Java , it has been ported to Javascript and cross - compiled into D2 .
See https : //github.com/kieler/elkjs for more.`,
} , nil
}
2022-12-30 08:09:28 +00:00
func ( p elkPlugin ) Layout ( ctx context . Context , g * d2graph . Graph ) error {
2022-12-30 05:09:53 +00:00
return d2elklayout . Layout ( ctx , g , p . opts )
2022-11-11 19:43:56 +00:00
}
2022-12-30 08:09:28 +00:00
func ( p elkPlugin ) PostProcess ( ctx context . Context , in [ ] byte ) ( [ ] byte , error ) {
2022-11-11 19:43:56 +00:00
return in , nil
}