109 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package adjacency
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"log"
 | 
						|
 | 
						|
	"github.com/nbutton23/zxcvbn-go/data"
 | 
						|
)
 | 
						|
 | 
						|
// Graph holds information about different graphs
 | 
						|
type Graph struct {
 | 
						|
	Graph         map[string][]string
 | 
						|
	averageDegree float64
 | 
						|
	Name          string
 | 
						|
}
 | 
						|
 | 
						|
// GraphMap is a map of all graphs
 | 
						|
var GraphMap = make(map[string]Graph)
 | 
						|
 | 
						|
func init() {
 | 
						|
	GraphMap["qwerty"] = BuildQwerty()
 | 
						|
	GraphMap["dvorak"] = BuildDvorak()
 | 
						|
	GraphMap["keypad"] = BuildKeypad()
 | 
						|
	GraphMap["macKeypad"] = BuildMacKeypad()
 | 
						|
	GraphMap["l33t"] = BuildLeet()
 | 
						|
}
 | 
						|
 | 
						|
//BuildQwerty builds the Qwerty Graph
 | 
						|
func BuildQwerty() Graph {
 | 
						|
	data, err := data.Asset("data/Qwerty.json")
 | 
						|
	if err != nil {
 | 
						|
		panic("Can't find asset")
 | 
						|
	}
 | 
						|
	return getAdjancencyGraphFromFile(data, "qwerty")
 | 
						|
}
 | 
						|
 | 
						|
//BuildDvorak builds the Dvorak Graph
 | 
						|
func BuildDvorak() Graph {
 | 
						|
	data, err := data.Asset("data/Dvorak.json")
 | 
						|
	if err != nil {
 | 
						|
		panic("Can't find asset")
 | 
						|
	}
 | 
						|
	return getAdjancencyGraphFromFile(data, "dvorak")
 | 
						|
}
 | 
						|
 | 
						|
//BuildKeypad builds the Keypad Graph
 | 
						|
func BuildKeypad() Graph {
 | 
						|
	data, err := data.Asset("data/Keypad.json")
 | 
						|
	if err != nil {
 | 
						|
		panic("Can't find asset")
 | 
						|
	}
 | 
						|
	return getAdjancencyGraphFromFile(data, "keypad")
 | 
						|
}
 | 
						|
 | 
						|
//BuildMacKeypad builds the Mac Keypad Graph
 | 
						|
func BuildMacKeypad() Graph {
 | 
						|
	data, err := data.Asset("data/MacKeypad.json")
 | 
						|
	if err != nil {
 | 
						|
		panic("Can't find asset")
 | 
						|
	}
 | 
						|
	return getAdjancencyGraphFromFile(data, "mac_keypad")
 | 
						|
}
 | 
						|
 | 
						|
//BuildLeet builds the L33T Graph
 | 
						|
func BuildLeet() Graph {
 | 
						|
	data, err := data.Asset("data/L33t.json")
 | 
						|
	if err != nil {
 | 
						|
		panic("Can't find asset")
 | 
						|
	}
 | 
						|
	return getAdjancencyGraphFromFile(data, "keypad")
 | 
						|
}
 | 
						|
 | 
						|
func getAdjancencyGraphFromFile(data []byte, name string) Graph {
 | 
						|
 | 
						|
	var graph Graph
 | 
						|
	err := json.Unmarshal(data, &graph)
 | 
						|
	if err != nil {
 | 
						|
		log.Fatal(err)
 | 
						|
	}
 | 
						|
	graph.Name = name
 | 
						|
	return graph
 | 
						|
}
 | 
						|
 | 
						|
// CalculateAvgDegree calclates the average degree between nodes in the graph
 | 
						|
//on qwerty, 'g' has degree 6, being adjacent to 'ftyhbv'. '\' has degree 1.
 | 
						|
//this calculates the average over all keys.
 | 
						|
//TODO double check that i ported this correctly scoring.coffee ln 5
 | 
						|
func (adjGrp Graph) CalculateAvgDegree() float64 {
 | 
						|
	if adjGrp.averageDegree != float64(0) {
 | 
						|
		return adjGrp.averageDegree
 | 
						|
	}
 | 
						|
	var avg float64
 | 
						|
	var count float64
 | 
						|
	for _, value := range adjGrp.Graph {
 | 
						|
 | 
						|
		for _, char := range value {
 | 
						|
			if len(char) != 0 || char != " " {
 | 
						|
				avg += float64(len(char))
 | 
						|
				count++
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	adjGrp.averageDegree = avg / count
 | 
						|
 | 
						|
	return adjGrp.averageDegree
 | 
						|
}
 |