func renderHtml(o otm.Object, log *testing.T) { buf := bytes.NewBufferString("<!DOCTYPE HTML>") e := xml.NewEncoder(buf) var obj func(otm.Object) obj = func(o otm.Object) { clazz := o.InstanceOf().Qualident() if clazz.Template == "html" { start := xml.StartElement{} start.Name.Local = clazz.Class if id := o.Qualident().Identifier; id != "" { attr := xml.Attr{} attr.Name.Local = "id" attr.Value = id start.Attr = append(start.Attr, attr) } e.EncodeToken(start) for _x := range o.Children() { switch x := _x.(type) { case otm.Object: obj(x) case string: e.EncodeToken(xml.CharData([]byte(x))) default: halt.As(100, reflect.TypeOf(x)) } } e.EncodeToken(start.End()) } } for x := range o.ChildrenObjects() { if x.InstanceOf().Qualident().Template == "html" && x.InstanceOf().Qualident().Class == "html" { obj(x) } } e.Flush() log.Log(buf.String()) }
func resolve(t *ForeignTemplate, o otm.Object) (err error) { assert.For(!fn.IsNil(o), 20) var processList []pfunc var upd func(t *ForeignTemplate, o otm.Object) upd = func(t *ForeignTemplate, o otm.Object) { if clazz, ok := t.Classes[o.Qualident().Class]; ok && (o.Qualident().Template == t.TemplateName || o.Qualident().Template == "") { inst := clazz.copyOf() o.InstanceOf(inst) if fn := inst.apply(o); fn != nil { processList = append(processList, fn) } //log.Println("class updated for", o.Qualident(), " set ", clazz.Qualident()) } for x := range o.ChildrenObjects() { upd(t, x) } } upd(t, o) for tmp := processList; len(tmp) > 0; { var _tmp []pfunc for _, f := range tmp { var p pfunc if p, err = f(); err == nil && p != nil { _tmp = append(_tmp, p) } else if err != nil { _tmp = nil break } } tmp = _tmp } return }