find.cjs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. 'use strict';
  2. const emoji_convert = require('../convert.cjs');
  3. const emoji_data = require('../data.cjs');
  4. const emoji_format = require('../format.cjs');
  5. function createEmojiRegExp(regexp) {
  6. return new RegExp(regexp, "g");
  7. }
  8. function getEmojiMatchesInText(regexp, content) {
  9. const results = [];
  10. const found = /* @__PURE__ */ new Set();
  11. (regexp instanceof Array ? regexp : [regexp]).forEach((regexp2, index) => {
  12. const matches = content.match(
  13. typeof regexp2 === "string" ? createEmojiRegExp(regexp2) : regexp2
  14. );
  15. if (matches) {
  16. for (let i = 0; i < matches.length; i++) {
  17. const match = matches[i];
  18. if (found.has(match)) {
  19. continue;
  20. }
  21. found.add(match);
  22. const sequence = [];
  23. for (const codePoint of match) {
  24. const num = codePoint.codePointAt(0);
  25. if (num !== emoji_data.vs16Emoji) {
  26. sequence.push(num);
  27. }
  28. }
  29. results.push({
  30. match,
  31. sequence,
  32. keyword: emoji_format.getEmojiSequenceKeyword(
  33. emoji_convert.convertEmojiSequenceToUTF32(sequence)
  34. ),
  35. regexp: index
  36. });
  37. }
  38. }
  39. });
  40. results.sort((a, b) => {
  41. const match1 = a.match;
  42. const match2 = b.match;
  43. if (match2.length === match1.length) {
  44. return match1.localeCompare(match2);
  45. }
  46. return match2.length - match1.length;
  47. });
  48. return results;
  49. }
  50. function sortEmojiMatchesInText(content, matches) {
  51. const ranges = [];
  52. const check = (start, end) => {
  53. for (let i = 0; i < ranges.length; i++) {
  54. if (start < ranges[i].end && end > ranges[i].start) {
  55. return false;
  56. }
  57. }
  58. return true;
  59. };
  60. for (let i = 0; i < matches.length; i++) {
  61. const match = matches[i];
  62. const search = match.match;
  63. let startFrom = 0;
  64. let start;
  65. while ((start = content.indexOf(search, startFrom)) !== -1) {
  66. const end = start + search.length;
  67. startFrom = end;
  68. if (check(start, end)) {
  69. ranges.push({
  70. start,
  71. end,
  72. match
  73. });
  74. }
  75. }
  76. }
  77. ranges.sort((a, b) => a.start - b.start);
  78. const list = [];
  79. let prevRange;
  80. let lastEnd;
  81. for (let i = 0; i < ranges.length; i++) {
  82. const range = ranges[i];
  83. const prev = content.slice(prevRange ? prevRange.end : 0, range.start);
  84. list.push({
  85. match: range.match,
  86. prev
  87. });
  88. prevRange = range;
  89. lastEnd = range.end;
  90. }
  91. if (!lastEnd) {
  92. return [];
  93. }
  94. const replacements = list.map((item, index) => {
  95. const nextItem = list[index + 1];
  96. return {
  97. ...item,
  98. next: nextItem ? nextItem.prev : content.slice(lastEnd)
  99. };
  100. });
  101. return replacements;
  102. }
  103. exports.createEmojiRegExp = createEmojiRegExp;
  104. exports.getEmojiMatchesInText = getEmojiMatchesInText;
  105. exports.sortEmojiMatchesInText = sortEmojiMatchesInText;