Skip to content

Commit a967792

Browse files
committed
save
1 parent 1fb7759 commit a967792

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

d2js/js.go

+57
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ import (
1111
"oss.terrastruct.com/d2/d2ast"
1212
"oss.terrastruct.com/d2/d2compiler"
1313
"oss.terrastruct.com/d2/d2format"
14+
"oss.terrastruct.com/d2/d2graph"
1415
"oss.terrastruct.com/d2/d2oracle"
1516
"oss.terrastruct.com/d2/d2parser"
1617
"oss.terrastruct.com/d2/d2target"
1718
"oss.terrastruct.com/d2/lib/urlenc"
1819
)
1920

2021
func main() {
22+
js.Global().Set("d2GetObjOrder", js.FuncOf(jsGetObjOrder))
2123
js.Global().Set("d2GetRefRanges", js.FuncOf(jsGetRefRanges))
2224
js.Global().Set("d2Compile", js.FuncOf(jsCompile))
2325
js.Global().Set("d2Parse", js.FuncOf(jsParse))
@@ -26,6 +28,61 @@ func main() {
2628
select {}
2729
}
2830

31+
type jsObjOrder struct {
32+
Order []string `json:"order"`
33+
Error string `json:"error"`
34+
}
35+
36+
func jsGetObjOrder(this js.Value, args []js.Value) interface{} {
37+
dsl := args[0].String()
38+
39+
g, err := d2compiler.Compile("", strings.NewReader(dsl), &d2compiler.CompileOptions{
40+
UTF16: true,
41+
})
42+
if err != nil {
43+
ret := jsObjOrder{Error: err.Error()}
44+
str, _ := json.Marshal(ret)
45+
return string(str)
46+
}
47+
48+
var order []string
49+
50+
queue := []string{""}
51+
for len(queue) > 0 {
52+
curr := queue[0]
53+
queue = queue[1:]
54+
var obj *d2graph.Object
55+
if curr == "" {
56+
obj = g.Root
57+
} else {
58+
mk, err := d2parser.ParseMapKey(curr)
59+
if err != nil {
60+
ret := jsObjOrder{Error: err.Error()}
61+
str, _ := json.Marshal(ret)
62+
return string(str)
63+
}
64+
var ok bool
65+
obj, ok = g.Root.HasChild(d2graph.Key(mk.Key))
66+
if !ok {
67+
ret := jsObjOrder{Error: "not found"}
68+
str, _ := json.Marshal(ret)
69+
return string(str)
70+
}
71+
}
72+
order = append(order, obj.AbsID())
73+
for _, ch := range obj.ChildrenArray {
74+
queue = append(queue, ch.AbsID())
75+
}
76+
}
77+
78+
resp := jsObjOrder{
79+
Order: order,
80+
}
81+
82+
str, _ := json.Marshal(resp)
83+
return string(str)
84+
}
85+
2986
type jsRefRanges struct {
3087
Ranges []d2ast.Range `json:"ranges"`
3188
ParseError string `json:"parseError"`

0 commit comments

Comments
 (0)