-
Notifications
You must be signed in to change notification settings - Fork 1
/
qr.go
117 lines (106 loc) · 2.29 KB
/
qr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package qr
import (
"io"
"strings"
"rsc.io/qr"
)
// most of this is stolen
const (
white = "\033[47m \033[0m"
black = "\033[40m \033[0m"
blackWhite = "▄"
blackBlack = " "
whiteBlack = "▀"
whiteWhite = "█"
H = qr.H
M = qr.M
L = qr.L
defaultQuiet = 0
)
type Config struct {
Level qr.Level
Writer io.Writer
HalfBlocks bool
BlackChar string
BlackWhiteChar string
WhiteChar string
WhiteBlackChar string
QuietZone int
}
func (c *Config) writeFullBlocks(w io.Writer, code *qr.Code) {
ww := c.WhiteChar
bb := c.BlackChar
for i := 0; i < code.Size; i++ {
for j := 0; j < code.Size; j++ {
if code.Black(j, i) {
w.Write([]byte(bb))
} else {
w.Write([]byte(ww))
}
}
w.Write([]byte("\n"))
}
}
func (c *Config) writeHalfBlocks(w io.Writer, code *qr.Code) {
ww := c.WhiteChar
bb := c.BlackChar
wb := c.WhiteBlackChar
bw := c.BlackWhiteChar
for i := 0; i < code.Size; i += 2 {
for j := 0; j < code.Size; j++ {
nextBlack := false
if i+1 < code.Size {
nextBlack = code.Black(j, i+1)
}
currBlack := code.Black(j, i)
if currBlack && nextBlack {
w.Write([]byte(bb))
} else if currBlack && !nextBlack {
w.Write([]byte(bw))
} else if !currBlack && !nextBlack {
w.Write([]byte(ww))
} else {
w.Write([]byte(wb))
}
}
w.Write([]byte("\n"))
}
}
func stringRepeat(s string, count int) string {
return strings.Repeat(s, count)
}
func GenerateWithConfig(text string, config Config) {
if config.QuietZone < 1 {
config.QuietZone = 1
}
w := config.Writer
code, _ := qr.Encode(text, config.Level)
if config.HalfBlocks {
config.writeHalfBlocks(w, code)
} else {
config.writeFullBlocks(w, code)
}
}
func Generate(text string, l qr.Level, w io.Writer) {
config := Config{
Level: l,
Writer: w,
BlackChar: black,
WhiteChar: white,
QuietZone: defaultQuiet,
}
GenerateWithConfig(text, config)
}
func GenerateHalfBlock(text string, l qr.Level, w io.Writer) {
config := Config{
Level: l,
Writer: w,
HalfBlocks: true,
BlackChar: blackBlack,
WhiteBlackChar: whiteBlack,
WhiteChar: whiteWhite,
BlackWhiteChar: blackWhite,
QuietZone: defaultQuiet,
}
GenerateWithConfig(text, config)
}