github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/openimage/open-image.go (about) 1 package openimage 2 3 import ( 4 "errors" 5 "io" 6 "os" 7 8 "github.com/eliukblau/pixterm/pkg/ansimage" 9 "github.com/lmorg/murex/lang" 10 "github.com/lmorg/murex/lang/types" 11 "github.com/lmorg/murex/utils/readline" 12 ) 13 14 func init() { 15 lang.SetMime("image", "image/jpeg", "image/gif", "image/png", "image/bmp", "image/tiff", "image/webp") 16 lang.SetFileExtensions("image", "jpeg", "jpg", "gif", "png", "bmp", "tiff", "webp") 17 lang.DefineMethod("open-image", cmdOpenImage, "image", types.Null) 18 } 19 20 // color implements the Go color.Color interface. 21 type color struct{} 22 23 // RGBA is required for the Go color.Color interface. 24 func (col color) RGBA() (uint32, uint32, uint32, uint32) { 25 return 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF 26 } 27 28 func cmdOpenImage(p *lang.Process) error { 29 var reader io.Reader 30 31 switch { 32 case !p.Stdout.IsTTY(): 33 return errors.New("this function is expecting to output to the terminal") 34 35 case p.IsMethod: 36 reader = p.Stdin 37 38 default: 39 name, err := p.Parameters.String(0) 40 if err != nil { 41 return err 42 } 43 reader, err = os.Open(name) 44 if err != nil { 45 return err 46 } 47 } 48 49 tx, ty, err := readline.GetSize(int(os.Stdout.Fd())) 50 if err != nil { 51 return err 52 } 53 54 img, err := ansimage.NewScaledFromReader(reader, 2*(ty-1), tx, color{}, ansimage.ScaleModeFit, ansimage.NoDithering) 55 if err != nil { 56 return err 57 } 58 59 _, err = p.Stdout.Write([]byte(img.Render())) 60 return err 61 }