kilo/vendor/github.com/awalterschulze/gographviz/attrs.go

100 lines
2.2 KiB
Go

//Copyright 2013 GoGraphviz Authors
//
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
package gographviz
import (
"sort"
)
// Attrs represents attributes for an Edge, Node or Graph.
type Attrs map[Attr]string
// NewAttrs creates an empty Attributes type.
func NewAttrs(m map[string]string) (Attrs, error) {
as := make(Attrs)
for k, v := range m {
if err := as.Add(k, v); err != nil {
return nil, err
}
}
return as, nil
}
// Add adds an attribute name and value.
func (attrs Attrs) Add(field string, value string) error {
a, err := NewAttr(field)
if err != nil {
return err
}
attrs.add(a, value)
return nil
}
func (attrs Attrs) add(field Attr, value string) {
attrs[field] = value
}
// Extend adds the attributes into attrs Attrs type overwriting duplicates.
func (attrs Attrs) Extend(more Attrs) {
for key, value := range more {
attrs.add(key, value)
}
}
// Ammend only adds the missing attributes to attrs Attrs type.
func (attrs Attrs) Ammend(more Attrs) {
for key, value := range more {
if _, ok := attrs[key]; !ok {
attrs.add(key, value)
}
}
}
func (attrs Attrs) toMap() map[string]string {
m := make(map[string]string)
for k, v := range attrs {
m[string(k)] = v
}
return m
}
type attrList []Attr
func (attrs attrList) Len() int { return len(attrs) }
func (attrs attrList) Less(i, j int) bool {
return attrs[i] < attrs[j]
}
func (attrs attrList) Swap(i, j int) {
attrs[i], attrs[j] = attrs[j], attrs[i]
}
func (attrs Attrs) sortedNames() []Attr {
keys := make(attrList, 0)
for key := range attrs {
keys = append(keys, key)
}
sort.Sort(keys)
return []Attr(keys)
}
// Copy returns a copy of the attributes map
func (attrs Attrs) Copy() Attrs {
mm := make(Attrs)
for k, v := range attrs {
mm[k] = v
}
return mm
}