package asciibox import ( fl "github.com/mbndr/figlet4go" "github.com/sqshq/sampler/asset" "github.com/sqshq/sampler/data" ui "github.com/sqshq/termui" "image" ) type AsciiBox struct { ui.Block text string ascii string style ui.Style render *fl.AsciiRender options *fl.RenderOptions } type AsciiFont string const ( AsciiFontFlat AsciiFont = "flat" AsciiFont3D AsciiFont = "3d" ) const asciiFontExtension = ".flf" func NewAsciiBox(title string, font AsciiFont, color ui.Color) *AsciiBox { block := *ui.NewBlock() block.Title = title options := fl.NewRenderOptions() options.FontName = string(font) fontStr, err := asset.Asset(options.FontName + asciiFontExtension) if err != nil { panic("Can't load the font: " + err.Error()) } render := fl.NewAsciiRender() _ = render.LoadBindataFont(fontStr, options.FontName) return &AsciiBox{ Block: block, style: ui.NewStyle(color), render: render, options: options, } } func (a *AsciiBox) ConsumeSample(sample data.Sample) { a.text = sample.Value a.ascii, _ = a.render.RenderOpts(sample.Value, a.options) } func (a *AsciiBox) Draw(buffer *ui.Buffer) { buffer.Fill(ui.NewCell(' ', ui.NewStyle(ui.ColorBlack)), a.GetRect()) a.Block.Draw(buffer) point := a.Inner.Min cells := ui.ParseText(a.ascii, a.style) for i := 0; i < len(cells) && point.Y < a.Inner.Max.Y; i++ { if cells[i].Rune == '\n' { point = image.Pt(a.Inner.Min.X, point.Y+1) } else if point.In(a.Inner) { buffer.SetCell(cells[i], point) point = point.Add(image.Pt(1, 0)) } } }