report.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package main
  2. import (
  3. "bytes"
  4. "github.com/kpmy/golorem"
  5. "github.com/kpmy/odf/generators"
  6. "github.com/kpmy/odf/mappers"
  7. "github.com/kpmy/odf/mappers/attr"
  8. "github.com/kpmy/odf/model"
  9. _ "github.com/kpmy/odf/model/stub" // необходимо
  10. "github.com/kpmy/odf/xmlns"
  11. "github.com/kpmy/odf/xmlns/fo"
  12. "github.com/kpmy/ypk/assert"
  13. "image/color"
  14. "io"
  15. "math/rand"
  16. "os"
  17. "runtime"
  18. "strconv"
  19. "strings"
  20. "sync"
  21. "time"
  22. )
  23. func report(suffix string, fm *mappers.Formatter) {
  24. { //first page
  25. fm.WriteString("\n\n\n\n\n\n\n\n\n\n")
  26. fm.SetAttr(new(attr.TextAttributes).Size(32).Bold()).SetAttr(new(attr.ParagraphAttributes).AlignCenter())
  27. fm.WritePara("Periodic report")
  28. fm.SetAttr(nil).SetAttr(new(attr.TextAttributes).Italic())
  29. fm.WritePara("Report:\t")
  30. fm.SetAttr(new(attr.TextAttributes).Bold())
  31. fm.WriteString(suffix + "\n")
  32. fm.SetAttr(new(attr.TextAttributes).Italic())
  33. fm.WriteString("Date:\t")
  34. fm.SetAttr(new(attr.TextAttributes).Bold())
  35. fm.WriteString(time.Now().String())
  36. fm.SetAttr(new(attr.ParagraphAttributes).PageBreak())
  37. fm.WritePara("")
  38. fm.SetAttr(nil)
  39. }
  40. para := func() {
  41. fm.SetAttr(new(attr.TextAttributes).Bold().Size(18))
  42. fm.WritePara(strings.ToUpper(lorem.Word(5, 15)))
  43. fm.WriteLn()
  44. fm.SetAttr(nil)
  45. para := lorem.Paragraph(5, 10)
  46. fm.WritePara("\t" + para + "\n\n")
  47. }
  48. for i := 0; i < 5; i++ {
  49. para()
  50. }
  51. { //huge table
  52. fm.SetAttr(new(attr.TextAttributes).Bold().Size(18))
  53. fm.WritePara("TABLE 50x5")
  54. fm.SetAttr(nil)
  55. fm.SetAttr(new(attr.TableCellAttributes).Border(attr.Border{Width: 0.01, Color: color.Black, Style: fo.Solid}))
  56. tm := &mappers.TableMapper{}
  57. tm.ConnectTo(fm)
  58. tm.Write("test", 50+1, 5) //50+header row
  59. tt := tm.List["test"]
  60. tm.Span(tt, 0, 0, 1, 5)
  61. fm.SetAttr(new(attr.ParagraphAttributes).AlignCenter()).SetAttr(new(attr.TextAttributes).Bold())
  62. tm.Pos(tt, 0, 0).WriteString("Header")
  63. fm.SetAttr(nil)
  64. for i := 1; i < 51; i++ {
  65. for j := 0; j < 5; j++ {
  66. if j == 0 {
  67. fm.SetAttr(new(attr.TextAttributes).Bold())
  68. } else {
  69. fm.SetAttr(nil)
  70. }
  71. tm.Pos(tt, i, j).WriteString(strconv.Itoa(i * j))
  72. }
  73. }
  74. }
  75. { //appendix
  76. fm.RegisterFont("Courier New", "Courier New") // may not work in Linux/MacOS
  77. fm.SetAttr(nil).SetAttr(new(attr.ParagraphAttributes).PageBreak())
  78. fm.SetAttr(new(attr.TextAttributes).Size(18).Bold())
  79. fm.WritePara("Appendix A.\nListing of report.go")
  80. fm.WriteLn()
  81. fm.SetAttr(nil).SetAttr(new(attr.TextAttributes).FontFace("Courier New").Size(6))
  82. if f, err := os.Open("report.go"); err == nil {
  83. defer f.Close()
  84. buf := bytes.NewBuffer(nil)
  85. io.Copy(buf, f)
  86. fm.WritePara(string(buf.Bytes()))
  87. } else {
  88. fm.WritePara("File not found.")
  89. }
  90. }
  91. }
  92. func do(wg *sync.WaitGroup) {
  93. src := rand.New(rand.NewSource(time.Now().UnixNano() + rand.Int63()))
  94. suffix := strconv.Itoa(src.Int())
  95. output, _ := os.OpenFile("test-"+suffix+".odf", os.O_CREATE|os.O_WRONLY, 0666)
  96. m := model.ModelFactory()
  97. fm := &mappers.Formatter{}
  98. fm.ConnectTo(m)
  99. fm.MimeType = xmlns.MimeText
  100. fm.Init()
  101. embed := make(map[string]generators.Embeddable)
  102. {
  103. const ImagePng xmlns.Mime = "image/png"
  104. img, _ := os.Open("10414104.png")
  105. d := mappers.NewDraw(img, ImagePng)
  106. fm.SetAttr(new(attr.ParagraphAttributes).AlignRight())
  107. url := d.WriteTo(fm, "Two Gophers", 4.0, 4.0) //magic? real size of `.png` in cm
  108. embed[url] = d
  109. }
  110. fm.SetAttr(new(attr.TextAttributes).Bold())
  111. fm.WriteString("\nSo Strange inc.")
  112. fm.WriteString("\n" + lorem.Email())
  113. fm.WriteString("\n" + lorem.Url())
  114. fm.SetAttr(nil)
  115. report(suffix, fm)
  116. generators.GeneratePackage(m, embed, output, fm.MimeType)
  117. assert.For(output.Close() == nil, 20)
  118. wg.Done()
  119. }
  120. func main() {
  121. runtime.GOMAXPROCS(4)
  122. wg := &sync.WaitGroup{}
  123. for i := 0; i < 1; i++ { // concurrency support
  124. go do(wg)
  125. wg.Add(1)
  126. }
  127. wg.Wait()
  128. }