func newIn(ctx context.Context, source, query string, verbose bool) (in, error) {
	in := in{source: source}
	r, err := inout.NewInOut(ctx,
		inout.Source(source),
		inout.Query(query),
		inout.Timeout(0),
		inout.Verbose(verbose))
	if err != nil {
		return in, err
	}
	in.reader = &r
	if strings.HasPrefix(source, "http://") || strings.HasPrefix(source, "https://") || query != "" {
		in.ContentType = HTML
	} else if strings.ToLower(filepath.Ext(source)) == ".md" {
		in.ContentType = Markdown
	}
	return in, err
}
newIn initializes an input stream from STDIN, file or web page.

source - the filename or web page source, reads from STDIN if source is empty.
Panics on errors.
package tagify
import (
	"context"
	"path/filepath"
	"strings"
	"github.com/zoomio/inout"
)
type in struct {
	source string
	reader *inout.Reader
	ContentType
}