parse-helpers.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /**
  2. * @copyright 2020, the Converse.js contributors
  3. * @license Mozilla Public License (MPLv2)
  4. * @description Pure functions to help functionally parse messages.
  5. * @todo Other parsing helpers can be made more abstract and placed here.
  6. */
  7. const helpers = {};
  8. // Captures all mentions, but includes a space before the @
  9. helpers.mention_regex = /(?:\s|^)([@][\w_-]+(?:\.\w+)*)/gi;
  10. helpers.matchRegexInText = text => regex => text.matchAll(regex);
  11. const escapeRegexChars = (string, char) => string.replace(RegExp('\\' + char, 'ig'), '\\' + char);
  12. helpers.escapeCharacters = characters => string =>
  13. characters.split('').reduce(escapeRegexChars, string);
  14. helpers.escapeRegexString = helpers.escapeCharacters('[\\^$.?*+(){}');
  15. // `for` is ~25% faster than using `Array.find()`
  16. helpers.findFirstMatchInArray = array => text => {
  17. for (let i = 0; i < array.length; i++) {
  18. if (text.localeCompare(array[i], undefined, {sensitivity: 'base'}) === 0) {
  19. return array[i];
  20. }
  21. }
  22. return null;
  23. };
  24. const reduceReferences = ([text, refs], ref, index) => {
  25. let updated_text = text;
  26. let { begin, end } = ref;
  27. const { value } = ref;
  28. begin = begin - index;
  29. end = end - index - 1; // -1 to compensate for the removed @
  30. updated_text = `${updated_text.slice(0, begin)}${value}${updated_text.slice(end + 1)}`;
  31. return [updated_text, [...refs, { ...ref, begin, end }]]
  32. }
  33. helpers.reduceTextFromReferences = (text, refs) => refs.reduce(reduceReferences, [text, []]);
  34. export default helpers;