@xom11/whiteboard 0.27.0 → 0.28.0

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 (60) hide show
  1. package/dist/ai.d.mts +1 -1
  2. package/dist/ai.d.ts +1 -1
  3. package/dist/ai.js +54 -23
  4. package/dist/ai.js.map +1 -1
  5. package/dist/ai.mjs +54 -23
  6. package/dist/ai.mjs.map +1 -1
  7. package/dist/catalog.json +4 -4
  8. package/dist/{chunk-D5JLJ3PT.mjs → chunk-5JM35CXV.mjs} +4 -4
  9. package/dist/{chunk-D5JLJ3PT.mjs.map → chunk-5JM35CXV.mjs.map} +1 -1
  10. package/dist/{chunk-KYMBUTPO.mjs → chunk-BU5KLO3P.mjs} +3 -3
  11. package/dist/{chunk-KYMBUTPO.mjs.map → chunk-BU5KLO3P.mjs.map} +1 -1
  12. package/dist/{chunk-AYJPOHCI.mjs → chunk-H22OZYTW.mjs} +3 -3
  13. package/dist/{chunk-AYJPOHCI.mjs.map → chunk-H22OZYTW.mjs.map} +1 -1
  14. package/dist/{chunk-I3L56GVH.mjs → chunk-OQIQNKPQ.mjs} +3 -3
  15. package/dist/{chunk-I3L56GVH.mjs.map → chunk-OQIQNKPQ.mjs.map} +1 -1
  16. package/dist/{chunk-KZGPSTZI.mjs → chunk-QCZVFEN4.mjs} +4 -4
  17. package/dist/{chunk-KZGPSTZI.mjs.map → chunk-QCZVFEN4.mjs.map} +1 -1
  18. package/dist/{chunk-4ETJ4CDY.mjs → chunk-QRUAEXLR.mjs} +4 -4
  19. package/dist/{chunk-4ETJ4CDY.mjs.map → chunk-QRUAEXLR.mjs.map} +1 -1
  20. package/dist/{chunk-HLAOGXEK.mjs → chunk-V3YJ6JFL.mjs} +3 -3
  21. package/dist/{chunk-HLAOGXEK.mjs.map → chunk-V3YJ6JFL.mjs.map} +1 -1
  22. package/dist/{chunk-D5LWSN2Y.mjs → chunk-ZTQBUKLJ.mjs} +30 -13
  23. package/dist/chunk-ZTQBUKLJ.mjs.map +1 -0
  24. package/dist/geometry-2d.d.mts +1 -1
  25. package/dist/geometry-2d.d.ts +1 -1
  26. package/dist/geometry-2d.js +143 -33
  27. package/dist/geometry-2d.js.map +1 -1
  28. package/dist/geometry-2d.mjs +3 -3
  29. package/dist/geometry-3d.d.mts +1 -1
  30. package/dist/geometry-3d.d.ts +1 -1
  31. package/dist/geometry-3d.js +28 -11
  32. package/dist/geometry-3d.js.map +1 -1
  33. package/dist/geometry-3d.mjs +3 -3
  34. package/dist/graph-2d.d.mts +1 -1
  35. package/dist/graph-2d.d.ts +1 -1
  36. package/dist/graph-2d.js +28 -11
  37. package/dist/graph-2d.js.map +1 -1
  38. package/dist/graph-2d.mjs +3 -3
  39. package/dist/{host-M26FS244.mjs → host-2ISGVO7O.mjs} +5 -5
  40. package/dist/{host-M26FS244.mjs.map → host-2ISGVO7O.mjs.map} +1 -1
  41. package/dist/{host-HAYCJJ2T.mjs → host-4P766V4J.mjs} +110 -27
  42. package/dist/host-4P766V4J.mjs.map +1 -0
  43. package/dist/{host-LTJHAY5A.mjs → host-HOSJHQ5H.mjs} +6 -6
  44. package/dist/{host-LTJHAY5A.mjs.map → host-HOSJHQ5H.mjs.map} +1 -1
  45. package/dist/index.d.mts +9 -4
  46. package/dist/index.d.ts +9 -4
  47. package/dist/index.js +147 -35
  48. package/dist/index.js.map +1 -1
  49. package/dist/index.mjs +17 -15
  50. package/dist/index.mjs.map +1 -1
  51. package/dist/latex.d.mts +1 -1
  52. package/dist/latex.d.ts +1 -1
  53. package/dist/serialize-N4G6RFBB.mjs +9 -0
  54. package/dist/{serialize-C3LSUMSA.mjs.map → serialize-N4G6RFBB.mjs.map} +1 -1
  55. package/dist/{types-zc_Pa0mp.d.mts → types-BHYC2Fiw.d.mts} +25 -1
  56. package/dist/{types-zc_Pa0mp.d.ts → types-BHYC2Fiw.d.ts} +25 -1
  57. package/package.json +1 -1
  58. package/dist/chunk-D5LWSN2Y.mjs.map +0 -1
  59. package/dist/host-HAYCJJ2T.mjs.map +0 -1
  60. package/dist/serialize-C3LSUMSA.mjs +0 -9
