added code39 full ASCII mode

This commit is contained in:
boombuler 2013-12-23 19:28:49 +01:00
parent 5ae56e6a77
commit a1250996a3
1 changed files with 39 additions and 4 deletions

View File

@ -59,6 +59,19 @@ var encodeTable map[rune]encodeInfo = map[rune]encodeInfo{
'*': encodeInfo{-1, []bool{true, false, false, true, false, true, true, false, true, true, false, true}},
}
var extendedTable map[rune]string = map[rune]string{
0: `%U`, 1: `$A`, 2: `$B`, 3: `$C`, 4: `$D`, 5: `$E`, 6: `$F`, 7: `$G`, 8: `$H`, 9: `$I`, 10: `$J`,
11: `$K`, 12: `$L`, 13: `$M`, 14: `$N`, 15: `$O`, 16: `$P`, 17: `$Q`, 18: `$R`, 19: `$S`, 20: `$T`,
21: `$U`, 22: `$V`, 23: `$W`, 24: `$X`, 25: `$Y`, 26: `$Z`, 27: `%A`, 28: `%B`, 29: `%C`, 30: `%D`,
31: `%E`, 33: `/A`, 34: `/B`, 35: `/C`, 36: `/D`, 37: `/E`, 38: `/F`, 39: `/G`, 40: `/H`, 41: `/I`,
42: `/J`, 43: `/K`, 44: `/L`, 47: `/O`, 58: `/Z`, 59: `%F`, 60: `%G`, 61: `%H`, 62: `%I`, 63: `%J`,
64: `%V`, 91: `%K`, 92: `%L`, 93: `%M`, 94: `%N`, 95: `%O`, 96: `%W`, 97: `+A`, 98: `+B`, 99: `+C`,
100: `+D`, 101: `+E`, 102: `+F`, 103: `+G`, 104: `+H`, 105: `+I`, 106: `+J`, 107: `+K`, 108: `+L`,
109: `+M`, 110: `+N`, 111: `+O`, 112: `+P`, 113: `+Q`, 114: `+R`, 115: `+S`, 116: `+T`, 117: `+U`,
118: `+V`, 119: `+W`, 120: `+X`, 121: `+Y`, 122: `+Z`, 123: `%P`, 124: `%Q`, 125: `%R`, 126: `%S`,
127: `%T`,
}
func getChecksum(content string) string {
sum := 0
for _, r := range content {
@ -79,11 +92,33 @@ func getChecksum(content string) string {
return "#"
}
func prepare(content string) (string, error) {
result := ""
for _, r := range content {
if r > 127 {
return "", errors.New("Only ASCII strings can be encoded")
}
val, ok := extendedTable[r]
if ok {
result += val
} else {
result += string([]rune{r})
}
}
return result, nil
}
// encodes the given string as a code39 barcode
// if includeChecksum is set to true, a checksum character is calculated and added to the content
func Encode(content string, includeChecksum bool) (barcode.Barcode, error) {
if strings.ContainsRune(content, '*') {
return nil, errors.New("invalid data")
func Encode(content string, includeChecksum bool, fullASCIIMode bool) (barcode.Barcode, error) {
if fullASCIIMode {
var err error
content, err = prepare(content)
if err != nil {
return nil, err
}
} else if strings.ContainsRune(content, '*') {
return nil, errors.New("invalid data! try full ascii mode")
}
data := "*" + content
@ -101,7 +136,7 @@ func Encode(content string, includeChecksum bool) (barcode.Barcode, error) {
info, ok := encodeTable[r]
if !ok {
return nil, errors.New("invalid data")
return nil, errors.New("invalid data! try full ascii mode")
}
result.AddBit(info.data...)
}