index.js 1.4 KB

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