64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
| // Package browser provides helpers to open files, readers, and urls in a browser window.
 | |
| //
 | |
| // The choice of which browser is started is entirely client dependant.
 | |
| package browser
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"io/ioutil"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"path/filepath"
 | |
| )
 | |
| 
 | |
| // Stdout is the io.Writer to which executed commands write standard output.
 | |
| var Stdout io.Writer = os.Stdout
 | |
| 
 | |
| // Stderr is the io.Writer to which executed commands write standard error.
 | |
| var Stderr io.Writer = os.Stderr
 | |
| 
 | |
| // OpenFile opens new browser window for the file path.
 | |
| func OpenFile(path string) error {
 | |
| 	path, err := filepath.Abs(path)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return OpenURL("file://" + path)
 | |
| }
 | |
| 
 | |
| // OpenReader consumes the contents of r and presents the
 | |
| // results in a new browser window.
 | |
| func OpenReader(r io.Reader) error {
 | |
| 	f, err := ioutil.TempFile("", "browser")
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("browser: could not create temporary file: %v", err)
 | |
| 	}
 | |
| 	if _, err := io.Copy(f, r); err != nil {
 | |
| 		f.Close()
 | |
| 		return fmt.Errorf("browser: caching temporary file failed: %v", err)
 | |
| 	}
 | |
| 	if err := f.Close(); err != nil {
 | |
| 		return fmt.Errorf("browser: caching temporary file failed: %v", err)
 | |
| 	}
 | |
| 	oldname := f.Name()
 | |
| 	newname := oldname + ".html"
 | |
| 	if err := os.Rename(oldname, newname); err != nil {
 | |
| 		return fmt.Errorf("browser: renaming temporary file failed: %v", err)
 | |
| 	}
 | |
| 	return OpenFile(newname)
 | |
| }
 | |
| 
 | |
| // OpenURL opens a new browser window pointing to url.
 | |
| func OpenURL(url string) error {
 | |
| 	return openBrowser(url)
 | |
| }
 | |
| 
 | |
| func runCmd(prog string, args ...string) error {
 | |
| 	cmd := exec.Command(prog, args...)
 | |
| 	cmd.Stdout = Stdout
 | |
| 	cmd.Stderr = Stderr
 | |
| 	setFlags(cmd)
 | |
| 	return cmd.Run()
 | |
| }
 |