report.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "github.com/kpmy/golorem"
  6. "github.com/kpmy/odf/generators"
  7. "github.com/kpmy/odf/mappers"
  8. "github.com/kpmy/odf/mappers/attr"
  9. "github.com/kpmy/odf/model"
  10. "github.com/kpmy/odf/xmlns"
  11. "github.com/kpmy/odf/xmlns/fo"
  12. "image/color"
  13. "io"
  14. "math/rand"
  15. "strconv"
  16. "strings"
  17. "time"
  18. )
  19. func r(suffix string, fm *mappers.Formatter) {
  20. { //first page
  21. fm.WriteString("\n\n\n\n\n\n\n\n\n\n")
  22. fm.SetAttr(new(attr.TextAttributes).Size(32).Bold()).SetAttr(new(attr.ParagraphAttributes).AlignCenter())
  23. fm.WritePara("Periodic report")
  24. fm.SetAttr(nil).SetAttr(new(attr.TextAttributes).Italic())
  25. fm.WritePara("Report:\t")
  26. fm.SetAttr(new(attr.TextAttributes).Bold())
  27. fm.WriteString(suffix + "\n")
  28. fm.SetAttr(new(attr.TextAttributes).Italic())
  29. fm.WriteString("Date:\t")
  30. fm.SetAttr(new(attr.TextAttributes).Bold())
  31. fm.WriteString(time.Now().String())
  32. fm.SetAttr(new(attr.ParagraphAttributes).PageBreak())
  33. fm.WritePara("")
  34. fm.SetAttr(nil)
  35. }
  36. para := func() {
  37. fm.SetAttr(new(attr.TextAttributes).Bold().Size(18))
  38. fm.WritePara(strings.ToUpper(lorem.Word(5, 15)))
  39. fm.WriteLn()
  40. fm.SetAttr(nil)
  41. para := lorem.Paragraph(5, 10)
  42. fm.WritePara("\t" + para + "\n\n")
  43. }
  44. for i := 0; i < 5; i++ {
  45. para()
  46. }
  47. { //huge table
  48. fm.SetAttr(new(attr.TextAttributes).Bold().Size(18))
  49. fm.WritePara("TABLE 50x5")
  50. fm.SetAttr(nil)
  51. fm.SetAttr(new(attr.TableCellAttributes).Border(attr.Border{Width: 0.01, Color: color.Black, Style: fo.Solid}))
  52. tm := &mappers.TableMapper{}
  53. tm.ConnectTo(fm)
  54. tm.Write("test", 50+1, 5) //50+header row
  55. tt := tm.List["test"]
  56. tm.Span(tt, 0, 0, 1, 5)
  57. fm.SetAttr(new(attr.ParagraphAttributes).AlignCenter()).SetAttr(new(attr.TextAttributes).Bold())
  58. tm.Pos(tt, 0, 0).WriteString("Header")
  59. fm.SetAttr(nil)
  60. for i := 1; i < 51; i++ {
  61. for j := 0; j < 5; j++ {
  62. if j == 0 {
  63. fm.SetAttr(new(attr.TextAttributes).Bold())
  64. } else {
  65. fm.SetAttr(nil)
  66. }
  67. tm.Pos(tt, i, j).WriteString(strconv.Itoa(i * j))
  68. }
  69. }
  70. }
  71. { //appendix
  72. fm.RegisterFont("Courier New", "Courier New") // may not work in Linux/MacOS
  73. fm.SetAttr(nil).SetAttr(new(attr.ParagraphAttributes).PageBreak())
  74. fm.SetAttr(new(attr.TextAttributes).Size(18).Bold())
  75. fm.WritePara("Appendix A.\nListing of report.go")
  76. fm.WriteLn()
  77. fm.SetAttr(nil).SetAttr(new(attr.TextAttributes).FontFace("Courier New").Size(6))
  78. fm.WritePara("File not found because no IO allowed in browser.")
  79. }
  80. }
  81. func report() (io.Reader, error) {
  82. src := rand.New(rand.NewSource(time.Now().UnixNano() + rand.Int63()))
  83. suffix := strconv.Itoa(src.Int())
  84. output := bytes.NewBuffer(nil)
  85. m := model.ModelFactory()
  86. fm := &mappers.Formatter{}
  87. fm.ConnectTo(m)
  88. fm.MimeType = xmlns.MimeText
  89. fm.Init()
  90. embed := make(map[string]generators.Embeddable)
  91. {
  92. const ImagePng xmlns.Mime = "image/png"
  93. if data, err := base64.StdEncoding.DecodeString(imgData); err == nil {
  94. img := bytes.NewBuffer(data)
  95. d := mappers.NewDraw(img, ImagePng)
  96. fm.SetAttr(new(attr.ParagraphAttributes).AlignRight())
  97. url := d.WriteTo(fm, "Two Gophers", 4.0, 4.0) //magic? real size of `.png` in cm
  98. embed[url] = d
  99. }
  100. }
  101. fm.SetAttr(new(attr.TextAttributes).Bold())
  102. fm.WriteString("\nSo Strange inc.")
  103. fm.WriteString("\n" + lorem.Email())
  104. fm.WriteString("\n" + lorem.Url())
  105. fm.SetAttr(nil)
  106. r(suffix, fm)
  107. generators.GeneratePackage(m, embed, output, fm.MimeType)
  108. return output, nil
  109. }
  110. var imgData = `iVBORw0KGgoAAAANSUhEUgAAAaQAAAGkCAYAAAB+TFE1AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
  111. WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wULEQENShOIkAAABSxJREFUeNrt18EJAjEURVEj01E6
  112. STuzTjvpJDU914IbEfUr51QwvPlwSUtyAYBvu5oAAEECAEECQJAAQJAAECQAECQABAkABAkAQQIA
  113. QQJAkABAkAAQJAAQJAAECQAECQBBAgBBAkCQAECQABAkABAkAAQJAAQJAEECAEECQJAAQJAAECQA
  114. ECQABAkABAkABAmAIg4T1Df2jBXgdaufzQpeSAAgSAAIEgAIEgCCBACCBIAgAYAgASBIACBIAAgS
  115. AAgSAIIEAIIEgCABgCABIEgAIEgACBIACBIAggQAggSAIAGAIAEgSAAgSAAgSAAIEgAIEgCCBACC
  116. BIAgAYAgASBIACBIAAgSAAgSAIIEAIIEgCABgCABIEgAIEgACBIACBIAggQAggSAIAGAIAEgSAAg
  117. SAAIEgAIEgCCBACCBIAgAYAgASBIACBIACBIAAgSAAgSAIIEAIIEgCABgCABIEgAIEgACBIAPKEl
  118. KfMxY8/4JQCftfrZvJAAQJAAECQAECQABAkABAkAQQIAQQJAkABAkAAQJAAQJAAECQAECQBBAgBB
  119. AkCQAECQABAkABAkAAQJAAQJAEECAEECQJAAQJAAECQAECQABAkABAkAQQIAQQIAQQJAkABAkAAQ
  120. JAAQJAAECQAECQBBAgBBAkCQAECQABAkABAkAAQJAAQJAEECAEECQJAAQJAAECQAECQABAkABAkA
  121. QQIAQQJAkABAkAAQJAAQJAAECQAECQBBAgBBAgBBAkCQAECQABAkABAkAOo6TPAbVj+bFe6NPWMF
  122. 9+JevJAAQJAAECQAECQABAkABAkAQQIAQQJAkABAkAAQJAAQJAAECQAECQAECQBBAgBBAkCQAECQ
  123. ABAkABAkAAQJAAQJAEECAEECQJAAQJAAECQAECQABAkABAkAQQIAQQJAkABAkAAQJAAQJAAECQAE
  124. CQBBAgBBAkCQAECQABAkABAkAAQJAAQJAAQJAEECAEECQJAAQJAAECQAECQABAkABAkAQQIAQQJA
  125. kABAkAAQJAAQJAAECQAECQBBAgBBAkCQAECQABAkAHijlsQKAHghAYAgASBIACBIAAgSAAgSAIIE
  126. AIIEgCABgCABIEgAIEgACBIACBIAggQAggSAIAGAIAEgSAAgSAAIEgAIEgCCBACCBIAgAYAgASBI
  127. ACBIAAgSAAgSAIIEAIIEgCCZAABBAgBBAkCQAECQABAkABAkAAQJAAQJAEECAEECQJAAQJAAECQA
  128. ECQABAkABAkAQQIAQQJAkABAkAAQJAAQJAAECQAECQBBAgBBAkCQAECQABAkABAkAAQJAAQJAAQJ
  129. AEECAEECoJij0seMPeOXPLb62azgXtyLe/nne/FCAqAEQQJAkABAkAAQJAAQJAAECQAECQBBAgBB
  130. AkCQAECQABAkABAkAAQJAAQJAEECAEECQJAAQJAAECQAECQABAkABAkAQQIAQQJAkABAkAAQJAAQ
  131. JAAECQAECQBBAgBBAgBBAkCQAECQABAkABAkAAQJAAQJAEECAEECQJAAQJAAECQAECQABAkABAkA
  132. QQIAQQJAkABAkAAQJAAQJAAECQAECQBBAgBBAkCQAECQABAkABAkAAQJAAQJAEECAEECAEECQJAA
  133. QJAAKKglsQIAXkgAIEgACBIACBIAggQAggSAIAGAIAEgSAAgSAAIEgAIEgCCBACCBIAgAYAgASBI
  134. ACBIAAgSAAgSAIIEAIIEgCABgCABIEgAIEgACBIACBIAggQAggSAIAGAIAEgSCYAoIIb4ogrP3v0
  135. vosAAAAASUVORK5CYII=`