138 lines
3.5 KiB
Go
138 lines
3.5 KiB
Go
package site
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
var kindIcons = map[string]string{
|
|
KindPage: "help.book",
|
|
KindModule: "cat.node",
|
|
KindFunction: "code.brackets",
|
|
KindType: "code.block",
|
|
KindField: "code.hints",
|
|
KindMethod: "code.brackets",
|
|
KindSignal: "panel.events",
|
|
KindCode: "log.error",
|
|
KindConst: "code.hints",
|
|
KindEnum: "code.hints",
|
|
}
|
|
|
|
var (
|
|
svgOpen = regexp.MustCompile(`(?s)<svg[^>]*?viewBox="([^"]+)"[^>]*>(.*)</svg>`)
|
|
svgWhite = regexp.MustCompile(`(?i)(fill|stroke)="#(fff|ffffff|white)"`)
|
|
)
|
|
|
|
type iconSet struct {
|
|
names map[string]bool
|
|
sprite string
|
|
}
|
|
|
|
func loadIcons(dirs []string) iconSet {
|
|
set := iconSet{names: map[string]bool{}}
|
|
body := map[string]string{}
|
|
for _, d := range dirs {
|
|
files, _ := filepath.Glob(filepath.Join(d, "*.svg"))
|
|
for _, f := range files {
|
|
data, err := os.ReadFile(f)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
m := svgOpen.FindStringSubmatch(string(data))
|
|
if m == nil {
|
|
continue
|
|
}
|
|
name := strings.TrimSuffix(filepath.Base(f), ".svg")
|
|
inner := svgWhite.ReplaceAllString(m[2], `$1="currentColor"`)
|
|
body[name] = `<symbol id="` + name + `" viewBox="` + m[1] + `">` + inner + "</symbol>"
|
|
}
|
|
}
|
|
keys := make([]string, 0, len(body))
|
|
for k := range body {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Strings(keys)
|
|
var b strings.Builder
|
|
b.WriteString(`<svg xmlns="http://www.w3.org/2000/svg">`)
|
|
for _, k := range keys {
|
|
set.names[k] = true
|
|
b.WriteString(body[k])
|
|
}
|
|
b.WriteString("</svg>\n")
|
|
set.sprite = b.String()
|
|
return set
|
|
}
|
|
|
|
func (b *builder) icon(root, name, cls string) string {
|
|
if name == "" {
|
|
return ""
|
|
}
|
|
if !b.icons.names[name] {
|
|
if len(b.icons.names) > 0 && !b.missing[name] {
|
|
b.missing[name] = true
|
|
b.report.Broken = append(b.report.Broken, "icon "+name+" does not exist")
|
|
}
|
|
return ""
|
|
}
|
|
if cls == "" {
|
|
cls = "ic"
|
|
} else {
|
|
cls = "ic " + cls
|
|
}
|
|
return `<svg width="16" height="16" class="` + cls + `" aria-hidden="true"><use href="` + root + `assets/icons.svg?v=` + b.assetV + `#` + name + `"/></svg>`
|
|
}
|
|
|
|
func (b *builder) entryIcon(e *Entry) string {
|
|
if e.Icon != "" {
|
|
return e.Icon
|
|
}
|
|
if e.Kind == KindField && e.Field != nil {
|
|
return fieldIcon(e.Title, e.Field.Type)
|
|
}
|
|
if e.Kind == KindModule && strings.HasPrefix(e.ID, "aego/") {
|
|
return "code.block"
|
|
}
|
|
return kindIcons[e.Kind]
|
|
}
|
|
|
|
func fieldIcon(name, typ string) string {
|
|
n := strings.ToLower(name)
|
|
t := strings.ToLower(typ)
|
|
switch {
|
|
case strings.Contains(n, "gravity"):
|
|
return "vec.gravity"
|
|
case strings.Contains(n, "angular"):
|
|
return "vec.angular"
|
|
case strings.Contains(n, "velocity"), strings.Contains(n, "speed"):
|
|
return "vec.velocity"
|
|
case strings.Contains(n, "force"), strings.Contains(n, "impulse"):
|
|
return "vec.force"
|
|
case strings.Contains(n, "rotation"), t == "quat":
|
|
return "tool.rotate"
|
|
case strings.Contains(n, "scale"), strings.Contains(n, "size"):
|
|
return "tool.scale"
|
|
case strings.Contains(n, "position"), strings.Contains(n, "offset"), strings.Contains(n, "anchor"):
|
|
return "tool.move"
|
|
case strings.Contains(t, "texture"), strings.Contains(n, "sprite"):
|
|
return "file.texture"
|
|
case strings.Contains(t, "mesh"):
|
|
return "file.mesh"
|
|
case strings.Contains(t, "prefab"):
|
|
return "file.prefab"
|
|
case strings.Contains(t, "scene"):
|
|
return "file.scene"
|
|
case strings.HasPrefix(t, "noderef"), strings.Contains(t, "node"):
|
|
return "node.empty"
|
|
case t == "bool":
|
|
return "ui.check"
|
|
case strings.Contains(n, "layer"), strings.Contains(n, "mask"):
|
|
return "view.overlays"
|
|
case strings.Contains(n, "fixed"):
|
|
return "vec.fixed"
|
|
}
|
|
return "code.hints"
|
|
}
|