node.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package dom
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "github.com/kpmy/ypk/assert"
  6. )
  7. type (
  8. Leaf interface {
  9. Parent(...Node) Node
  10. }
  11. Text interface {
  12. Leaf
  13. Data() string
  14. }
  15. Node interface {
  16. Leaf
  17. AppendChild(Leaf)
  18. Children() []Leaf
  19. }
  20. Element interface {
  21. Attr(name string, set ...string) (get string)
  22. AttrAsMap() map[string]string
  23. Node
  24. Name() string
  25. }
  26. elem struct {
  27. a map[string]string
  28. l []Leaf
  29. n string
  30. p Node
  31. }
  32. txt struct {
  33. d string
  34. p Node
  35. }
  36. )
  37. func (e *elem) String() string {
  38. return fmt.Sprint("<", e.n, " ", e.a, ">", e.l, "</", e.n, ">")
  39. }
  40. func (e *elem) AppendChild(l Leaf) {
  41. e.l = append(e.l, l)
  42. l.Parent(e)
  43. }
  44. func (e *elem) Attr(name string, set ...string) (get string) {
  45. assert.For(name != "", 20)
  46. if e.a == nil {
  47. e.a = make(map[string]string)
  48. }
  49. if len(set) > 0 {
  50. e.a[name] = set[0]
  51. }
  52. return e.a[name]
  53. }
  54. func (e *elem) Name() string { return e.n }
  55. func (e *elem) AttrAsMap() map[string]string { return e.a }
  56. func (e *elem) Children() []Leaf { return e.l }
  57. func (e *elem) Parent(p ...Node) Node {
  58. if len(p) > 0 {
  59. e.p = p[0]
  60. }
  61. return e.p
  62. }
  63. func Elem(name string) Element {
  64. return &elem{n: name}
  65. }
  66. func (t *txt) String() string { return t.d }
  67. func (t *txt) Data() string { return t.d }
  68. func (t *txt) Parent(p ...Node) Node {
  69. if len(p) > 0 {
  70. t.p = p[0]
  71. }
  72. return t.p
  73. }
  74. func Txt(data string) Text {
  75. return &txt{d: data}
  76. }
  77. func ThisName(n xml.Name) string {
  78. if n.Space != "" {
  79. return n.Space + ":" + n.Local
  80. } else {
  81. return n.Local
  82. }
  83. }