adjcmartix.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package adjacency
  2. import (
  3. "encoding/json"
  4. "log"
  5. // "fmt"
  6. "github.com/nbutton23/zxcvbn-go/data"
  7. )
  8. type AdjacencyGraph struct {
  9. Graph map[string][]string
  10. averageDegree float64
  11. Name string
  12. }
  13. var AdjacencyGph = make(map[string]AdjacencyGraph)
  14. func init() {
  15. AdjacencyGph["qwerty"] = BuildQwerty()
  16. AdjacencyGph["dvorak"] = BuildDvorak()
  17. AdjacencyGph["keypad"] = BuildKeypad()
  18. AdjacencyGph["macKeypad"] = BuildMacKeypad()
  19. AdjacencyGph["l33t"] = BuildLeet()
  20. }
  21. func BuildQwerty() AdjacencyGraph {
  22. data, err := zxcvbn_data.Asset("data/Qwerty.json")
  23. if err != nil {
  24. panic("Can't find asset")
  25. }
  26. return GetAdjancencyGraphFromFile(data, "qwerty")
  27. }
  28. func BuildDvorak() AdjacencyGraph {
  29. data, err := zxcvbn_data.Asset("data/Dvorak.json")
  30. if err != nil {
  31. panic("Can't find asset")
  32. }
  33. return GetAdjancencyGraphFromFile(data, "dvorak")
  34. }
  35. func BuildKeypad() AdjacencyGraph {
  36. data, err := zxcvbn_data.Asset("data/Keypad.json")
  37. if err != nil {
  38. panic("Can't find asset")
  39. }
  40. return GetAdjancencyGraphFromFile(data, "keypad")
  41. }
  42. func BuildMacKeypad() AdjacencyGraph {
  43. data, err := zxcvbn_data.Asset("data/MacKeypad.json")
  44. if err != nil {
  45. panic("Can't find asset")
  46. }
  47. return GetAdjancencyGraphFromFile(data, "mac_keypad")
  48. }
  49. func BuildLeet() AdjacencyGraph {
  50. data, err := zxcvbn_data.Asset("data/L33t.json")
  51. if err != nil {
  52. panic("Can't find asset")
  53. }
  54. return GetAdjancencyGraphFromFile(data, "keypad")
  55. }
  56. func GetAdjancencyGraphFromFile(data []byte, name string) AdjacencyGraph {
  57. var graph AdjacencyGraph
  58. err := json.Unmarshal(data, &graph)
  59. if err != nil {
  60. log.Fatal(err)
  61. }
  62. graph.Name = name
  63. return graph
  64. }
  65. //on qwerty, 'g' has degree 6, being adjacent to 'ftyhbv'. '\' has degree 1.
  66. //this calculates the average over all keys.
  67. //TODO double check that i ported this correctly scoring.coffee ln 5
  68. func (adjGrp AdjacencyGraph) CalculateAvgDegree() float64 {
  69. if adjGrp.averageDegree != float64(0) {
  70. return adjGrp.averageDegree
  71. }
  72. var avg float64
  73. var count float64
  74. for _, value := range adjGrp.Graph {
  75. for _, char := range value {
  76. if char != "" || char != " " {
  77. avg += float64(len(char))
  78. count++
  79. }
  80. }
  81. }
  82. adjGrp.averageDegree = avg / count
  83. return adjGrp.averageDegree
  84. }