Documentation ¶
Index ¶
- Constants
- Variables
- func CompareSerializedEdge(edge, other *Edge) error
- func CompareSerializedGraph(g, other *Graph) error
- func CompareSerializedObject(obj, other *Object) error
- func DeserializeGraph(bytes []byte, g *Graph) error
- func GetTextDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler, t *d2target.MText, ...) *d2target.TextDimensions
- func Key(k *d2ast.KeyPath) []string
- func SerializeGraph(g *Graph) ([]byte, error)
- type Attributes
- type ContainerLevel
- type Edge
- type EdgeReference
- type Graph
- func (g *Graph) ApplyTheme(themeID int64) error
- func (g *Graph) GetBoard(name string) *Graph
- func (g *Graph) RootBoard() *Graph
- func (g *Graph) SetDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler, ...) error
- func (g *Graph) SortEdgesByAST()
- func (g *Graph) SortObjectsByAST()
- func (g *Graph) Texts() []*d2target.MText
- type LayoutGraph
- type Object
- func (obj *Object) AbsID() string
- func (obj *Object) AbsIDArray() []string
- func (obj *Object) AppendReferences(ida []string, ref Reference, unresolvedObj *Object)
- func (obj *Object) ClosestGridDiagram() *Object
- func (obj *Object) Connect(srcID, dstID []string, srcArrow, dstArrow bool, label string) (*Edge, error)
- func (o *Object) ContainedBy(obj *Object) bool
- func (obj *Object) ContainsAnyEdge(edges []*Edge) bool
- func (obj *Object) ContainsAnyObject(objects []*Object) bool
- func (obj *Object) EnsureChild(ida []string) *Object
- func (obj *Object) EnsureChildIDVal(ids []string) *Object
- func (obj *Object) FindEdges(mk *d2ast.Key) ([]*Edge, bool)
- func (obj *Object) GetDefaultSize(mtexts []*d2target.MText, ruler *textmeasure.Ruler, ...) (*d2target.TextDimensions, error)
- func (obj *Object) GetFill() string
- func (obj *Object) GetLabelSize(mtexts []*d2target.MText, ruler *textmeasure.Ruler, ...) (*d2target.TextDimensions, error)
- func (obj *Object) GetStroke(dashGapSize interface{}) string
- func (obj *Object) HasChild(ids []string) (*Object, bool)
- func (obj *Object) HasEdge(mk *d2ast.Key) (*Edge, bool)
- func (obj *Object) HasOutsideBottomLabel() bool
- func (obj *Object) IsContainer() bool
- func (obj *Object) IsDescendantOf(ancestor *Object) bool
- func (obj *Object) IsGridDiagram() bool
- func (obj *Object) IsSequenceDiagram() bool
- func (obj *Object) IsSequenceDiagramGroup() bool
- func (obj *Object) IsSequenceDiagramNote() bool
- func (obj *Object) Level() ContainerLevel
- func (obj *Object) OuterNearContainer() *Object
- func (obj *Object) OuterSequenceDiagram() *Object
- func (obj *Object) Text() *d2target.MText
- type Reference
- type Scalar
- type SerializedEdge
- type SerializedGraph
- type SerializedObject
- type Style
Constants ¶
const DEFAULT_SHAPE_SIZE = 100.
const INNER_LABEL_PADDING int = 5
const MIN_SHAPE_SIZE = 5
Variables ¶
var BoardKeywords = map[string]struct{}{
"layers": {},
"scenarios": {},
"steps": {},
}
BoardKeywords contains the keywords that create new boards.
var FillPatterns = []string{
"dots",
"lines",
"grain",
"paper",
}
var NearConstants map[string]struct{}
var NearConstantsArray = []string{
"top-left",
"top-center",
"top-right",
"center-left",
"center-right",
"bottom-left",
"bottom-center",
"bottom-right",
}
TODO maybe autofmt should allow other values, and transform them to conform e.g. left-center becomes center-left
var ReservedKeywordHolders = map[string]struct{}{
"style": {},
"source-arrowhead": {},
"target-arrowhead": {},
}
ReservedKeywordHolders are reserved keywords that are meaningless on its own and exist solely to hold a set of reserved keywords
var ReservedKeywords map[string]struct{}
All reserved keywords. See init below.
var ReservedKeywords2 map[string]struct{}
All reserved keywords not including style keywords.
var SimpleReservedKeywords = map[string]struct{}{
"label": {},
"desc": {},
"shape": {},
"icon": {},
"constraint": {},
"tooltip": {},
"link": {},
"near": {},
"width": {},
"height": {},
"direction": {},
"top": {},
"left": {},
"grid-rows": {},
"grid-columns": {},
"class": {},
"classes": {},
}
Non Style/Holder keywords.
var StyleKeywords = map[string]struct{}{
"opacity": {},
"stroke": {},
"fill": {},
"fill-pattern": {},
"stroke-width": {},
"stroke-dash": {},
"border-radius": {},
"font": {},
"font-size": {},
"font-color": {},
"bold": {},
"italic": {},
"underline": {},
"text-transform": {},
"shadow": {},
"multiple": {},
"double-border": {},
"3d": {},
"animated": {},
"filled": {},
}
StyleKeywords are reserved keywords which cannot exist outside of the "style" keyword
Functions ¶
func CompareSerializedEdge ¶ added in v0.2.1
func CompareSerializedGraph ¶ added in v0.2.1
func CompareSerializedObject ¶ added in v0.2.1
func DeserializeGraph ¶
func GetTextDimensions ¶ added in v0.1.4
func GetTextDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler, t *d2target.MText, fontFamily *d2fonts.FontFamily) *d2target.TextDimensions
func SerializeGraph ¶
Types ¶
type Attributes ¶
type Attributes struct { Label Scalar `json:"label"` Style Style `json:"style"` Icon *url.URL `json:"icon,omitempty"` Tooltip *Scalar `json:"tooltip,omitempty"` Link *Scalar `json:"link,omitempty"` Width *Scalar `json:"width,omitempty"` Height *Scalar `json:"height,omitempty"` Top *Scalar `json:"top,omitempty"` Left *Scalar `json:"left,omitempty"` // TODO consider separate Attributes struct for shape-specific and edge-specific // Shapes only NearKey *d2ast.KeyPath `json:"near_key"` Language string `json:"language,omitempty"` // TODO: default to ShapeRectangle instead of empty string Shape Scalar `json:"shape"` Direction Scalar `json:"direction"` Constraint Scalar `json:"constraint"` GridRows *Scalar `json:"gridRows,omitempty"` GridColumns *Scalar `json:"gridColumns,omitempty"` // These names are attached to the rendered elements in SVG // so that users can target them however they like outside of D2 Classes []string `json:"classes,omitempty"` }
func (*Attributes) ApplyTextTransform ¶ added in v0.4.0
func (a *Attributes) ApplyTextTransform()
ApplyTextTransform will alter the `Label.Value` of the current object based on the specification of the `text-transform` styling option. This function has side-effects!
type ContainerLevel ¶
type ContainerLevel int
func (ContainerLevel) LabelSize ¶
func (l ContainerLevel) LabelSize() int
type Edge ¶
type Edge struct { Index int `json:"index"` MinWidth int `json:"minWidth"` MinHeight int `json:"minHeight"` SrcTableColumnIndex *int `json:"srcTableColumnIndex,omitempty"` DstTableColumnIndex *int `json:"dstTableColumnIndex,omitempty"` LabelDimensions d2target.TextDimensions `json:"label_dimensions"` LabelPosition *string `json:"labelPosition,omitempty"` LabelPercentage *float64 `json:"labelPercentage,omitempty"` IsCurve bool `json:"isCurve"` Route []*geo.Point `json:"route,omitempty"` Src *Object `json:"-"` SrcArrow bool `json:"src_arrow"` SrcArrowhead *Attributes `json:"srcArrowhead,omitempty"` Dst *Object `json:"-"` // TODO alixander (Mon Sep 12 2022): deprecate SrcArrow and DstArrow and just use SrcArrowhead and DstArrowhead DstArrow bool `json:"dst_arrow"` DstArrowhead *Attributes `json:"dstArrowhead,omitempty"` References []EdgeReference `json:"references,omitempty"` Attributes *Attributes `json:"attributes,omitempty"` ZIndex int `json:"zIndex"` }
func (*Edge) ArrowString ¶
func (*Edge) ContainedBy ¶ added in v0.1.0
func (*Edge) GetAstEdge ¶ added in v0.4.0
type EdgeReference ¶
type Graph ¶
type Graph struct { Parent *Graph `json:"-"` Name string `json:"name"` // IsFolderOnly indicates a board or scenario itself makes no modifications from its // base. Folder only boards do not have a render and are used purely for organizing // the board tree. IsFolderOnly bool `json:"isFolderOnly"` AST *d2ast.Map `json:"ast"` Root *Object `json:"root"` Edges []*Edge `json:"edges"` Objects []*Object `json:"objects"` Layers []*Graph `json:"layers,omitempty"` Scenarios []*Graph `json:"scenarios,omitempty"` Steps []*Graph `json:"steps,omitempty"` Theme *d2themes.Theme `json:"theme,omitempty"` }
func (*Graph) ApplyTheme ¶ added in v0.2.5
ApplyTheme applies themes on the graph level This is different than on the render level, which only changes colors A theme applied on the graph level applies special rules that change the graph
func (*Graph) SetDimensions ¶
func (g *Graph) SetDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler, fontFamily *d2fonts.FontFamily) error
func (*Graph) SortEdgesByAST ¶ added in v0.2.0
func (g *Graph) SortEdgesByAST()
func (*Graph) SortObjectsByAST ¶ added in v0.2.0
func (g *Graph) SortObjectsByAST()
type Object ¶
type Object struct { Graph *Graph `json:"-"` Parent *Object `json:"-"` // IDVal is the actual value of the ID whereas ID is the value in d2 syntax. // e.g. ID: "yes'\"" // IDVal: yes'" // // ID allows joining on . naively and construct a valid D2 key path ID string `json:"id"` IDVal string `json:"id_val"` Map *d2ast.Map `json:"-"` LabelDimensions d2target.TextDimensions `json:"label_dimensions"` References []Reference `json:"references,omitempty"` *geo.Box `json:"box,omitempty"` LabelPosition *string `json:"labelPosition,omitempty"` LabelWidth *int `json:"labelWidth,omitempty"` LabelHeight *int `json:"labelHeight,omitempty"` IconPosition *string `json:"iconPosition,omitempty"` Class *d2target.Class `json:"class,omitempty"` SQLTable *d2target.SQLTable `json:"sql_table,omitempty"` Children map[string]*Object `json:"-"` ChildrenArray []*Object `json:"-"` Attributes *Attributes `json:"attributes,omitempty"` ZIndex int `json:"zIndex"` }
TODO maybe rename to Shape
func ResolveUnderscoreKey ¶
func ResolveUnderscoreKey(ida []string, obj *Object) (resolvedObj *Object, resolvedIDA []string, _ error)
TODO: remove once not used anywhere
func (*Object) AbsIDArray ¶
func (*Object) AppendReferences ¶
func (*Object) ClosestGridDiagram ¶ added in v0.4.0
func (*Object) ContainedBy ¶ added in v0.1.0
func (*Object) ContainsAnyEdge ¶ added in v0.1.0
func (*Object) ContainsAnyObject ¶ added in v0.1.0
func (*Object) EnsureChild ¶
EnsureChild grabs the child by ids or creates it if it does not exist including all intermediate nodes.
func (*Object) EnsureChildIDVal ¶ added in v0.2.2
Keep in sync with EnsureChild.
func (*Object) GetDefaultSize ¶ added in v0.1.4
func (obj *Object) GetDefaultSize(mtexts []*d2target.MText, ruler *textmeasure.Ruler, fontFamily *d2fonts.FontFamily, labelDims d2target.TextDimensions, withLabelPadding bool) (*d2target.TextDimensions, error)
func (*Object) GetLabelSize ¶ added in v0.1.4
func (obj *Object) GetLabelSize(mtexts []*d2target.MText, ruler *textmeasure.Ruler, fontFamily *d2fonts.FontFamily) (*d2target.TextDimensions, error)
func (*Object) HasOutsideBottomLabel ¶ added in v0.2.4
func (*Object) IsContainer ¶
func (*Object) IsDescendantOf ¶ added in v0.2.1
func (*Object) IsGridDiagram ¶ added in v0.4.0
func (*Object) IsSequenceDiagram ¶ added in v0.1.0
func (*Object) IsSequenceDiagramGroup ¶ added in v0.1.0
groups are objects in sequence diagrams that have no messages connected and does not have a note as a child (a note can appear within a group, but it's a child of an actor)
func (*Object) IsSequenceDiagramNote ¶ added in v0.1.0
notes are descendant of actors with no edges and no children
func (*Object) Level ¶
func (obj *Object) Level() ContainerLevel
func (*Object) OuterNearContainer ¶ added in v0.4.0
func (*Object) OuterSequenceDiagram ¶ added in v0.1.0
type Reference ¶
type Reference struct { Key *d2ast.KeyPath `json:"key"` KeyPathIndex int `json:"key_path_index"` MapKey *d2ast.Key `json:"-"` MapKeyEdgeIndex int `json:"map_key_edge_index"` Scope *d2ast.Map `json:"-"` ScopeObj *Object `json:"-"` }
TODO references at the root scope should have their Scope set to root graph AST
func (Reference) MapKeyEdgeDest ¶
type Scalar ¶
TODO consider having different Scalar types Right now we'll hold any types in Value and just convert, e.g. floats
type SerializedEdge ¶
type SerializedEdge map[string]interface{}
type SerializedGraph ¶
type SerializedGraph struct { Root SerializedObject `json:"root"` Edges []SerializedEdge `json:"edges"` Objects []SerializedObject `json:"objects"` }
type SerializedObject ¶
type SerializedObject map[string]interface{}
type Style ¶
type Style struct { Opacity *Scalar `json:"opacity,omitempty"` Stroke *Scalar `json:"stroke,omitempty"` Fill *Scalar `json:"fill,omitempty"` FillPattern *Scalar `json:"fillPattern,omitempty"` StrokeWidth *Scalar `json:"strokeWidth,omitempty"` StrokeDash *Scalar `json:"strokeDash,omitempty"` BorderRadius *Scalar `json:"borderRadius,omitempty"` Shadow *Scalar `json:"shadow,omitempty"` ThreeDee *Scalar `json:"3d,omitempty"` Multiple *Scalar `json:"multiple,omitempty"` Font *Scalar `json:"font,omitempty"` FontSize *Scalar `json:"fontSize,omitempty"` FontColor *Scalar `json:"fontColor,omitempty"` Animated *Scalar `json:"animated,omitempty"` Bold *Scalar `json:"bold,omitempty"` Italic *Scalar `json:"italic,omitempty"` Underline *Scalar `json:"underline,omitempty"` Filled *Scalar `json:"filled,omitempty"` DoubleBorder *Scalar `json:"doubleBorder,omitempty"` TextTransform *Scalar `json:"textTransform,omitempty"` }
func (Style) NoneTextTransform ¶ added in v0.4.0
NoneTextTransform will return a boolean if the text should not have any transformation applied. This should overwrite theme specific transformations like `CapsLock` from the `terminal` theme.