package/dist/ai.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { b as State, D as DslInputT, a as AiFigureUiResult } from './types-zc_Pa0mp.mjs';
1
+ import { c as State, D as DslInputT, b as AiFigureUiResult } from './types-BHYC2Fiw.mjs';
2
2
  import { z } from 'zod';
3
3
  import { A as AIProvider, P as ProviderRequest, a as ProviderOutput, V as VisionRequest, S as SelectProviderOptions, I as ImagePart } from './handleExtractProblem-C-U5KluK.mjs';
4
4
  export { b as ExtractProblemFailure, c as ExtractProblemOptions, d as ExtractProblemOutcome, e as ExtractProblemSuccess, E as ExtractUiResult, H as HandleExtractProblemOptions, f as ProviderTokenUsage, g as extractProblemFromImage, h as handleExtractProblem, p as pickVisionModel, s as selectProvider } from './handleExtractProblem-C-U5KluK.mjs';
package/dist/ai.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { b as State, D as DslInputT, a as AiFigureUiResult } from './types-zc_Pa0mp.js';
1
+ import { c as State, D as DslInputT, b as AiFigureUiResult } from './types-BHYC2Fiw.js';
2
2
  import { z } from 'zod';
3
3
  import { A as AIProvider, P as ProviderRequest, a as ProviderOutput, V as VisionRequest, S as SelectProviderOptions, I as ImagePart } from './handleExtractProblem-C-U5KluK.js';
4
4
  export { b as ExtractProblemFailure, c as ExtractProblemOptions, d as ExtractProblemOutcome, e as ExtractProblemSuccess, E as ExtractUiResult, H as HandleExtractProblemOptions, f as ProviderTokenUsage, g as extractProblemFromImage, h as handleExtractProblem, p as pickVisionModel, s as selectProvider } from './handleExtractProblem-C-U5KluK.js';
