browser.go raw

   1  // Package browser provides helpers to open files, readers, and urls in a browser window.
   2  //
   3  // The choice of which browser is started is entirely client dependant.
   4  package browser
   5  
   6  import (
   7  	"fmt"
   8  	"io"
   9  	"io/ioutil"
  10  	"os"
  11  	"os/exec"
  12  	"path/filepath"
  13  )
  14  
  15  // Stdout is the io.Writer to which executed commands write standard output.
  16  var Stdout io.Writer = os.Stdout
  17  
  18  // Stderr is the io.Writer to which executed commands write standard error.
  19  var Stderr io.Writer = os.Stderr
  20  
  21  // OpenFile opens new browser window for the file path.
  22  func OpenFile(path string) error {
  23  	path, err := filepath.Abs(path)
  24  	if err != nil {
  25  		return err
  26  	}
  27  	return OpenURL("file://" + path)
  28  }
  29  
  30  // OpenReader consumes the contents of r and presents the
  31  // results in a new browser window.
  32  func OpenReader(r io.Reader) error {
  33  	f, err := ioutil.TempFile("", "browser.*.html")
  34  	if err != nil {
  35  		return fmt.Errorf("browser: could not create temporary file: %v", err)
  36  	}
  37  	if _, err := io.Copy(f, r); err != nil {
  38  		f.Close()
  39  		return fmt.Errorf("browser: caching temporary file failed: %v", err)
  40  	}
  41  	if err := f.Close(); err != nil {
  42  		return fmt.Errorf("browser: caching temporary file failed: %v", err)
  43  	}
  44  	return OpenFile(f.Name())
  45  }
  46  
  47  // OpenURL opens a new browser window pointing to url.
  48  func OpenURL(url string) error {
  49  	return openBrowser(url)
  50  }
  51  
  52  func runCmd(prog string, args ...string) error {
  53  	cmd := exec.Command(prog, args...)
  54  	cmd.Stdout = Stdout
  55  	cmd.Stderr = Stderr
  56  	return cmd.Run()
  57  }
  58