@searpent/react-image-annotate 2.3.0-cand → 2.3.0-cand-2
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 +0 -2
- 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 +110 -66
|
@@ -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-2",
|
|
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,6 +401,9 @@ 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,
|
|
@@ -443,19 +456,21 @@ function _findMisspellings() {
|
|
|
443
456
|
return _context3.abrupt("return", []);
|
|
444
457
|
|
|
445
458
|
case 16:
|
|
446
|
-
//
|
|
459
|
+
// Word extraction across common Latin + Cyrillic ranges
|
|
447
460
|
// 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;
|
|
461
|
+
// Note: Avoids Unicode property escapes (\p{L}) for compatibility with older Babel toolchain.
|
|
462
|
+
wordRegex = /[A-Za-zÀ-ÖØ-öø-ÿЀ-ӿ][A-Za-zÀ-ÖØ-öø-ÿЀ-ӿ'’-]*/g;
|
|
449
463
|
words = text.match(wordRegex) || [];
|
|
450
464
|
miss = new Set();
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
465
|
+
_iteratorNormalCompletion2 = true;
|
|
466
|
+
_didIteratorError2 = false;
|
|
467
|
+
_iteratorError2 = undefined;
|
|
468
|
+
_context3.prev = 22;
|
|
469
|
+
_iterator2 = words[Symbol.iterator]();
|
|
470
|
+
|
|
471
|
+
case 24:
|
|
472
|
+
if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
|
|
473
|
+
_context3.next = 33;
|
|
459
474
|
break;
|
|
460
475
|
}
|
|
461
476
|
|
|
@@ -463,52 +478,70 @@ function _findMisspellings() {
|
|
|
463
478
|
word = w.replace(/^'+|'+$/g, '');
|
|
464
479
|
|
|
465
480
|
if (word) {
|
|
466
|
-
_context3.next =
|
|
481
|
+
_context3.next = 29;
|
|
467
482
|
break;
|
|
468
483
|
}
|
|
469
484
|
|
|
470
|
-
return _context3.abrupt("continue",
|
|
485
|
+
return _context3.abrupt("continue", 30);
|
|
471
486
|
|
|
472
|
-
case
|
|
487
|
+
case 29:
|
|
473
488
|
if (!spell.correct(word)) miss.add(word);
|
|
474
489
|
|
|
475
|
-
case 28:
|
|
476
|
-
_context3.next = 22;
|
|
477
|
-
break;
|
|
478
|
-
|
|
479
490
|
case 30:
|
|
480
|
-
|
|
491
|
+
_iteratorNormalCompletion2 = true;
|
|
492
|
+
_context3.next = 24;
|
|
481
493
|
break;
|
|
482
494
|
|
|
483
|
-
case
|
|
484
|
-
_context3.
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
_iterator2.e(_context3.t0);
|
|
495
|
+
case 33:
|
|
496
|
+
_context3.next = 39;
|
|
497
|
+
break;
|
|
488
498
|
|
|
489
499
|
case 35:
|
|
490
500
|
_context3.prev = 35;
|
|
501
|
+
_context3.t0 = _context3["catch"](22);
|
|
502
|
+
_didIteratorError2 = true;
|
|
503
|
+
_iteratorError2 = _context3.t0;
|
|
491
504
|
|
|
492
|
-
|
|
505
|
+
case 39:
|
|
506
|
+
_context3.prev = 39;
|
|
507
|
+
_context3.prev = 40;
|
|
493
508
|
|
|
494
|
-
return
|
|
509
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
510
|
+
_iterator2.return();
|
|
511
|
+
}
|
|
495
512
|
|
|
496
|
-
case
|
|
513
|
+
case 42:
|
|
514
|
+
_context3.prev = 42;
|
|
515
|
+
|
|
516
|
+
if (!_didIteratorError2) {
|
|
517
|
+
_context3.next = 45;
|
|
518
|
+
break;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
throw _iteratorError2;
|
|
522
|
+
|
|
523
|
+
case 45:
|
|
524
|
+
return _context3.finish(42);
|
|
525
|
+
|
|
526
|
+
case 46:
|
|
527
|
+
return _context3.finish(39);
|
|
528
|
+
|
|
529
|
+
case 47:
|
|
497
530
|
return _context3.abrupt("return", Array.from(miss));
|
|
498
531
|
|
|
499
|
-
case
|
|
500
|
-
_context3.prev =
|
|
532
|
+
case 50:
|
|
533
|
+
_context3.prev = 50;
|
|
501
534
|
_context3.t1 = _context3["catch"](3);
|
|
502
535
|
console.error("[Spellcheck Error] Spellcheck failed for language ".concat(lang, ":"), _context3.t1);
|
|
503
536
|
console.error("[Spellcheck Error] Stack:", _context3.t1.stack);
|
|
504
537
|
return _context3.abrupt("return", []);
|
|
505
538
|
|
|
506
|
-
case
|
|
539
|
+
case 55:
|
|
507
540
|
case "end":
|
|
508
541
|
return _context3.stop();
|
|
509
542
|
}
|
|
510
543
|
}
|
|
511
|
-
}, _callee3, null, [[3,
|
|
544
|
+
}, _callee3, null, [[3, 50], [22, 35, 39, 47], [40,, 42, 46]]);
|
|
512
545
|
}));
|
|
513
546
|
return _findMisspellings.apply(this, arguments);
|
|
514
547
|
}
|
|
@@ -518,7 +551,9 @@ export function highlightMisspellingsInHtml(_x2) {
|
|
|
518
551
|
}
|
|
519
552
|
|
|
520
553
|
function _highlightMisspellingsInHtml() {
|
|
521
|
-
_highlightMisspellingsInHtml = _asyncToGenerator(
|
|
554
|
+
_highlightMisspellingsInHtml = _asyncToGenerator(
|
|
555
|
+
/*#__PURE__*/
|
|
556
|
+
_regeneratorRuntime.mark(function _callee4(html) {
|
|
522
557
|
var lang,
|
|
523
558
|
textForSpellcheck,
|
|
524
559
|
browserLang,
|
|
@@ -593,21 +628,30 @@ function _highlightMisspellingsInHtml() {
|
|
|
593
628
|
}
|
|
594
629
|
|
|
595
630
|
var out = seg;
|
|
596
|
-
|
|
597
|
-
var
|
|
598
|
-
|
|
631
|
+
var _iteratorNormalCompletion3 = true;
|
|
632
|
+
var _didIteratorError3 = false;
|
|
633
|
+
var _iteratorError3 = undefined;
|
|
599
634
|
|
|
600
635
|
try {
|
|
601
|
-
for (_iterator3.
|
|
636
|
+
for (var _iterator3 = miss[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
602
637
|
var m = _step3.value;
|
|
603
|
-
// Use
|
|
604
|
-
var re = new RegExp("
|
|
638
|
+
// Use word boundaries instead of Unicode property escapes for compatibility
|
|
639
|
+
var re = new RegExp("\\b".concat(escapeRegExp(m), "\\b"), 'gi');
|
|
605
640
|
out = out.replace(re, "<span class=\"spell-error\">$&</span>");
|
|
606
641
|
}
|
|
607
642
|
} catch (err) {
|
|
608
|
-
|
|
643
|
+
_didIteratorError3 = true;
|
|
644
|
+
_iteratorError3 = err;
|
|
609
645
|
} finally {
|
|
610
|
-
|
|
646
|
+
try {
|
|
647
|
+
if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
|
|
648
|
+
_iterator3.return();
|
|
649
|
+
}
|
|
650
|
+
} finally {
|
|
651
|
+
if (_didIteratorError3) {
|
|
652
|
+
throw _iteratorError3;
|
|
653
|
+
}
|
|
654
|
+
}
|
|
611
655
|
}
|
|
612
656
|
|
|
613
657
|
return out;
|