package/dist/ai.js CHANGED
@@ -3359,6 +3359,7 @@ var GEOMETRY_KEYWORDS = [
3359
3359
  // Base shapes
3360
3360
  "tam gi\xE1c",
3361
3361
  "\u0111\u01B0\u1EDDng tr\xF2n",
3362
+ "\u0111\u01B0\u01A1ng tr\xF2n",
3362
3363
  "h\xECnh ch\u1EEF nh\u1EADt",
3363
3364
  "h\xECnh vu\xF4ng",
3364
3365
  "h\xECnh b\xECnh h\xE0nh",
@@ -3373,11 +3374,13 @@ var GEOMETRY_KEYWORDS = [
3373
3374
  "b\xE1n k\xEDnh",
3374
3375
  "t\xE2m",
3375
3376
  "\u0111\u01B0\u1EDDng k\xEDnh",
3377
+ "\u0111\u01B0\u01A1ng k\xEDnh",
3376
3378
  // Segments / on-segment
3377
3379
  "\u0111o\u1EA1n",
3378
3380
  // Derived points
3379
3381
  "trung \u0111i\u1EC3m",
3380
3382
  "ch\xE2n \u0111\u01B0\u1EDDng cao",
3383
+ "ch\xE2n \u0111\u01B0\u01A1ng cao",
3381
3384
  "h\xECnh chi\u1EBFu",
3382
3385
  "tr\u1ECDng t\xE2m",
3383
3386
  "tr\u1EF1c t\xE2m",
@@ -3385,6 +3388,7 @@ var GEOMETRY_KEYWORDS = [
3385
3388
  "t\xE2m ngo\u1EA1i ti\u1EBFp",
3386
3389
  // Cevian names
3387
3390
  "\u0111\u01B0\u1EDDng cao",
3391
+ "\u0111\u01B0\u01A1ng cao",
3388
3392
  "trung tuy\u1EBFn",
3389
3393
  "ph\xE2n gi\xE1c",
3390
3394
  "trung tr\u1EF1c",
@@ -3421,6 +3425,8 @@ var GEOMETRY_KEYWORDS = [
3421
3425
  "vu\xF4ng g\xF3c",
3422
3426
  "giao \u0111i\u1EC3m",
3423
3427
  "c\u1EAFt",
3428
+ "\u0111\u01B0\u1EDDng th\u1EB3ng",
3429
+ "\u0111\u01B0\u01A1ng th\u1EB3ng",
3424
3430
  // Ký hiệu (symbol-only phrasing tương đương từ chữ): "⊥" ≡ "vuông góc".
3425
3431
  // perpFoot rule đã nhận "⊥" ở tầng construct (PERP_DRAW), nhưng gate
3426
3432
  // hasGeometry trước đây CHỈ nhận chữ "vuông góc" → clause mà "⊥" là tín hiệu
@@ -3586,6 +3592,8 @@ function pairFromToken(token) {
3586
3592
  return m ? [m[1], m[2]] : [];
3587
3593
  }
3588
3594
  var SIDE_PREFIX = "(?:c\u1EA1nh(?:\\s+huy\u1EC1n)?\\s+|\u0111o\u1EA1n(?:\\s+th\u1EB3ng)?\\s+)?";
3595
+ var DUONG_KW = "[\u0110\u0111]\u01B0[\u1EDD\u01A1]ng";
3596
+ var CIRCLE_KW = DUONG_KW + "\\s*tr\xF2n";
3589
3597
 
3590
3598
  // src/stamps/geometry-2d/ai/rules/triangle.ts
3591
3599
  var TRI_G = /tam giác\s+(?:(đều|vuông|cân)\s+)?([A-Z])([A-Z])([A-Z])(?![A-Z])/gu;
@@ -4560,12 +4568,15 @@ var centersRule = {
4560
4568
  };
4561
4569
 
4562
4570
  // src/stamps/geometry-2d/ai/rules/perpFoot.ts
4563
- var PREFILTER5 = /hình\s*chiếu|chân\s+(?:của\s+)?đường\s+(?:cao|vuông\s*góc)|⊥|vuông\s*góc/u;
4571
+ var PREFILTER5 = new RegExp(
4572
+ "h\xECnh\\s*chi\u1EBFu|ch\xE2n\\s+(?:c\u1EE7a\\s+)?" + DUONG_KW + "\\s+(?:cao|vu\xF4ng\\s*g\xF3c)|\u22A5|vu\xF4ng\\s*g\xF3c",
4573
+ "u"
4574
+ );
4564
4575
  var PREFILTER_EN = /projection|perpendicular|foot\s+of/i;
4565
- var LINE = "(?:\u0111\u01B0\u1EDDng\\s*th\u1EB3ng\\s+|c\u1EA1nh\\s+|\u0111o\u1EA1n\\s+)?([A-Z]{1,2})(?![A-Z])";
4576
+ var LINE = "(?:" + DUONG_KW + "\\s*th\u1EB3ng\\s+|c\u1EA1nh\\s+|\u0111o\u1EA1n\\s+)?([A-Z]{1,2})(?![A-Z])";
4566
4577
  var PREP = "(?:tr\xEAn|l\xEAn|xu\u1ED1ng|\u0111\u1EBFn|t\u1EDBi)";
4567
4578
  var PROJ_CORE = `h\xECnh\\s*chi\u1EBFu\\s+(?:vu\xF4ng\\s*g\xF3c\\s+)?(?:c\u1EE7a\\s+)?([A-Z])\\s+${PREP}\\s+${LINE}`;
4568
- var FOOT_CORE = `ch\xE2n\\s+(?:c\u1EE7a\\s+)?\u0111\u01B0\u1EDDng\\s+(?:vu\xF4ng\\s*g\xF3c|cao)\\s*(?:h\u1EA1\\s+|k\u1EBB\\s+|v\u1EBD\\s+|d\u1EF1ng\\s+)?(?:t\u1EEB\\s+)?([A-Z])\\s+${PREP}\\s+${LINE}`;
4579
+ var FOOT_CORE = `ch\xE2n\\s+(?:c\u1EE7a\\s+)?${DUONG_KW}\\s+(?:vu\xF4ng\\s*g\xF3c|cao)\\s*(?:h\u1EA1\\s+|k\u1EBB\\s+|v\u1EBD\\s+|d\u1EF1ng\\s+)?(?:t\u1EEB\\s+)?([A-Z])\\s+${PREP}\\s+${LINE}`;
4569
4580
  var LANLUOT = new RegExp(
4570
4581
  `([A-Z])(?:[\u2032'])?\\s*,\\s*([A-Z])(?:[\u2032'])?\\s+l\u1EA7n\\s+l\u01B0\u1EE3t\\s+l\xE0\\s+(?:${PROJ_CORE}|${FOOT_CORE})\\s+v\xE0\\s+(?:c\u1EE7a\\s+|t\u1EEB\\s+)?([A-Z])\\s+${PREP}\\s+${LINE}`,
4571
4582
  "gu"
@@ -4692,13 +4703,22 @@ var perpFootRule = {
4692
4703
  };
4693
4704
 
4694
4705
  // src/stamps/geometry-2d/ai/rules/circleRadius.ts
4695
- var CENTER_RADIUS_WORDS_G = /đường\s*tròn\s*(?:\(\s*)?(?:tâm\s+)?([A-Z])(?:\s*\))?(?:(?!đường|và\s)[^A-Z])*?bán\s*kính\s+(\d+(?:[.,]\d+)?)/gu;
4696
- var CENTER_THROUGH_G = /đường\s*tròn\s*(?:\(\s*)?(?:tâm\s+)?([A-Z])(?:\s*\))?\s+đi\s+qua\s+([A-Z])/gu;
4706
+ var CENTER_RADIUS_WORDS_G = new RegExp(
4707
+ CIRCLE_KW + "\\s*(?:\\(\\s*)?(?:t\xE2m\\s+)?([^\\s;,).:]+)(?:\\s*\\))?(?:(?!\u0111\u01B0\u1EDDng|v\xE0\\s)[^A-Z])*?b\xE1n\\s*k\xEDnh\\s+(\\d+(?:[.,]\\d+)?)",
4708
+ "gu"
4709
+ );
4710
+ var CENTER_THROUGH_G = new RegExp(
4711
+ CIRCLE_KW + "\\s*(?:\\(\\s*)?(?:t\xE2m\\s+)?([^\\s;,).:]+)(?:\\s*\\))?\\s+\u0111i\\s+qua\\s+([A-Z])",
4712
+ "gu"
4713
+ );
4697
4714
  var THROUGH_MULTI = /đi\s+qua\s+[A-Z]\s*(?:và|,)\s*[A-Z]/u;
4698
4715
  var CENTER_RADIUS_PAREN_G = /\(\s*([A-Z])\s*[;,]\s*(\d+(?:[.,]\d+)?)\s*\)/gu;
4699
4716
  var SYMBOLIC_RADIUS = 3;
4700
4717
  var CENTER_RADIUS_LETTER_PAREN_G = /\(\s*([A-Z])\s*[;,]\s*[Rr]\s*\)/gu;
4701
- var CENTER_RADIUS_LETTER_WORDS_G = /đường\s*tròn\s*(?:\(\s*)?(?:tâm\s+)?([A-Z])(?:\s*\))?(?:(?!đường|và\s)[^A-Z])*?bán\s*kính\s+[Rr](?![A-Za-z])/gu;
4718
+ var CENTER_RADIUS_LETTER_WORDS_G = new RegExp(
4719
+ CIRCLE_KW + "\\s*(?:\\(\\s*)?(?:t\xE2m\\s+)?([^\\s;,).:]+)(?:\\s*\\))?(?:(?!\u0111\u01B0\u1EDDng|v\xE0\\s)[^A-Z])*?b\xE1n\\s*k\xEDnh\\s+[Rr](?![A-Za-z])",
4720
+ "gu"
4721
+ );
4702
4722
  var CIRCLE_CENTER_EN = "[Cc]ircle\\s+(?:with\\s+|of\\s+)?cent(?:er|re)(?:ed)?\\s+(?:at\\s+|of\\s+)?([A-Z])(?![A-Za-z])";
4703
4723
  var EN_GAP = "(?:(?![Cc]ircle)[^A-Z])*?";
4704
4724
  var CIRCLE_CR_EN_G = new RegExp(
@@ -4860,21 +4880,21 @@ var circleRadiusRule = {
4860
4880
 
4861
4881
  // src/stamps/geometry-2d/ai/rules/circleTriangle.ts
4862
4882
  var HAS_INSCRIBE = /(?<!\p{L})(?:nội|ngoại)\s*tiếp(?!\p{L})/iu;
4863
- var CENTER2 = "(?:\\(\\s*([A-Z])\\s*\\)|t\xE2m\\s+([A-Z]))?";
4883
+ var CENTER2 = "(?:\\(\\s*([^\\s;,).:]+)\\s*\\)|t\xE2m\\s+([A-Z]))?";
4864
4884
  var CIRCUM_TRI = new RegExp(
4865
- "\u0111\u01B0\u1EDDng\\s*tr\xF2n\\s*" + CENTER2 + "\\s*ngo\u1EA1i\\s*ti\u1EBFp\\s+tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])",
4885
+ CIRCLE_KW + "\\s*" + CENTER2 + "\\s*ngo\u1EA1i\\s*ti\u1EBFp\\s+tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])",
4866
4886
  "giu"
4867
4887
  );
4868
4888
  var INCIRCLE_TRI = new RegExp(
4869
- "\u0111\u01B0\u1EDDng\\s*tr\xF2n\\s*" + CENTER2 + "\\s*n\u1ED9i\\s*ti\u1EBFp\\s+tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])",
4889
+ CIRCLE_KW + "\\s*" + CENTER2 + "\\s*n\u1ED9i\\s*ti\u1EBFp\\s+tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])",
4870
4890
  "giu"
4871
4891
  );
4872
4892
  var TRI_INSCRIBED_IN_CIRCLE = new RegExp(
4873
- "tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])[^.]{0,40}?n\u1ED9i\\s*ti\u1EBFp\\s+(?:trong\\s+)?\u0111\u01B0\u1EDDng\\s*tr\xF2n\\s*" + CENTER2,
4893
+ "tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])[^.]{0,40}?n\u1ED9i\\s*ti\u1EBFp\\s+(?:trong\\s+)?" + CIRCLE_KW + "\\s*" + CENTER2,
4874
4894
  "giu"
4875
4895
  );
4876
4896
  var TRI_CIRCUMSCRIBES_CIRCLE = new RegExp(
4877
- "tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])[^.]{0,40}?ngo\u1EA1i\\s*ti\u1EBFp\\s+\u0111\u01B0\u1EDDng\\s*tr\xF2n\\s*" + CENTER2,
4897
+ "tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])[^.]{0,40}?ngo\u1EA1i\\s*ti\u1EBFp\\s+" + CIRCLE_KW + "\\s*" + CENTER2,
4878
4898
  "giu"
4879
4899
  );
4880
4900
  var TRI_INSCRIBED_IN_PAREN = new RegExp(
@@ -4885,7 +4905,7 @@ var TRI_CIRCUMSCRIBES_PAREN = new RegExp(
4885
4905
  "tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])[^.]{0,40}?ngo\u1EA1i\\s*ti\u1EBFp\\s+\\(\\s*([A-Z])\\s*\\)",
4886
4906
  "giu"
4887
4907
  );
4888
- var PAREN_CENTER = "(?:\u0111\u01B0\u1EDDng\\s*tr\xF2n\\s*)?\\(\\s*([A-Z])\\s*[;,]\\s*(?![^)]*[A-Z]\\s*[;,])[^()]*?\\)\\s*";
4908
+ var PAREN_CENTER = "(?:" + CIRCLE_KW + "\\s*)?\\(\\s*([A-Z])\\s*[;,]\\s*(?![^)]*[A-Z]\\s*[;,])[^()]*?\\)\\s*";
4889
4909
  var CIRCUM_TRI_PAREN = new RegExp(
4890
4910
  PAREN_CENTER + "ngo\u1EA1i\\s*ti\u1EBFp\\s+tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])",
4891
4911
  "giu"
@@ -5768,7 +5788,7 @@ var ninePointRule = {
5768
5788
 
5769
5789
  // src/stamps/geometry-2d/ai/rules/diameterCirclePairwise.ts
5770
5790
  var CIRCLE_CENTER2 = /\(\s*([A-Z])\s*\)/u;
5771
- var KW_DIAMETER = /đường kính/u;
5791
+ var KW_DIAMETER = new RegExp(DUONG_KW + "\\s*k\xEDnh", "u");
5772
5792
  var KW_PAIRWISE = /đôi một|cắt nhau/u;
5773
5793
  var APEX_THETA = 2;
5774
5794
  var OTHER_THETAS = [5.5, 4, 0.6, 3.3, 1.1, 5];
@@ -5776,7 +5796,7 @@ function parse(problem) {
5776
5796
  const cm = CIRCLE_CENTER2.exec(problem);
5777
5797
  if (!cm) return void 0;
5778
5798
  const center = cm[1];
5779
- const dm = /đường kính\s+([^.;\n]*)/u.exec(problem);
5799
+ const dm = new RegExp(DUONG_KW + "\\s*k\xEDnh\\s+([^.;\n]*)", "u").exec(problem);
5780
5800
  if (!dm) return void 0;
5781
5801
  let region = dm[1];
5782
5802
  const cut = region.search(/đôi một|cắt nhau/u);
@@ -5901,7 +5921,7 @@ var angleBisectorFootRule = {
5901
5921
  };
5902
5922
 
5903
5923
  // src/stamps/geometry-2d/ai/rules/intersection.ts
5904
- var REF = "(?:\u0111\u01B0\u1EDDng\\s*th\u1EB3ng\\s+|\u0111o\u1EA1n(?:\\s+th\u1EB3ng)?\\s+|tia\\s+|c\u1EA1nh\\s+)?([A-Z]{2})(?![A-Z])";
5924
+ var REF = "(?:" + DUONG_KW + "\\s*th\u1EB3ng\\s+|\u0111o\u1EA1n(?:\\s+th\u1EB3ng)?\\s+|tia\\s+|c\u1EA1nh\\s+)?([A-Z]\\s*[A-Z])(?![A-Z])";
5905
5925
  var CONN = "(?:v\xE0|v\u1EDBi)";
5906
5926
  var GIAO_DIEM = new RegExp(`giao\\s*\u0111i\u1EC3m\\s+(?:c\u1EE7a\\s+)?${REF}\\s*${CONN}\\s*${REF}`, "gu");
5907
5927
  var CAT_TAI = new RegExp(`${REF}\\s+c\u1EAFt\\s+${REF}\\s+t\u1EA1i\\s+([A-Z])(?![A-Z])`, "gu");
@@ -5916,6 +5936,8 @@ var DISTRIB_TWO = new RegExp(
5916
5936
  var NAME_BEFORE6 = /([A-Z])(?:['′]?)\s+là\s+$/u;
5917
5937
  var PREFILTER8 = /giao\s*điểm|cắt|giao\s+nhau/u;
5918
5938
  function makeIntent(name, ref1, ref2) {
5939
+ ref1 = ref1.replace(/\s+/g, "");
5940
+ ref2 = ref2.replace(/\s+/g, "");
5919
5941
  const ends = [ref1[0], ref1[1], ref2[0], ref2[1]];
5920
5942
  if (new Set(ends).size !== 4) return null;
5921
5943
  if (ends.includes(name)) return null;
@@ -5961,15 +5983,15 @@ var intersectionRule = {
5961
5983
  };
5962
5984
 
5963
5985
  // src/stamps/geometry-2d/ai/rules/chord.ts
5964
- var CIRCLE_WORDS2 = /đường\s*tròn\s*(?:\(\s*)?(?:tâm\s+)?([A-Z])(?![A-Z])/u;
5965
- var CIRCLE_PAREN2 = /\(\s*([A-Z])\s*\)/u;
5986
+ var CIRCLE_WORDS2 = new RegExp(CIRCLE_KW + "\\s*(?:\\(\\s*)?(?:t\xE2m\\s+)?([^\\s;,).:]+)(?![A-Z])", "u");
5987
+ var CIRCLE_PAREN2 = /\(\s*([^\\s;,).:]+)\s*\)/u;
5966
5988
  var CHORD_FWD = /[Dd]ây\s+(?:cung\s+)?([A-Z])([A-Z])(?![A-Z])/gu;
5967
5989
  var CHORD_REV = /([A-Z])([A-Z])(?![A-Z])\s+là\s+(?:một\s+)?dây(?:\s+cung)?(?!\p{L})/gu;
5968
5990
  var THETA_A = 2.3;
5969
5991
  var THETA_B = 0.7;
5970
5992
  var PREFILTER9 = /[Dd]ây/u;
5971
5993
  function findCircleClauseId(clauses, circle) {
5972
- const frag = new RegExp(`\u0111\u01B0\u1EDDng\\s*tr\xF2n|\\(\\s*${circle}\\s*\\)`, "u");
5994
+ const frag = new RegExp(CIRCLE_KW + `|\\(\\s*${circle}\\s*\\)`, "u");
5973
5995
  for (const c of clauses) if (frag.test(c.text)) return c.id;
5974
5996
  return void 0;
5975
5997
  }
@@ -6081,8 +6103,14 @@ var incircleTangencyRule = {
6081
6103
  // src/stamps/geometry-2d/ai/rules/altitudeDiameterCircles.ts
6082
6104
  var TRI6 = /tam\s*giác(?:[^A-Z.;\n]*)\s+([A-Z])([A-Z])([A-Z])(?![A-Z])/u;
6083
6105
  var ALTITUDES = /các\s+đường\s*cao\s+([A-Z])([A-Z])\s*,\s*([A-Z])([A-Z])(?![A-Z])/u;
6084
- var DIAMETER_INTERSECTION = /[Đđ]ường\s*tròn\s+đường\s*kính\s+([A-Z])([A-Z])\s+và\s+[Đđ]ường\s*tròn\s+đường\s*kính\s+([A-Z])([A-Z])[^.;\n]*?tại\s+các\s+điểm\s+([A-Z])\s*,\s*([A-Z])(?![A-Z])/u;
6085
- var SEGMENT_CIRCLE = /[Đđ]oạn\s+thẳng\s+([A-Z])([A-Z])\s+cắt\s+đường\s*tròn\s+đường\s*kính\s+([A-Z])([A-Z])\s+tại\s+điểm\s+([A-Z])(?![A-Z])/gu;
6106
+ var DIAMETER_INTERSECTION = new RegExp(
6107
+ CIRCLE_KW + "\\s+" + DUONG_KW + "\\s*k\xEDnh\\s+([A-Z])([A-Z])\\s+v\xE0\\s+" + CIRCLE_KW + "\\s+" + DUONG_KW + "\\s*k\xEDnh\\s+([A-Z])([A-Z])[^.;\n]*?t\u1EA1i\\s+c\xE1c\\s+\u0111i\u1EC3m\\s+([A-Z])\\s*,\\s*([A-Z])(?![A-Z])",
6108
+ "u"
6109
+ );
6110
+ var SEGMENT_CIRCLE = new RegExp(
6111
+ "[\u0110\u0111]o\u1EA1n\\s+th\u1EB3ng\\s+([A-Z])([A-Z])\\s+c\u1EAFt\\s+" + CIRCLE_KW + "\\s+" + DUONG_KW + "\\s*k\xEDnh\\s+([A-Z])([A-Z])\\s+t\u1EA1i\\s+\u0111i\u1EC3m\\s+([A-Z])(?![A-Z])",
6112
+ "gu"
6113
+ );
6086
6114
  var LINE_LINE = /[Cc]ác\s+đường\s+thẳng\s+([A-Z])([A-Z])\s+và\s+([A-Z])([A-Z])\s+cắt\s+nhau\s+tại\s+([A-Z])(?![A-Z])/u;
6087
6115
  function opposite3(triangle, apex) {
6088
6116
  const rest = triangle.filter((v) => v !== apex);
@@ -6092,7 +6120,7 @@ var altitudeDiameterCirclesRule = {
6092
6120
  id: "altitude-diameter-circles",
6093
6121
  priority: 67,
6094
6122
  languages: ["vi"],
6095
- patterns: [/[Đđ]ường\s*cao/u, /đường\s*kính/u],
6123
+ patterns: [new RegExp(DUONG_KW + "\\s*cao", "u"), new RegExp(DUONG_KW + "\\s*k\xEDnh", "u")],
6096
6124
  match(ctx) {
6097
6125
  const tri = TRI6.exec(ctx.problem);
6098
6126
  const alts = ALTITUDES.exec(ctx.problem);
@@ -6163,8 +6191,11 @@ var altitudeDiameterCirclesRule = {
6163
6191
  };
6164
6192
 
6165
6193
  // src/stamps/geometry-2d/ai/rules/diameterCircleCutsSides.ts
6166
- var PATTERN = /[Đđ]ường\s*tròn\s+đường\s*kính\s+([A-Z])([A-Z])(?![A-Z])\s+cắt\s+([^.;\n]*?)\s+(?:lần\s*lượt\s+)?tại\s+([^.;\n]*)/u;
6167
- var PREFILTER11 = /đường\s*kính/u;
6194
+ var PATTERN = new RegExp(
6195
+ CIRCLE_KW + "\\s+" + DUONG_KW + "\\s*k\xEDnh\\s+([A-Z])([A-Z])(?![A-Z])\\s+c\u1EAFt\\s+([^.;\\n]*?)\\s+(?:l\u1EA7n\\s*l\u01B0\u1EE3t\\s+)?t\u1EA1i\\s+([^.;\n]*)",
6196
+ "u"
6197
+ );
6198
+ var PREFILTER11 = new RegExp(DUONG_KW + "\\s*k\xEDnh", "u");
6168
6199
  function sharedVertex(line, dia) {
6169
6200
  const shared = [line[0], line[1]].filter((ch) => dia.includes(ch));
6170
6201
  return shared.length === 1 ? shared[0] : void 0;