simple_tree.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //Package stub is an implementation of document model, nodes, attributes and riders, it's a lightweight analog of DOM
  2. //There is no need to create separate type for each ODF document node, because most of them are defined only by it's name, that's why we build a simle tree model where only root nodel of document are special, because they are translated into files of document-package. But they still support Node interface and may be used in other implementations as regular nodes
  3. package stub
  4. /*
  5. простая реализация модели документа
  6. */
  7. import (
  8. "encoding/xml"
  9. "github.com/kpmy/odf/model"
  10. "github.com/kpmy/ypk/assert"
  11. )
  12. type sn struct {
  13. name model.LeafName
  14. attr map[model.AttrName]model.Attribute
  15. children []model.Leaf
  16. parent model.Node
  17. }
  18. func (n *sn) Attr(name model.AttrName, val ...model.Attribute) model.Attribute {
  19. assert.For(len(val) <= 1, 20, "only one attribute accepted")
  20. assert.For(name != "", 21)
  21. if len(val) == 1 {
  22. if val[0] != nil {
  23. n.attr[name] = val[0]
  24. } else {
  25. delete(n.attr, name)
  26. }
  27. }
  28. return n.attr[name]
  29. }
  30. func (n *sn) Child(i int) model.Leaf {
  31. assert.For(i < len(n.children), 20)
  32. return n.children[i]
  33. }
  34. func (n *sn) IndexOf(l model.Leaf) (ret int) {
  35. ret = -1
  36. for i := 0; i < len(n.children) && ret == -1; i++ {
  37. if l == n.children[i] {
  38. ret = i
  39. }
  40. }
  41. return
  42. }
  43. func (n *sn) NofChild() int {
  44. return len(n.children)
  45. }
  46. func (n *sn) Name() model.LeafName {
  47. return n.name
  48. }
  49. func (n *sn) init() {
  50. n.attr = make(map[model.AttrName]model.Attribute)
  51. n.children = make([]model.Leaf, 0)
  52. }
  53. func (n *sn) Parent(p ...model.Node) model.Node {
  54. if len(p) == 1 {
  55. assert.For(n.parent == nil, 20)
  56. n.parent = p[0]
  57. }
  58. return n.parent
  59. }
  60. func (n *sn) MarshalXML(e *xml.Encoder, start xml.StartElement) (err error) {
  61. start.Name.Local = string(n.name)
  62. for k, v := range n.attr {
  63. a, err := v.(xml.MarshalerAttr).MarshalXMLAttr(xml.Name{Local: string(k)})
  64. assert.For(err == nil, 30, err)
  65. start.Attr = append(start.Attr, a)
  66. }
  67. e.EncodeToken(start)
  68. for _, _v := range n.children {
  69. switch v := _v.(type) {
  70. case *text:
  71. err = e.EncodeToken(xml.CharData(v.data))
  72. default:
  73. err = e.EncodeElement(v, xml.StartElement{Name: xml.Name{Local: string(v.Name())}})
  74. }
  75. assert.For(err == nil, 30, err)
  76. }
  77. err = e.EncodeToken(start.End())
  78. assert.For(err == nil, 30, err)
  79. return err
  80. }
  81. type sm struct {
  82. root *sn
  83. }
  84. func (m *sm) NewReader(old ...model.Reader) model.Reader {
  85. r := &sr{base: m, eol: true}
  86. if len(old) == 1 {
  87. r.InitFrom(old[0])
  88. }
  89. return r
  90. }
  91. func (m *sm) NewWriter(old ...model.Writer) model.Writer {
  92. w := &sw{base: m}
  93. if len(old) == 1 {
  94. w.InitFrom(old[0])
  95. }
  96. return w
  97. }
  98. func (m *sm) Root() model.Node {
  99. return m.root
  100. }
  101. func nf() func() model.Model {
  102. return func() model.Model {
  103. r := &sn{}
  104. r.init()
  105. return &sm{root: r}
  106. }
  107. }
  108. func init() {
  109. model.ModelFactory = nf()
  110. }