auto.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. 'use strict';
  2. import _constants from './constants'
  3. // Match Set functions
  4. var matchSetALength = function matchSetALength(string) {
  5. return string.match(new RegExp('^' + _constants.A_CHARS + '*'))[0].length;
  6. };
  7. var matchSetBLength = function matchSetBLength(string) {
  8. return string.match(new RegExp('^' + _constants.B_CHARS + '*'))[0].length;
  9. };
  10. var matchSetC = function matchSetC(string) {
  11. return string.match(new RegExp('^' + _constants.C_CHARS + '*'))[0];
  12. };
  13. // CODE128A or CODE128B
  14. function autoSelectFromAB(string, isA) {
  15. var ranges = isA ? _constants.A_CHARS : _constants.B_CHARS;
  16. var untilC = string.match(new RegExp('^(' + ranges + '+?)(([0-9]{2}){2,})([^0-9]|$)'));
  17. if (untilC) {
  18. return untilC[1] + String.fromCharCode(204) + autoSelectFromC(string.substring(untilC[1].length));
  19. }
  20. var chars = string.match(new RegExp('^' + ranges + '+'))[0];
  21. if (chars.length === string.length) {
  22. return string;
  23. }
  24. return chars + String.fromCharCode(isA ? 205 : 206) + autoSelectFromAB(string.substring(chars.length), !isA);
  25. }
  26. // CODE128C
  27. function autoSelectFromC(string) {
  28. var cMatch = matchSetC(string);
  29. var length = cMatch.length;
  30. if (length === string.length) {
  31. return string;
  32. }
  33. string = string.substring(length);
  34. // Select A/B depending on the longest match
  35. var isA = matchSetALength(string) >= matchSetBLength(string);
  36. return cMatch + String.fromCharCode(isA ? 206 : 205) + autoSelectFromAB(string, isA);
  37. }
  38. // Detect Code Set (A, B or C) and format the string
  39. function auto(string) {
  40. var newString = void 0;
  41. var cLength = matchSetC(string).length;
  42. // Select 128C if the string start with enough digits
  43. if (cLength >= 2) {
  44. newString = _constants.C_START_CHAR + autoSelectFromC(string);
  45. } else {
  46. // Select A/B depending on the longest match
  47. var isA = matchSetALength(string) > matchSetBLength(string);
  48. newString = (isA ? _constants.A_START_CHAR : _constants.B_START_CHAR) + autoSelectFromAB(string, isA);
  49. }
  50. return newString.replace(/[\xCD\xCE]([^])[\xCD\xCE]/, // Any sequence between 205 and 206 characters
  51. function(match, char) {
  52. return String.fromCharCode(203) + char;
  53. });
  54. };
  55. export default auto