encode.go 826 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package code128
  2. import (
  3. "fmt"
  4. "github.com/boombuler/barcode"
  5. "github.com/boombuler/barcode/utils"
  6. "unicode/utf8"
  7. )
  8. func strToRunes(str string) []rune {
  9. result := make([]rune, utf8.RuneCountInString(str))
  10. i := 0
  11. for _, r := range str {
  12. result[i] = r
  13. i++
  14. }
  15. return result
  16. }
  17. func Encode(content string) (barcode.Barcode, error) {
  18. contentRunes := strToRunes(content)
  19. idxList := encodeBTable(contentRunes)
  20. if idxList == nil {
  21. return nil, fmt.Errorf("\"%s\" could not be encoded", content)
  22. }
  23. result := &code{new(utils.BitList), content}
  24. sum := 0
  25. for i, idx := range idxList.GetBytes() {
  26. if i == 0 {
  27. sum = int(idx)
  28. } else {
  29. sum += i * int(idx)
  30. }
  31. result.AddRange(encodingTable[idx])
  32. }
  33. result.AddRange(encodingTable[sum%103])
  34. result.AddRange(encodingTable[stopSymbol])
  35. return result, nil
  36. }