@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.
- package/Annotator/examplePhotos.js +29 -29
- package/Annotator/examplePhotos_repr.js +28 -28
- package/Annotator/index.js +21 -15
- package/Annotator/index.story_bugdemo_15_1.js +51 -46
- package/Annotator/index.story_repr.js +64 -51
- package/Annotator/reducers/combine-reducers.js +3 -18
- package/Annotator/reducers/convert-expanding-line-to-polygon.js +16 -15
- package/Annotator/reducers/get-implied-video-regions.js +30 -18
- package/ClassSelectionMenu/index.js +8 -8
- package/Crosshairs/index.js +2 -2
- package/DebugSidebarBox/index.js +4 -4
- package/DemoSite/Editor.js +15 -15
- package/DemoSite/ErrorBoundaryDialog.js +5 -3
- package/DemoSite/index.js +3 -3
- package/Editor/annotation-plugin/annotation.js +3 -1
- package/Editor/editor.css +2 -4
- package/Editor/index.js +44 -13
- package/Editor/index_bugdemo_15_1.js +17 -13
- package/Editor/readOnly.js +403 -47
- package/Errorer/index.js +2 -2
- package/FullImageSegmentationAnnotator/index.js +1 -1
- package/GroupSelectorSidebarBox/index.js +7 -7
- package/GroupsEditorSidebarBox/index.js +11 -11
- package/HelpSidebarBox/index.js +4 -4
- package/HighlightBox/index.js +3 -3
- package/HistorySidebarBox/index.js +8 -8
- package/ImageCanvas/index.js +16 -16
- package/ImageMask/index.js +1 -1
- package/ImageSelectorSidebarBox/index.js +7 -7
- package/KeyframeTimeline/index.js +14 -30
- package/KeyframesSelectorSidebarBox/index.js +8 -8
- package/LandingPage/index.js +12 -12
- package/Locker/index.js +2 -2
- package/MainLayout/RightSidebarItemsWrapper.js +1 -1
- package/MainLayout/icon-dictionary.js +11 -11
- package/MainLayout/index.js +23 -25
- package/MainLayout/index_bugdemo_15_1.js +23 -25
- package/MetadataEditorSidebarBox/index.js +18 -18
- package/MetadataEditorSidebarBox/index_14_01_25.js +18 -18
- package/MetadataEditorSidebarBox/index_repr.js +21 -21
- package/PageSelector/index.js +21 -21
- package/PointDistances/index.js +4 -4
- package/PreventScrollToParents/index.js +3 -3
- package/RegionLabel/index.js +24 -24
- package/RegionSelectAndTransformBoxes/index.js +8 -8
- package/RegionSelectorSidebarBox/index.js +33 -33
- package/RegionShapes/index.js +22 -22
- package/RegionTags/index.js +6 -6
- package/SettingsDialog/index.js +4 -4
- package/SettingsProvider/index.js +1 -1
- package/Shortcuts/ShortcutField.js +3 -3
- package/Shortcuts/index.js +2 -2
- package/ShortcutsManager/index.js +9 -9
- package/Sidebar/index.js +7 -7
- package/SidebarBoxContainer/index.js +3 -3
- package/SmallToolButton/index.js +2 -2
- package/TagsSidebarBox/index.js +6 -6
- package/TaskDescriptionSidebarBox/index.js +4 -4
- package/Theme/index.js +2 -2
- package/VideoOrImageCanvasBackground/index.js +5 -5
- package/package.json +8 -2
- package/utils/blocks-to-article.js +3 -3
- package/utils/get-landmarks-with-transform.js +15 -13
- 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
|
|
135
|
-
if (error) return
|
|
136
|
-
return
|
|
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 ?
|
|
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
|
-
})) :
|
|
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
|
|
38
|
-
labelName =
|
|
39
|
-
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
|
|
16
|
-
|
|
7
|
+
var _iteratorNormalCompletion = true;
|
|
8
|
+
var _didIteratorError = false;
|
|
9
|
+
var _iteratorError = undefined;
|
|
17
10
|
|
|
18
11
|
try {
|
|
19
|
-
for (_iterator.
|
|
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
|
-
|
|
25
|
+
_didIteratorError = true;
|
|
26
|
+
_iteratorError = err;
|
|
33
27
|
} finally {
|
|
34
|
-
|
|
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(
|
|
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(
|
|
82
|
-
|
|
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
|
-
|
|
94
|
-
nspell =
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
affRes =
|
|
111
|
-
dicRes =
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
affBuf =
|
|
133
|
-
dicBuf =
|
|
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
|
|
277
|
-
|
|
274
|
+
var _iteratorNormalCompletion = true;
|
|
275
|
+
var _didIteratorError = false;
|
|
276
|
+
var _iteratorError = undefined;
|
|
278
277
|
|
|
279
278
|
try {
|
|
280
|
-
for (_iterator.
|
|
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
|
-
|
|
291
|
+
_didIteratorError = true;
|
|
292
|
+
_iteratorError = err;
|
|
293
293
|
} finally {
|
|
294
|
-
|
|
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(
|
|
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
|
-
//
|
|
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
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
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 =
|
|
493
|
+
_context3.next = 29;
|
|
467
494
|
break;
|
|
468
495
|
}
|
|
469
496
|
|
|
470
|
-
return _context3.abrupt("continue",
|
|
497
|
+
return _context3.abrupt("continue", 31);
|
|
471
498
|
|
|
472
|
-
case
|
|
473
|
-
|
|
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
|
|
476
|
-
|
|
508
|
+
case 31:
|
|
509
|
+
_iteratorNormalCompletion2 = true;
|
|
510
|
+
_context3.next = 24;
|
|
477
511
|
break;
|
|
478
512
|
|
|
479
|
-
case
|
|
480
|
-
_context3.next =
|
|
513
|
+
case 34:
|
|
514
|
+
_context3.next = 40;
|
|
481
515
|
break;
|
|
482
516
|
|
|
483
|
-
case
|
|
484
|
-
_context3.prev =
|
|
485
|
-
_context3.t0 = _context3["catch"](
|
|
517
|
+
case 36:
|
|
518
|
+
_context3.prev = 36;
|
|
519
|
+
_context3.t0 = _context3["catch"](22);
|
|
520
|
+
_didIteratorError2 = true;
|
|
521
|
+
_iteratorError2 = _context3.t0;
|
|
486
522
|
|
|
487
|
-
|
|
523
|
+
case 40:
|
|
524
|
+
_context3.prev = 40;
|
|
525
|
+
_context3.prev = 41;
|
|
488
526
|
|
|
489
|
-
|
|
490
|
-
|
|
527
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
528
|
+
_iterator2.return();
|
|
529
|
+
}
|
|
491
530
|
|
|
492
|
-
|
|
531
|
+
case 43:
|
|
532
|
+
_context3.prev = 43;
|
|
493
533
|
|
|
494
|
-
|
|
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
|
|
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
|
|
500
|
-
_context3.prev =
|
|
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
|
|
557
|
+
case 56:
|
|
507
558
|
case "end":
|
|
508
559
|
return _context3.stop();
|
|
509
560
|
}
|
|
510
561
|
}
|
|
511
|
-
}, _callee3, null, [[3,
|
|
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(
|
|
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
|
|
598
|
-
|
|
649
|
+
var _iteratorNormalCompletion3 = true;
|
|
650
|
+
var _didIteratorError3 = false;
|
|
651
|
+
var _iteratorError3 = undefined;
|
|
599
652
|
|
|
600
653
|
try {
|
|
601
|
-
for (_iterator3.
|
|
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
|
|
604
|
-
|
|
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
|
-
|
|
662
|
+
_didIteratorError3 = true;
|
|
663
|
+
_iteratorError3 = err;
|
|
609
664
|
} finally {
|
|
610
|
-
|
|
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
|
}
|