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  }