...
1 package d2ir
2
3 import (
4 "strings"
5
6 "oss.terrastruct.com/d2/d2ast"
7 "oss.terrastruct.com/d2/d2graph"
8 )
9
10 func (m *Map) multiGlob(pattern []string) ([]*Field, bool) {
11 var fa []*Field
12 if d2ast.IsDoubleGlob(pattern) {
13 m._doubleGlob(&fa)
14 return fa, true
15 }
16 if d2ast.IsTripleGlob(pattern) {
17 m._tripleGlob(&fa)
18 return fa, true
19 }
20 return nil, false
21 }
22
23 func (m *Map) _doubleGlob(fa *[]*Field) {
24 for _, f := range m.Fields {
25 if _, ok := d2graph.ReservedKeywords[f.Name]; ok {
26 if f.Name == "layers" {
27 continue
28 }
29 if _, ok := d2graph.BoardKeywords[f.Name]; !ok {
30 continue
31 }
32
33 if f.Map() != nil {
34 f.Map()._tripleGlob(fa)
35 }
36 continue
37 }
38 if NodeBoardKind(f) == "" {
39 *fa = append(*fa, f)
40 }
41 if f.Map() != nil {
42 f.Map()._doubleGlob(fa)
43 }
44 }
45 }
46
47 func (m *Map) _tripleGlob(fa *[]*Field) {
48 for _, f := range m.Fields {
49 if _, ok := d2graph.ReservedKeywords[f.Name]; ok {
50 if _, ok := d2graph.BoardKeywords[f.Name]; !ok {
51 continue
52 }
53
54 if f.Map() != nil {
55 f.Map()._tripleGlob(fa)
56 }
57 continue
58 }
59 if NodeBoardKind(f) == "" {
60 *fa = append(*fa, f)
61 }
62 if f.Map() != nil {
63 f.Map()._tripleGlob(fa)
64 }
65 }
66 }
67
68 func matchPattern(s string, pattern []string) bool {
69 if len(pattern) == 0 {
70 return true
71 }
72 if _, ok := d2graph.ReservedKeywords[s]; ok {
73 return false
74 }
75
76 for i := 0; i < len(pattern); i++ {
77 if pattern[i] == "*" {
78
79 if i != len(pattern)-1 {
80 j := strings.Index(strings.ToLower(s), strings.ToLower(pattern[i+1]))
81 if j == -1 {
82 return false
83 }
84 s = s[j+len(pattern[i+1]):]
85 i++
86 }
87 } else {
88 if !strings.HasPrefix(strings.ToLower(s), strings.ToLower(pattern[i])) {
89 return false
90 }
91 s = s[len(pattern[i]):]
92 }
93 }
94 return true
95 }
96
View as plain text