encoder.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package codabar
  2. import (
  3. "fmt"
  4. "github.com/boombuler/barcode"
  5. "github.com/boombuler/barcode/utils"
  6. "regexp"
  7. )
  8. var encodingTable map[rune][]bool = map[rune][]bool{
  9. '0': []bool{true, false, true, false, true, false, false, true, true},
  10. '1': []bool{true, false, true, false, true, true, false, false, true},
  11. '2': []bool{true, false, true, false, false, true, false, true, true},
  12. '3': []bool{true, true, false, false, true, false, true, false, true},
  13. '4': []bool{true, false, true, true, false, true, false, false, true},
  14. '5': []bool{true, true, false, true, false, true, false, false, true},
  15. '6': []bool{true, false, false, true, false, true, false, true, true},
  16. '7': []bool{true, false, false, true, false, true, true, false, true},
  17. '8': []bool{true, false, false, true, true, false, true, false, true},
  18. '9': []bool{true, true, false, true, false, false, true, false, true},
  19. '-': []bool{true, false, true, false, false, true, true, false, true},
  20. '$': []bool{true, false, true, true, false, false, true, false, true},
  21. ':': []bool{true, true, false, true, false, true, true, false, true, true},
  22. '/': []bool{true, true, false, true, true, false, true, false, true, true},
  23. '.': []bool{true, true, false, true, true, false, true, true, false, true},
  24. '+': []bool{true, false, true, true, false, false, true, true, false, false, true, true},
  25. 'A': []bool{true, false, true, true, false, false, true, false, false, true},
  26. 'B': []bool{true, false, true, false, false, true, false, false, true, true},
  27. 'C': []bool{true, false, false, true, false, false, true, false, true, true},
  28. 'D': []bool{true, false, true, false, false, true, true, false, false, true},
  29. }
  30. func Encode(content string) (barcode.Barcode, error) {
  31. checkValid, _ := regexp.Compile(`[ABCD][0123456789\-\$\:/\.\+]*[ABCD]$`)
  32. if content == "!" || checkValid.ReplaceAllString(content, "!") != "!" {
  33. return nil, fmt.Errorf("can not encode \"%s\"", content)
  34. }
  35. resBits := new(utils.BitList)
  36. for i, r := range content {
  37. if i > 0 {
  38. resBits.AddBit(false)
  39. }
  40. bits, ok := encodingTable[r]
  41. if !ok {
  42. return nil, fmt.Errorf("can not encode \"%s\"", content)
  43. }
  44. for _, bit := range bits {
  45. resBits.AddBit(bit)
  46. }
  47. }
  48. return &codabarcode{resBits, content}, nil
  49. }