| 1 | import { toString } from '../util/toString.mjs';
|
|---|
| 2 |
|
|---|
| 3 | const rNonCharLatin = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\xd7\\xf7';
|
|---|
| 4 | const rUnicodeUpper = '\\p{Lu}';
|
|---|
| 5 | const rUnicodeLower = '\\p{Ll}';
|
|---|
| 6 | const rMisc = '(?:[\\p{Lm}\\p{Lo}]\\p{M}*)';
|
|---|
| 7 | const rNumber = '\\d';
|
|---|
| 8 | const rUnicodeOptContrLower = "(?:['\u2019](?:d|ll|m|re|s|t|ve))?";
|
|---|
| 9 | const rUnicodeOptContrUpper = "(?:['\u2019](?:D|LL|M|RE|S|T|VE))?";
|
|---|
| 10 | const rUnicodeBreak = `[\\p{Z}\\p{P}${rNonCharLatin}]`;
|
|---|
| 11 | const rUnicodeMiscUpper = `(?:${rUnicodeUpper}|${rMisc})`;
|
|---|
| 12 | const rUnicodeMiscLower = `(?:${rUnicodeLower}|${rMisc})`;
|
|---|
| 13 | const rUnicodeWord = RegExp([
|
|---|
| 14 | `${rUnicodeUpper}?${rUnicodeLower}+${rUnicodeOptContrLower}(?=${rUnicodeBreak}|${rUnicodeUpper}|$)`,
|
|---|
| 15 | `${rUnicodeMiscUpper}+${rUnicodeOptContrUpper}(?=${rUnicodeBreak}|${rUnicodeUpper}${rUnicodeMiscLower}|$)`,
|
|---|
| 16 | `${rUnicodeUpper}?${rUnicodeMiscLower}+${rUnicodeOptContrLower}`,
|
|---|
| 17 | `${rUnicodeUpper}+${rUnicodeOptContrUpper}`,
|
|---|
| 18 | `${rNumber}*(?:1ST|2ND|3RD|(?![123])${rNumber}TH)(?=\\b|[a-z_])`,
|
|---|
| 19 | `${rNumber}*(?:1st|2nd|3rd|(?![123])${rNumber}th)(?=\\b|[A-Z_])`,
|
|---|
| 20 | `${rNumber}+`,
|
|---|
| 21 | '\\p{Emoji_Presentation}',
|
|---|
| 22 | '\\p{Extended_Pictographic}',
|
|---|
| 23 | ].join('|'), 'gu');
|
|---|
| 24 | function words(str, pattern = rUnicodeWord, guard) {
|
|---|
| 25 | const input = toString(str);
|
|---|
| 26 | if (guard) {
|
|---|
| 27 | pattern = rUnicodeWord;
|
|---|
| 28 | }
|
|---|
| 29 | if (typeof pattern === 'number') {
|
|---|
| 30 | pattern = pattern.toString();
|
|---|
| 31 | }
|
|---|
| 32 | const words = Array.from(input.match(pattern) ?? []);
|
|---|
| 33 | return words.filter(x => x !== '');
|
|---|
| 34 | }
|
|---|
| 35 |
|
|---|
| 36 | export { words };
|
|---|