|
@@ -0,0 +1,85 @@
|
|
|
+package stub
|
|
|
+
|
|
|
+/*
|
|
|
+ простая реализация модели документа
|
|
|
+*/
|
|
|
+
|
|
|
+import (
|
|
|
+ "odf/model"
|
|
|
+ "ypk/assert"
|
|
|
+)
|
|
|
+
|
|
|
+type sn struct {
|
|
|
+ name model.LeafName
|
|
|
+ attr map[model.AttrName]model.Attribute
|
|
|
+ children []model.Leaf
|
|
|
+}
|
|
|
+
|
|
|
+func (n *sn) Attr(name model.AttrName, val ...model.Attribute) model.Attribute {
|
|
|
+ assert.For(len(val) <= 1, 20, "only one attribute accepted")
|
|
|
+ assert.For(name != "", 21)
|
|
|
+ if len(val) == 1 {
|
|
|
+ n.attr[name] = val[0]
|
|
|
+ }
|
|
|
+ return n.attr[name]
|
|
|
+}
|
|
|
+
|
|
|
+func (n *sn) Child(i int) model.Leaf {
|
|
|
+ assert.For(i < len(n.children), 20)
|
|
|
+ return n.children[i]
|
|
|
+}
|
|
|
+
|
|
|
+func (n *sn) IndexOf(l model.Leaf) (ret int) {
|
|
|
+ ret = -1
|
|
|
+ for i := 0; i < len(n.children) && ret == -1; i++ {
|
|
|
+ if l == n.children[i] {
|
|
|
+ ret = i
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (n *sn) NofChild() int {
|
|
|
+ return len(n.children)
|
|
|
+}
|
|
|
+
|
|
|
+func (n *sn) Name() model.LeafName {
|
|
|
+ return n.name
|
|
|
+}
|
|
|
+
|
|
|
+func (n *sn) init() {
|
|
|
+ n.attr = make(map[model.AttrName]model.Attribute)
|
|
|
+ n.children = make([]model.Leaf, 0)
|
|
|
+}
|
|
|
+
|
|
|
+type sm struct {
|
|
|
+ root *sn
|
|
|
+}
|
|
|
+
|
|
|
+func (m *sm) NewReader(...model.Reader) model.Reader {
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (m *sm) NewWriter(old ...model.Writer) model.Writer {
|
|
|
+ w := &sw{base: m}
|
|
|
+ if len(old) == 1 {
|
|
|
+ w.InitFrom(old[0])
|
|
|
+ }
|
|
|
+ return w
|
|
|
+}
|
|
|
+
|
|
|
+func (m *sm) Root() model.Node {
|
|
|
+ return m.root
|
|
|
+}
|
|
|
+
|
|
|
+func nf() func() model.Model {
|
|
|
+ return func() model.Model {
|
|
|
+ r := &sn{}
|
|
|
+ r.init()
|
|
|
+ return &sm{root: r}
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func init() {
|
|
|
+ model.ModelFactory = nf()
|
|
|
+}
|