@searpent/react-image-annotate 2.3.0-cand → 2.3.0-cand-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/Annotator/examplePhotos.js +29 -29
  2. package/Annotator/examplePhotos_repr.js +28 -28
  3. package/Annotator/index.js +21 -15
  4. package/Annotator/index.story_bugdemo_15_1.js +51 -46
  5. package/Annotator/index.story_repr.js +64 -51
  6. package/Annotator/reducers/combine-reducers.js +3 -18
  7. package/Annotator/reducers/convert-expanding-line-to-polygon.js +16 -15
  8. package/Annotator/reducers/get-implied-video-regions.js +30 -18
  9. package/ClassSelectionMenu/index.js +8 -8
  10. package/Crosshairs/index.js +2 -2
  11. package/DebugSidebarBox/index.js +4 -4
  12. package/DemoSite/Editor.js +15 -15
  13. package/DemoSite/ErrorBoundaryDialog.js +5 -3
  14. package/DemoSite/index.js +3 -3
  15. package/Editor/annotation-plugin/annotation.js +3 -1
  16. package/Editor/editor.css +2 -4
  17. package/Editor/index.js +44 -13
  18. package/Editor/index_bugdemo_15_1.js +17 -13
  19. package/Editor/readOnly.js +403 -47
  20. package/Errorer/index.js +2 -2
  21. package/FullImageSegmentationAnnotator/index.js +1 -1
  22. package/GroupSelectorSidebarBox/index.js +7 -7
  23. package/GroupsEditorSidebarBox/index.js +11 -11
  24. package/HelpSidebarBox/index.js +4 -4
  25. package/HighlightBox/index.js +3 -3
  26. package/HistorySidebarBox/index.js +8 -8
  27. package/ImageCanvas/index.js +16 -16
  28. package/ImageMask/index.js +1 -1
  29. package/ImageSelectorSidebarBox/index.js +7 -7
  30. package/KeyframeTimeline/index.js +14 -30
  31. package/KeyframesSelectorSidebarBox/index.js +8 -8
  32. package/LandingPage/index.js +12 -12
  33. package/Locker/index.js +2 -2
  34. package/MainLayout/RightSidebarItemsWrapper.js +1 -1
  35. package/MainLayout/icon-dictionary.js +11 -11
  36. package/MainLayout/index.js +23 -25
  37. package/MainLayout/index_bugdemo_15_1.js +23 -25
  38. package/MetadataEditorSidebarBox/index.js +18 -18
  39. package/MetadataEditorSidebarBox/index_14_01_25.js +18 -18
  40. package/MetadataEditorSidebarBox/index_repr.js +21 -21
  41. package/PageSelector/index.js +21 -21
  42. package/PointDistances/index.js +4 -4
  43. package/PreventScrollToParents/index.js +3 -3
  44. package/RegionLabel/index.js +24 -24
  45. package/RegionSelectAndTransformBoxes/index.js +8 -8
  46. package/RegionSelectorSidebarBox/index.js +33 -33
  47. package/RegionShapes/index.js +22 -22
  48. package/RegionTags/index.js +6 -6
  49. package/SettingsDialog/index.js +4 -4
  50. package/SettingsProvider/index.js +1 -1
  51. package/Shortcuts/ShortcutField.js +3 -3
  52. package/Shortcuts/index.js +2 -2
  53. package/ShortcutsManager/index.js +9 -9
  54. package/Sidebar/index.js +7 -7
  55. package/SidebarBoxContainer/index.js +3 -3
  56. package/SmallToolButton/index.js +2 -2
  57. package/TagsSidebarBox/index.js +6 -6
  58. package/TaskDescriptionSidebarBox/index.js +4 -4
  59. package/Theme/index.js +2 -2
  60. package/VideoOrImageCanvasBackground/index.js +5 -5
  61. package/package.json +8 -2
  62. package/utils/blocks-to-article.js +3 -3
  63. package/utils/get-landmarks-with-transform.js +15 -13
  64. package/utils/spellcheck-nspell.js +143 -67
