index.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. export default function buildMatchFn(args) {
  2. return function (dirtyString, dirtyOptions) {
  3. var string = String(dirtyString);
  4. var options = dirtyOptions || {};
  5. var width = options.width;
  6. var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
  7. var matchResult = string.match(matchPattern);
  8. if (!matchResult) {
  9. return null;
  10. }
  11. var matchedString = matchResult[0];
  12. var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
  13. var value;
  14. if (Object.prototype.toString.call(parsePatterns) === '[object Array]') {
  15. value = findIndex(parsePatterns, function (pattern) {
  16. return pattern.test(matchedString);
  17. });
  18. } else {
  19. value = findKey(parsePatterns, function (pattern) {
  20. return pattern.test(matchedString);
  21. });
  22. }
  23. value = args.valueCallback ? args.valueCallback(value) : value;
  24. value = options.valueCallback ? options.valueCallback(value) : value;
  25. return {
  26. value: value,
  27. rest: string.slice(matchedString.length)
  28. };
  29. };
  30. }
  31. function findKey(object, predicate) {
  32. for (var key in object) {
  33. if (object.hasOwnProperty(key) && predicate(object[key])) {
  34. return key;
  35. }
  36. }
  37. }
  38. function findIndex(array, predicate) {
  39. for (var key = 0; key < array.length; key++) {
  40. if (predicate(array[key])) {
  41. return key;
  42. }
  43. }
  44. }