Skip to content

Commit d0911f2

Browse files
committed
fix support for recursive structRefs in localized texts
1 parent d57fede commit d0911f2

File tree

1 file changed

+56
-15
lines changed

1 file changed

+56
-15
lines changed

cdb/Lang.hx

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,35 +62,76 @@ class Lang {
6262
return null;
6363
}
6464

65-
function makeLocField(c:Column, s:SheetData) {
65+
function makeLocField(c:Column, s:SheetData, cache: Map<Column, LocField>) {
6666
switch( c.type ) {
6767
case TString if( c.kind == Localizable ):
6868
return LName(c);
6969
case TList, TProperties, TPolymorph:
70+
if(cache.exists(c))
71+
return cache.get(c);
7072
var ssub = getSub(s,c);
71-
var fl = makeSheetFields(ssub);
72-
if( fl.length == 0 )
73-
return null;
74-
return LSub(c, ssub, fl);
73+
var fl = [];
74+
var r = LSub(c, ssub, fl);
75+
cache.set(c, r);
76+
for(sc in ssub.columns ) {
77+
var f = makeLocField(sc, ssub, cache);
78+
if( f != null )
79+
fl.push(f);
80+
}
81+
return r;
7582
default:
7683
return null;
7784
}
7885
}
7986

8087
function makeSheetFields(s:SheetData) : Array<LocField> {
81-
var fields = [];
88+
var cache : Map<Column, LocField> = new Map();
89+
var fields : Array<LocField> = [];
8290
for( c in s.columns ) {
83-
var f = makeLocField(c, s);
91+
var f = makeLocField(c, s, cache);
8492
if( f != null )
85-
switch( f ) {
86-
case LSub(c, _, fl) if( c.type == TProperties || c.type == TPolymorph ):
87-
for( f in fl )
88-
fields.push(LSingle(c, f));
89-
default:
90-
fields.push(f);
91-
}
93+
fields.push(f);
94+
}
95+
96+
var map = new Map<LocField, Array<LocField>>();
97+
function flattenRec(f:LocField) : Array<LocField> {
98+
if( map.exists(f) )
99+
return map.get(f);
100+
101+
var ret = [];
102+
map.set(f, ret);
103+
104+
switch( f ) {
105+
case LName(_):
106+
ret.push(f);
107+
case LSingle(c, inner):
108+
for( ff in flattenRec(inner) )
109+
ret.push(LSingle(c, ff));
110+
case LSub(c, sub, fl):
111+
if( fl.length == 0 )
112+
return [];
113+
else if( c.type == TProperties || c.type == TPolymorph ) {
114+
for( inner in fl )
115+
for( ff in flattenRec(inner) )
116+
ret.push(LSingle(c, ff));
117+
}
118+
else {
119+
var flat = [];
120+
for( inner in fl )
121+
for( ff in flattenRec(inner) )
122+
flat.push(ff);
123+
ret.push(LSub(c, sub, flat));
124+
}
125+
}
126+
return ret;
127+
}
128+
129+
var ret = [];
130+
for( field in fields ) {
131+
for( f in flattenRec(field) )
132+
ret.push(f);
92133
}
93-
return fields;
134+
return ret;
94135
}
95136

96137
static var NODES : Map<String,String>;

0 commit comments

Comments
 (0)