@@ -131,18 +131,18 @@ export default (function (_ref4) {
131
131
  height: isNaN(height) ? 0 : height
132
132
  };
133
133
  }, [imagePosition.topLeft.x, imagePosition.topLeft.y, imagePosition.bottomRight.x, imagePosition.bottomRight.y]);
134
- if (!videoSrc && !imageSrc) return /*#__PURE__*/React.createElement(Error, null, "No imageSrc or videoSrc provided");
135
- if (error) return /*#__PURE__*/React.createElement(Error, null, error);
136
- return /*#__PURE__*/React.createElement(ThemeProvider, {
134
+ if (!videoSrc && !imageSrc) return React.createElement(Error, null, "No imageSrc or videoSrc provided");
135
+ if (error) return React.createElement(Error, null, error);
136
+ return React.createElement(ThemeProvider, {
137
137
  theme: theme
138
- }, imageSrc && videoTime === undefined ? /*#__PURE__*/React.createElement(StyledImage, Object.assign({}, mouseEvents, {
138
+ }, imageSrc && videoTime === undefined ? React.createElement(StyledImage, Object.assign({}, mouseEvents, {
139
139
  src: imageSrc,
140
140
  ref: imageRef,
141
141
  style: stylePosition,
142
142
  onLoad: onImageLoaded,
143
143
  onError: onImageError,
144
144
  crossOrigin: useCrossOrigin ? "anonymous" : undefined
145
- })) : /*#__PURE__*/React.createElement(Video, Object.assign({}, mouseEvents, {
145
+ })) : React.createElement(Video, Object.assign({}, mouseEvents, {
146
146
  ref: videoRef,
147
147
  style: stylePosition,
148
148
  onLoadedMetadata: onLoadedVideoMetadata,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searpent/react-image-annotate",
3
- "version": "2.3.0-cand",
3
+ "version": "2.3.0-cand-3",
4
4
  "dependencies": {
5
5
  "@editorjs/editorjs": "^2.25.0",
6
6
  "@editorjs/paragraph": "^2.8.0",
@@ -20,6 +20,7 @@
20
20
  "material-survey": "^2.1.0",
21
21
  "mmgc1-cpp": "^1.0.50",
22
22
  "moment": "^2.23.0",
23
+ "nspell": "^2.1.5",
23
24
  "react": "^17.0.0",
24
25
  "react-dom": "^17.0.0",
25
26
  "react-editor-js": "^2.0.6",
@@ -51,6 +52,9 @@
51
52
  "node": ">=14.0.0 <18.0.0",
52
53
  "yarn": ">=1.22.0"
53
54
  },
55
+ "resolutions": {
56
+ "@babel/plugin-transform-typescript": "^7.9.4"
57
+ },
54
58
  "homepage": "/react-image-annotate",
55
59
  "repository": {
56
60
  "type": "git",
@@ -63,7 +67,7 @@
63
67
  "storybook": "start-storybook -p 9090 -s public",
64
68
  "build": "npm run build:babel && cp ./package.json ./dist/package.json && cp ./README.md ./dist/README.md",
65
69
  "dist": "npm run build && cd dist && npm publish",
66
- "build:babel": "NODE_ENV=production babel ./src --ignore \"src/**/*.story.js\" --out-dir=./dist && rm dist/index.js && cp dist/lib.js dist/index.js && cp src/PageSelector/page-selector.css dist/PageSelector/ && cp src/Locker/locker.css dist/Locker/ && cp src/Errorer/errorer.css dist/Errorer/ && cp src/Editor/annotation-plugin/annotation.css dist/Editor/annotation-plugin",
70
+ "build:babel": "NODE_ENV=production babel ./src --ignore \"src/**/*.story.js\" --out-dir=./dist && rm dist/index.js && cp dist/lib.js dist/index.js && cp src/PageSelector/page-selector.css dist/PageSelector/ && cp src/Locker/locker.css dist/Locker/ && cp src/Errorer/errorer.css dist/Errorer/ && cp src/Editor/editor.css dist/Editor/ && cp src/Editor/annotation-plugin/annotation.css dist/Editor/annotation-plugin",
67
71
  "build-storybook": "build-storybook",
68
72
  "build:gh-pages": "CI=false react-scripts build && mkdir build/demo && cp build/index.html build/demo/index.html",
69
73
  "gh-pages": "npm run build:gh-pages && gh-pages -d build",
@@ -82,7 +86,9 @@
82
86
  "devDependencies": {
83
87
  "@babel/cli": "^7.2.3",
84
88
  "@babel/core": "^7.2.2",
89
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
85
90
  "@babel/plugin-proposal-optional-chaining": "^7.11.0",
91
+ "@babel/plugin-transform-typescript": "^7.9.4",
86
92
  "@storybook/addon-actions": "^5.3.14",
87
93
  "@storybook/addon-links": "^5.3.14",
88
94
  "@storybook/addons": "^5.3.14",
@@ -34,9 +34,9 @@ function blocksToArticle(blocks) {
34
34
  return newBlock;
35
35
  });
36
36
  var article = renamedBlocks.reduce(function (acc, curr) {
37
- var _curr$data = curr === null || curr === void 0 ? void 0 : curr.data,
38
- labelName = _curr$data.labelName,
39
- text = _curr$data.text;
37
+ var _ref = curr === null || curr === void 0 ? void 0 : curr.data,
38
+ labelName = _ref.labelName,
39
+ text = _ref.text;
40
40
 
41
41
  if (acc[labelName] === undefined) {
42
42
  acc[labelName] = "";
@@ -1,22 +1,15 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
-
3
- function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
4
-
5
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
6
-
7
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
8
-
9
2
  export default (function (_ref) {
10
3
  var center = _ref.center,
11
4
  scale = _ref.scale,
12
5
  landmarks = _ref.landmarks;
13
6
  var points = {};
14
-
15
- var _iterator = _createForOfIteratorHelper(Object.entries(landmarks)),
16
- _step;
7
+ var _iteratorNormalCompletion = true;
8
+ var _didIteratorError = false;
9
+ var _iteratorError = undefined;
17
10
 
18
11
  try {
19
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
12
+ for (var _iterator = Object.entries(landmarks)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
20
13
  var _ref4 = _step.value;
21
14
 
22
15
  var _ref3 = _slicedToArray(_ref4, 2);
@@ -29,9 +22,18 @@ export default (function (_ref) {
29
22
  };
30
23
  }
31
24
  } catch (err) {
32
- _iterator.e(err);
25
+ _didIteratorError = true;
26
+ _iteratorError = err;
33
27
  } finally {
34
- _iterator.f();
28
+ try {
29
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
30
+ _iterator.return();
31
+ }
32
+ } finally {
33
+ if (_didIteratorError) {
34
+ throw _iteratorError;
35
+ }
36
+ }
35
37
  }
36
38
 
37
39
  return points;
@@ -2,12 +2,6 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
2
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
3
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
4
 
5
- function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
6
-
7
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
-
9
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
10
-
11
5
  /**
12
6
  * Multi-language spellcheck system with priority-based language detection
13
7
  *
@@ -37,7 +31,9 @@ export function getSpell() {
37
31
  } // Available dictionaries mapping
38
32
 
39
33
  function _getSpell() {
40
- _getSpell = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
34
+ _getSpell = _asyncToGenerator(
35
+ /*#__PURE__*/
36
+ _regeneratorRuntime.mark(function _callee2() {
41
37
  var lang,
42
38
  result,
43
39
  promise,
@@ -78,8 +74,10 @@ function _getSpell() {
78
74
  return _context2.abrupt("return", result);
79
75
 
80
76
  case 11:
81
- promise = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
82
- var _yield$import, nspell, dictName, affUrl, dicUrl, _yield$Promise$all, _yield$Promise$all2, affRes, dicRes, errorMsg, _yield$Promise$all3, _yield$Promise$all4, affBuf, dicBuf, utf8Decoder, affUtf8, enc, setMatch, raw, map, mapped, decoder, aff, dic, spellInstance;
77
+ promise = _asyncToGenerator(
78
+ /*#__PURE__*/
79
+ _regeneratorRuntime.mark(function _callee() {
80
+ var _ref2, nspell, dictName, affUrl, dicUrl, _ref3, _ref4, affRes, dicRes, errorMsg, _ref5, _ref6, affBuf, dicBuf, utf8Decoder, affUtf8, enc, setMatch, raw, map, mapped, decoder, aff, dic, spellInstance;
83
81
 
84
82
  return _regeneratorRuntime.wrap(function _callee$(_context) {
85
83
  while (1) {
@@ -90,8 +88,8 @@ function _getSpell() {
90
88
  return import('nspell');
91
89
 
92
90
  case 3:
93
- _yield$import = _context.sent;
94
- nspell = _yield$import.default;
91
+ _ref2 = _context.sent;
92
+ nspell = _ref2.default;
95
93
  // Use the mapped dictionary name
96
94
  dictName = AVAILABLE_DICTIONARIES[lang];
97
95
  affUrl = "/dicts/".concat(dictName, ".aff");
@@ -105,10 +103,10 @@ function _getSpell() {
105
103
  })]);
106
104
 
107
105
  case 11:
108
- _yield$Promise$all = _context.sent;
109
- _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);
110
- affRes = _yield$Promise$all2[0];
111
- dicRes = _yield$Promise$all2[1];
106
+ _ref3 = _context.sent;
107
+ _ref4 = _slicedToArray(_ref3, 2);
108
+ affRes = _ref4[0];
109
+ dicRes = _ref4[1];
112
110
  console.log('Fetch responses:', affRes.status, dicRes.status);
113
111
 
114
112
  if (!(!affRes.ok || !dicRes.ok)) {
@@ -127,10 +125,10 @@ function _getSpell() {
127
125
  return Promise.all([affRes.arrayBuffer(), dicRes.arrayBuffer()]);
128
126
 
129
127
  case 24:
130
- _yield$Promise$all3 = _context.sent;
131
- _yield$Promise$all4 = _slicedToArray(_yield$Promise$all3, 2);
132
- affBuf = _yield$Promise$all4[0];
133
- dicBuf = _yield$Promise$all4[1];
128
+ _ref5 = _context.sent;
129
+ _ref6 = _slicedToArray(_ref5, 2);
130
+ affBuf = _ref6[0];
131
+ dicBuf = _ref6[1];
134
132
  // Decode .aff as UTF-8 first to read SET <encoding>
135
133
  utf8Decoder = new TextDecoder('utf-8');
136
134
  affUtf8 = utf8Decoder.decode(affBuf);
@@ -216,9 +214,9 @@ var AVAILABLE_DICTIONARIES = {
216
214
  'pt_BR': 'pt_BR',
217
215
  'pt': 'pt_BR',
218
216
  'mk-MK': 'mk_MK',
219
- 'mk': 'mk_MK'
220
- }; // Spellcheck language setting (can be set by user)
217
+ 'mk': 'mk_MK' // Spellcheck language setting (can be set by user)
221
218
 
219
+ };
222
220
  var spellcheckLanguageSetting = null; // Spellcheck enabled/disabled flag
223
221
  // Defaults to false (disabled) for performance. Enable via REACT_APP_SPELLCHECK_ENABLED=true or setSpellcheckEnabled()
224
222
 
@@ -273,11 +271,12 @@ function getBrowserSpellcheckLanguage() {
273
271
 
274
272
  var languages = navigator.languages || [navigator.language || navigator.userLanguage || 'en-US']; // Find first available language
275
273
 
276
- var _iterator = _createForOfIteratorHelper(languages),
277
- _step;
274
+ var _iteratorNormalCompletion = true;
275
+ var _didIteratorError = false;
276
+ var _iteratorError = undefined;
278
277
 
279
278
  try {
280
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
279
+ for (var _iterator = languages[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
281
280
  var lang = _step.value;
282
281
  var normalized = lang.toLowerCase(); // Direct match
283
282
 
@@ -289,9 +288,18 @@ function getBrowserSpellcheckLanguage() {
289
288
  if (AVAILABLE_DICTIONARIES[normalized]) return normalized;
290
289
  }
291
290
  } catch (err) {
292
- _iterator.e(err);
291
+ _didIteratorError = true;
292
+ _iteratorError = err;
293
293
  } finally {
294
- _iterator.f();
294
+ try {
295
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
296
+ _iterator.return();
297
+ }
298
+ } finally {
299
+ if (_didIteratorError) {
300
+ throw _iteratorError;
301
+ }
302
+ }
295
303
  }
296
304
 
297
305
  return 'en-US'; // fallback
@@ -382,7 +390,9 @@ export function findMisspellings(_x) {
382
390
  }
383
391
 
384
392
  function _findMisspellings() {
385
- _findMisspellings = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(text) {
393
+ _findMisspellings = _asyncToGenerator(
394
+ /*#__PURE__*/
395
+ _regeneratorRuntime.mark(function _callee3(text) {
386
396
  var lang,
387
397
  browserLang,
388
398
  spellcheckLang,
@@ -391,10 +401,14 @@ function _findMisspellings() {
391
401
  wordRegex,
392
402
  words,
393
403
  miss,
404
+ _iteratorNormalCompletion2,
405
+ _didIteratorError2,
406
+ _iteratorError2,
394
407
  _iterator2,
395
408
  _step2,
396
409
  w,
397
410
  word,
411
+ isCorrect,
398
412
  _args3 = arguments;
399
413
 
400
414
  return _regeneratorRuntime.wrap(function _callee3$(_context3) {
@@ -443,19 +457,32 @@ function _findMisspellings() {
443
457
  return _context3.abrupt("return", []);
444
458
 
445
459
  case 16:
446
- // Unicode-aware word extraction across scripts (Latin, Cyrillic, etc.)
460
+ // Word extraction across common Latin + Cyrillic ranges
447
461
  // Matches sequences of letters, allowing internal apostrophes/dashes.
448
- wordRegex = /(?:[A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])(?:['\x2DA-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2019\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])*/g;
462
+ // Note: Avoids Unicode property escapes (\p{L}) for compatibility with older Babel toolchain.
463
+ //
464
+ // Character coverage by language:
465
+ // - English (en-US): A-Za-z (Basic Latin)
466
+ // - Czech (cs-CZ): A-Za-z + À-ÿ (Latin-1) + \u0100-\u017F (Latin Extended-A: č, ř, š, ž, ě, ů, ď, ť, ň)
467
+ // - Slovak (sk-SK): A-Za-z + À-ÿ (Latin-1: á, é, í, ó, ú, ý, ä, ô) + \u0100-\u017F (Latin Extended-A: č, ď, ň, š, ť, ž, ĺ, ľ, ŕ)
468
+ // - Portuguese (pt-BR): A-Za-z + À-ÿ (Latin-1: á, à, â, ã, ä, é, ê, ë, í, î, ï, ó, ô, õ, ö, ú, û, ü, ç)
469
+ // - Macedonian (mk-MK): Ѐ-ӿ (Cyrillic: all Cyrillic characters including ѓ, ќ, ѕ, џ, ј)
470
+ //
471
+ // IMPORTANT: Latin Extended-A (U+0100-U+017F) was missing in a previous version, causing:
472
+ // - Czech/Slovak words starting with these characters (like "Přinesla") to be incorrectly marked as misspelled
473
+ // - Words containing them (like "vedddlké") to not be extracted properly for spellchecking
474
+ wordRegex = /[A-Za-zÀ-ÖØ-öø-ÿ\u0100-\u017FЀ-ӿ][A-Za-zÀ-ÖØ-öø-ÿ\u0100-\u017FЀ-ӿ'’-]*/g;
449
475
  words = text.match(wordRegex) || [];
450
476
  miss = new Set();
451
- _iterator2 = _createForOfIteratorHelper(words);
452
- _context3.prev = 20;
453
-
454
- _iterator2.s();
455
-
456
- case 22:
457
- if ((_step2 = _iterator2.n()).done) {
458
- _context3.next = 30;
477
+ _iteratorNormalCompletion2 = true;
478
+ _didIteratorError2 = false;
479
+ _iteratorError2 = undefined;
480
+ _context3.prev = 22;
481
+ _iterator2 = words[Symbol.iterator]();
482
+
483
+ case 24:
484
+ if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
485
+ _context3.next = 34;
459
486
  break;
460
487
  }
461
488
 
@@ -463,52 +490,76 @@ function _findMisspellings() {
463
490
  word = w.replace(/^'+|'+$/g, '');
464
491
 
465
492
  if (word) {
466
- _context3.next = 27;
493
+ _context3.next = 29;
467
494
  break;
468
495
  }
469
496
 
470
- return _context3.abrupt("continue", 28);
497
+ return _context3.abrupt("continue", 31);
471
498
 
472
- case 27:
473
- if (!spell.correct(word)) miss.add(word);
499
+ case 29:
500
+ isCorrect = spell.correct(word);
501
+
502
+ if (!isCorrect) {
503
+ miss.add(word); // Debug logging for misspelled words
504
+
505
+ console.log("[Spellcheck] Misspelled word detected: \"".concat(word, "\" (original: \"").concat(w, "\")"));
506
+ }
474
507
 
475
- case 28:
476
- _context3.next = 22;
508
+ case 31:
509
+ _iteratorNormalCompletion2 = true;
510
+ _context3.next = 24;
477
511
  break;
478
512
 
479
- case 30:
480
- _context3.next = 35;
513
+ case 34:
514
+ _context3.next = 40;
481
515
  break;
482
516
 
483
- case 32:
484
- _context3.prev = 32;
485
- _context3.t0 = _context3["catch"](20);
517
+ case 36:
518
+ _context3.prev = 36;
519
+ _context3.t0 = _context3["catch"](22);
520
+ _didIteratorError2 = true;
521
+ _iteratorError2 = _context3.t0;
486
522
 
487
- _iterator2.e(_context3.t0);
523
+ case 40:
524
+ _context3.prev = 40;
525
+ _context3.prev = 41;
488
526
 
489
- case 35:
490
- _context3.prev = 35;
527
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
528
+ _iterator2.return();
529
+ }
491
530
 
492
- _iterator2.f();
531
+ case 43:
532
+ _context3.prev = 43;
493
533
 
494
- return _context3.finish(35);
534
+ if (!_didIteratorError2) {
535
+ _context3.next = 46;
536
+ break;
537
+ }
538
+
539
+ throw _iteratorError2;
540
+
541
+ case 46:
542
+ return _context3.finish(43);
495
543
 
496
- case 38:
544
+ case 47:
545
+ return _context3.finish(40);
546
+
547
+ case 48:
497
548
  return _context3.abrupt("return", Array.from(miss));
498
549
 
499
- case 41:
500
- _context3.prev = 41;
550
+ case 51:
551
+ _context3.prev = 51;
501
552
  _context3.t1 = _context3["catch"](3);
502
553
  console.error("[Spellcheck Error] Spellcheck failed for language ".concat(lang, ":"), _context3.t1);
503
554
  console.error("[Spellcheck Error] Stack:", _context3.t1.stack);
504
555
  return _context3.abrupt("return", []);
505
556
 
506
- case 46:
557
+ case 56:
507
558
  case "end":
508
559
  return _context3.stop();
509
560
  }
510
561
  }
511
- }, _callee3, null, [[3, 41], [20, 32, 35, 38]]);
562
+ }, _callee3, null, [[3, 51], [22, 36, 40, 48], [41,, 43, 47]]);
512
563
  }));
513
564
  return _findMisspellings.apply(this, arguments);
514
565
  }
@@ -518,7 +569,9 @@ export function highlightMisspellingsInHtml(_x2) {
518
569
  }
519
570
 
520
571
  function _highlightMisspellingsInHtml() {
521
- _highlightMisspellingsInHtml = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(html) {
572
+ _highlightMisspellingsInHtml = _asyncToGenerator(
573
+ /*#__PURE__*/
574
+ _regeneratorRuntime.mark(function _callee4(html) {
522
575
  var lang,
523
576
  textForSpellcheck,
524
577
  browserLang,
@@ -593,21 +646,31 @@ function _highlightMisspellingsInHtml() {
593
646
  }
594
647
 
595
648
  var out = seg;
596
-
597
- var _iterator3 = _createForOfIteratorHelper(miss),
598
- _step3;
649
+ var _iteratorNormalCompletion3 = true;
650
+ var _didIteratorError3 = false;
651
+ var _iteratorError3 = undefined;
599
652
 
600
653
  try {
601
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
654
+ for (var _iterator3 = miss[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
602
655
  var m = _step3.value;
603
- // Use Unicode-aware boundaries: ensure preceding/following chars are not letters
604
- var re = new RegExp("(?<!\\p{L})".concat(escapeRegExp(m), "(?!\\p{L})"), 'gu');
656
+ // Use Unicode-aware word boundary pattern to support accented characters
657
+ // Standard \b doesn't work well with Unicode characters like é, č, ř, etc.
658
+ var re = createUnicodeWordBoundaryRegex(m);
605
659
  out = out.replace(re, "<span class=\"spell-error\">$&</span>");
606
660
  }
607
661
  } catch (err) {
608
- _iterator3.e(err);
662
+ _didIteratorError3 = true;
663
+ _iteratorError3 = err;
609
664
  } finally {
610
- _iterator3.f();
665
+ try {
666
+ if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
667
+ _iterator3.return();
668
+ }
669
+ } finally {
670
+ if (_didIteratorError3) {
671
+ throw _iteratorError3;
672
+ }
673
+ }
611
674
  }
612
675
 
613
676
  return out;
@@ -632,4 +695,17 @@ function _highlightMisspellingsInHtml() {
632
695
 
633
696
  function escapeRegExp(s) {
634
697
  return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
698
+ } // Create a Unicode-aware word boundary pattern
699
+ // This works better than \b for Unicode characters like é, č, ř, etc.
700
+
701
+
702
+ function createUnicodeWordBoundaryRegex(word) {
703
+ // Escape special regex characters in the word
704
+ var escaped = escapeRegExp(word); // Use a pattern that matches word boundaries with Unicode support
705
+ // Matches: start of string, non-word-char, or word-char before the word
706
+ // And: end of string, non-word-char, or word-char after the word
707
+ // The (?<=...) and (?=...) are lookbehind/lookahead assertions
708
+ // We use [^A-Za-zÀ-ÖØ-öø-ÿ\u0100-\u017FЀ-ӿ] to match non-word characters
709
+
710
+ return new RegExp("(?<=^|[^A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\xFF\\u0100-\\u017F\u0400-\u04FF])".concat(escaped, "(?=[^A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\xFF\\u0100-\\u017F\u0400-\u04FF]|$)"), 'giu');
635
711
  }