data_encoder.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package pdf417
  2. import (
  3. "fmt"
  4. )
  5. const (
  6. switchCodeText = 900
  7. switchCodeNumber = 902
  8. )
  9. type encoder interface {
  10. CanEncode(char rune) bool
  11. GetSwitchCode(data string) int
  12. Encode(data string) ([]int, error)
  13. }
  14. type dataEncoder struct {
  15. Encoders []encoder
  16. DefaultEncoder encoder
  17. }
  18. type chain struct {
  19. Data string
  20. Encoder encoder
  21. }
  22. func (c chain) Encode() ([]int, error) {
  23. return c.Encoder.Encode(c.Data)
  24. }
  25. func (c chain) GetSwitchCode() int {
  26. return c.Encoder.GetSwitchCode(c.Data)
  27. }
  28. func newDataEncoder() *dataEncoder {
  29. textEncoder := newTextEncoder()
  30. encoder := &dataEncoder{
  31. []encoder{
  32. newNumberEncoder(),
  33. textEncoder,
  34. },
  35. textEncoder,
  36. }
  37. return encoder
  38. }
  39. func (dataEncoder *dataEncoder) Encode(data string) ([]int, error) {
  40. if len(data) == 0 {
  41. return nil, fmt.Errorf("Nothing to encode")
  42. }
  43. chains, err := dataEncoder.SplitToChains(data)
  44. if err != nil {
  45. return nil, err
  46. }
  47. if len(chains) == 0 {
  48. return nil, fmt.Errorf("%q can not be encoded!", data)
  49. }
  50. currentSwitchCode := switchCodeText
  51. cws := []int{}
  52. for _, chain := range chains {
  53. encoded, err := chain.Encode()
  54. if err != nil {
  55. return cws, err
  56. }
  57. if switchCode := chain.GetSwitchCode(); currentSwitchCode != switchCode {
  58. cws = append(cws, switchCode)
  59. currentSwitchCode = switchCode
  60. }
  61. cws = append(cws, encoded...)
  62. }
  63. return cws, nil
  64. }
  65. func (dataEncoder *dataEncoder) SplitToChains(data string) ([]chain, error) {
  66. chains := []chain{}
  67. chainData := ""
  68. encoder := dataEncoder.DefaultEncoder
  69. for _, char := range data {
  70. newEncoder, err := dataEncoder.getEncoder(char)
  71. if err != nil {
  72. return nil, err
  73. }
  74. if newEncoder != encoder {
  75. if len(chainData) > 0 {
  76. chains = append(chains, chain{chainData, encoder})
  77. chainData = ""
  78. }
  79. encoder = newEncoder
  80. }
  81. chainData = chainData + string(char)
  82. }
  83. if len(chainData) > 0 {
  84. chains = append(chains, chain{chainData, encoder})
  85. }
  86. return chains, nil
  87. }
  88. func (dataEncoder *dataEncoder) getEncoder(char rune) (encoder, error) {
  89. for _, encoder := range dataEncoder.Encoders {
  90. if encoder.CanEncode(char) {
  91. return encoder, nil
  92. }
  93. }
  94. return nil, fmt.Errorf("Cannot encode character %q", string(char))
  95. }