formatter.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package ace
  2. import "bytes"
  3. import "strings"
  4. // File represents a file.
  5. type outputFormatter interface {
  6. OpeningElement(*bytes.Buffer, element) (int, error)
  7. ClosingElement(*bytes.Buffer, element) (int, error)
  8. WritingTextValue(*bytes.Buffer, element) (int, error)
  9. }
  10. type Formatter struct {
  11. indent string
  12. }
  13. func newFormatter(indent string) outputFormatter {
  14. f := &Formatter{
  15. indent: indent,
  16. }
  17. return f
  18. }
  19. func (f *Formatter) OpeningElement(bf *bytes.Buffer, e element) (int, error) {
  20. if e.IsControlElement() {
  21. return 0, nil
  22. }
  23. base := e.Base()
  24. if base.parent != nil && base.parent.IsBlockElement() {
  25. return f.writeIndent(bf, base.ln.indent)
  26. }
  27. return 0, nil
  28. }
  29. func (f *Formatter) ClosingElement(bf *bytes.Buffer, e element) (int, error) {
  30. if e.IsBlockElement() {
  31. return f.writeIndent(bf, e.Base().ln.indent)
  32. }
  33. return 0, nil
  34. }
  35. func (f *Formatter) WritingTextValue(bf *bytes.Buffer, e element) (int, error) {
  36. if e.IsBlockElement() {
  37. return f.writeIndent(bf, e.Base().ln.indent+1)
  38. }
  39. return 0, nil
  40. }
  41. func (f *Formatter) writeIndent(bf *bytes.Buffer, depth int) (int, error) {
  42. indent := "\n" + strings.Repeat(f.indent, depth)
  43. return bf.WriteString(indent)
  44. }