75 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package nomino
 | |
| 
 | |
| import (
 | |
| 	"crypto"
 | |
| 	"encoding/hex"
 | |
| 	"errors"
 | |
| 	"hash"
 | |
| 
 | |
| 	"github.com/gosimple/slug"
 | |
| )
 | |
| 
 | |
| // ErrMissingOriginal is the error returned by Slug if there is no filename.
 | |
| var ErrMissingOriginal = errors.New("missing original filename")
 | |
| 
 | |
| func getOriginal(c *Config) (string, error) {
 | |
| 	if c.original == "" {
 | |
| 		return "", ErrMissingOriginal
 | |
| 	}
 | |
| 	name := c.original
 | |
| 	c.original = ""
 | |
| 	return name, nil
 | |
| }
 | |
| 
 | |
| // Slug generates a name from the original filename.
 | |
| // When this is used, the original filename will be removed from the final filename.
 | |
| // If a language is specified, that may affect the resulting slug.
 | |
| func Slug(lang ...string) Generator {
 | |
| 	ret := slug.Make
 | |
| 	if len(lang) > 0 {
 | |
| 		ret = func(in string) string {
 | |
| 			return slug.MakeLang(in, lang[0])
 | |
| 		}
 | |
| 	}
 | |
| 	return func(c *Config) (string, error) {
 | |
| 		name, err := getOriginal(c)
 | |
| 		return ret(name), err
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // HashingFunc is a function that generates a hash.Hash.
 | |
| type HashingFunc func() hash.Hash
 | |
| 
 | |
| // New allows HashingFunc to be used as a Hasher.
 | |
| func (hf HashingFunc) New() hash.Hash {
 | |
| 	return hf()
 | |
| }
 | |
| 
 | |
| // Hasher is a type returns a hash.Hash.
 | |
| // All crypto.Hash may be used.
 | |
| type Hasher interface {
 | |
| 	New() hash.Hash
 | |
| }
 | |
| 
 | |
| // ErrInvalidHash is returned by the Hash generator when an invalid HashType is passed.
 | |
| var ErrInvalidHash = errors.New("invalid hash type")
 | |
| 
 | |
| // Hash generates a name from a hash of the filename.
 | |
| // When this is used, the original filename will be removed from the final filename.
 | |
| func Hash(h Hasher) Generator {
 | |
| 	if h == nil {
 | |
| 		h = crypto.MD5
 | |
| 	}
 | |
| 	return func(c *Config) (string, error) {
 | |
| 		if h == crypto.MD5SHA1 {
 | |
| 			return "", ErrInvalidHash
 | |
| 		}
 | |
| 		name, err := getOriginal(c)
 | |
| 		if err != nil {
 | |
| 			return "", err
 | |
| 		}
 | |
| 		hs := h.New()
 | |
| 		hs.Write([]byte(name))
 | |
| 		return hex.EncodeToString(hs.Sum(nil)), nil
 | |
| 	}
 | |
| }
 |