@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.mjs CHANGED
@@ -2221,6 +2221,7 @@ var GEOMETRY_KEYWORDS = [
2221
2221
  // Base shapes
2222
2222
  "tam gi\xE1c",
2223
2223
  "\u0111\u01B0\u1EDDng tr\xF2n",
2224
+ "\u0111\u01B0\u01A1ng tr\xF2n",
2224
2225
  "h\xECnh ch\u1EEF nh\u1EADt",
2225
2226
  "h\xECnh vu\xF4ng",
2226
2227
  "h\xECnh b\xECnh h\xE0nh",
@@ -2235,11 +2236,13 @@ var GEOMETRY_KEYWORDS = [
2235
2236
  "b\xE1n k\xEDnh",
2236
2237
  "t\xE2m",
2237
2238
  "\u0111\u01B0\u1EDDng k\xEDnh",
2239
+ "\u0111\u01B0\u01A1ng k\xEDnh",
2238
2240
  // Segments / on-segment
2239
2241
  "\u0111o\u1EA1n",
2240
2242
  // Derived points
2241
2243
  "trung \u0111i\u1EC3m",
2242
2244
  "ch\xE2n \u0111\u01B0\u1EDDng cao",
2245
+ "ch\xE2n \u0111\u01B0\u01A1ng cao",
2243
2246
  "h\xECnh chi\u1EBFu",
2244
2247
  "tr\u1ECDng t\xE2m",
2245
2248
  "tr\u1EF1c t\xE2m",
@@ -2247,6 +2250,7 @@ var GEOMETRY_KEYWORDS = [
2247
2250
  "t\xE2m ngo\u1EA1i ti\u1EBFp",
2248
2251
  // Cevian names
2249
2252
  "\u0111\u01B0\u1EDDng cao",
2253
+ "\u0111\u01B0\u01A1ng cao",
2250
2254
  "trung tuy\u1EBFn",
2251
2255
  "ph\xE2n gi\xE1c",
2252
2256
  "trung tr\u1EF1c",
@@ -2283,6 +2287,8 @@ var GEOMETRY_KEYWORDS = [
2283
2287
  "vu\xF4ng g\xF3c",
2284
2288
  "giao \u0111i\u1EC3m",
2285
2289
  "c\u1EAFt",
2290
+ "\u0111\u01B0\u1EDDng th\u1EB3ng",
2291
+ "\u0111\u01B0\u01A1ng th\u1EB3ng",
2286
2292
  // Ký hiệu (symbol-only phrasing tương đương từ chữ): "⊥" ≡ "vuông góc".
2287
2293
  // perpFoot rule đã nhận "⊥" ở tầng construct (PERP_DRAW), nhưng gate
2288
2294
  // hasGeometry trước đây CHỈ nhận chữ "vuông góc" → clause mà "⊥" là tín hiệu
@@ -2448,6 +2454,8 @@ function pairFromToken(token) {
2448
2454
  return m ? [m[1], m[2]] : [];
2449
2455
  }
2450
2456
  var SIDE_PREFIX = "(?:c\u1EA1nh(?:\\s+huy\u1EC1n)?\\s+|\u0111o\u1EA1n(?:\\s+th\u1EB3ng)?\\s+)?";
2457
+ var DUONG_KW = "[\u0110\u0111]\u01B0[\u1EDD\u01A1]ng";
2458
+ var CIRCLE_KW = DUONG_KW + "\\s*tr\xF2n";
2451
2459
 
2452
2460
  // src/stamps/geometry-2d/ai/rules/triangle.ts
2453
2461
  var TRI_G = /tam giác\s+(?:(đều|vuông|cân)\s+)?([A-Z])([A-Z])([A-Z])(?![A-Z])/gu;
@@ -3422,12 +3430,15 @@ var centersRule = {
3422
3430
  };
3423
3431
 
3424
3432
  // src/stamps/geometry-2d/ai/rules/perpFoot.ts
3425
- 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;
3433
+ var PREFILTER5 = new RegExp(
3434
+ "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",
3435
+ "u"
3436
+ );
3426
3437
  var PREFILTER_EN = /projection|perpendicular|foot\s+of/i;
3427
- var LINE = "(?:\u0111\u01B0\u1EDDng\\s*th\u1EB3ng\\s+|c\u1EA1nh\\s+|\u0111o\u1EA1n\\s+)?([A-Z]{1,2})(?![A-Z])";
3438
+ var LINE = "(?:" + DUONG_KW + "\\s*th\u1EB3ng\\s+|c\u1EA1nh\\s+|\u0111o\u1EA1n\\s+)?([A-Z]{1,2})(?![A-Z])";
3428
3439
  var PREP = "(?:tr\xEAn|l\xEAn|xu\u1ED1ng|\u0111\u1EBFn|t\u1EDBi)";
3429
3440
  var PROJ_CORE = `h\xECnh\\s*chi\u1EBFu\\s+(?:vu\xF4ng\\s*g\xF3c\\s+)?(?:c\u1EE7a\\s+)?([A-Z])\\s+${PREP}\\s+${LINE}`;
3430
- 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}`;
3441
+ 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}`;
3431
3442
  var LANLUOT = new RegExp(
3432
3443
  `([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}`,
3433
3444
  "gu"
@@ -3554,13 +3565,22 @@ var perpFootRule = {
3554
3565
  };
3555
3566
 
3556
3567
  // src/stamps/geometry-2d/ai/rules/circleRadius.ts
3557
- 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;
3558
- var CENTER_THROUGH_G = /đường\s*tròn\s*(?:\(\s*)?(?:tâm\s+)?([A-Z])(?:\s*\))?\s+đi\s+qua\s+([A-Z])/gu;
3568
+ var CENTER_RADIUS_WORDS_G = new RegExp(
3569
+ 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+)?)",
3570
+ "gu"
3571
+ );
3572
+ var CENTER_THROUGH_G = new RegExp(
3573
+ CIRCLE_KW + "\\s*(?:\\(\\s*)?(?:t\xE2m\\s+)?([^\\s;,).:]+)(?:\\s*\\))?\\s+\u0111i\\s+qua\\s+([A-Z])",
3574
+ "gu"
3575
+ );
3559
3576
  var THROUGH_MULTI = /đi\s+qua\s+[A-Z]\s*(?:và|,)\s*[A-Z]/u;
3560
3577
  var CENTER_RADIUS_PAREN_G = /\(\s*([A-Z])\s*[;,]\s*(\d+(?:[.,]\d+)?)\s*\)/gu;
3561
3578
  var SYMBOLIC_RADIUS = 3;
3562
3579
  var CENTER_RADIUS_LETTER_PAREN_G = /\(\s*([A-Z])\s*[;,]\s*[Rr]\s*\)/gu;
3563
- 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;
3580
+ var CENTER_RADIUS_LETTER_WORDS_G = new RegExp(
3581
+ 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])",
3582
+ "gu"
3583
+ );
3564
3584
  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])";
3565
3585
  var EN_GAP = "(?:(?![Cc]ircle)[^A-Z])*?";
3566
3586
  var CIRCLE_CR_EN_G = new RegExp(
@@ -3722,21 +3742,21 @@ var circleRadiusRule = {
3722
3742
 
3723
3743
  // src/stamps/geometry-2d/ai/rules/circleTriangle.ts
3724
3744
  var HAS_INSCRIBE = /(?<!\p{L})(?:nội|ngoại)\s*tiếp(?!\p{L})/iu;
3725
- var CENTER2 = "(?:\\(\\s*([A-Z])\\s*\\)|t\xE2m\\s+([A-Z]))?";
3745
+ var CENTER2 = "(?:\\(\\s*([^\\s;,).:]+)\\s*\\)|t\xE2m\\s+([A-Z]))?";
3726
3746
  var CIRCUM_TRI = new RegExp(
3727
- "\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])",
3747
+ CIRCLE_KW + "\\s*" + CENTER2 + "\\s*ngo\u1EA1i\\s*ti\u1EBFp\\s+tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])",
3728
3748
  "giu"
3729
3749
  );
3730
3750
  var INCIRCLE_TRI = new RegExp(
3731
- "\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])",
3751
+ CIRCLE_KW + "\\s*" + CENTER2 + "\\s*n\u1ED9i\\s*ti\u1EBFp\\s+tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])",
3732
3752
  "giu"
3733
3753
  );
3734
3754
  var TRI_INSCRIBED_IN_CIRCLE = new RegExp(
3735
- "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,
3755
+ "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,
3736
3756
  "giu"
3737
3757
  );
3738
3758
  var TRI_CIRCUMSCRIBES_CIRCLE = new RegExp(
3739
- "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,
3759
+ "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,
3740
3760
  "giu"
3741
3761
  );
3742
3762
  var TRI_INSCRIBED_IN_PAREN = new RegExp(
@@ -3747,7 +3767,7 @@ var TRI_CIRCUMSCRIBES_PAREN = new RegExp(
3747
3767
  "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*\\)",
3748
3768
  "giu"
3749
3769
  );
3750
- var PAREN_CENTER = "(?:\u0111\u01B0\u1EDDng\\s*tr\xF2n\\s*)?\\(\\s*([A-Z])\\s*[;,]\\s*(?![^)]*[A-Z]\\s*[;,])[^()]*?\\)\\s*";
3770
+ var PAREN_CENTER = "(?:" + CIRCLE_KW + "\\s*)?\\(\\s*([A-Z])\\s*[;,]\\s*(?![^)]*[A-Z]\\s*[;,])[^()]*?\\)\\s*";
3751
3771
  var CIRCUM_TRI_PAREN = new RegExp(
3752
3772
  PAREN_CENTER + "ngo\u1EA1i\\s*ti\u1EBFp\\s+tam\\s*gi\xE1c\\s+([A-Z])([A-Z])([A-Z])(?![A-Z])",
3753
3773
  "giu"
@@ -4630,7 +4650,7 @@ var ninePointRule = {
4630
4650
 
4631
4651
  // src/stamps/geometry-2d/ai/rules/diameterCirclePairwise.ts
4632
4652
  var CIRCLE_CENTER2 = /\(\s*([A-Z])\s*\)/u;
4633
- var KW_DIAMETER = /đường kính/u;
4653
+ var KW_DIAMETER = new RegExp(DUONG_KW + "\\s*k\xEDnh", "u");
4634
4654
  var KW_PAIRWISE = /đôi một|cắt nhau/u;
4635
4655
  var APEX_THETA = 2;
4636
4656
  var OTHER_THETAS = [5.5, 4, 0.6, 3.3, 1.1, 5];
@@ -4638,7 +4658,7 @@ function parse(problem) {
4638
4658
  const cm = CIRCLE_CENTER2.exec(problem);
4639
4659
  if (!cm) return void 0;
4640
4660
  const center = cm[1];
4641
- const dm = /đường kính\s+([^.;\n]*)/u.exec(problem);
4661
+ const dm = new RegExp(DUONG_KW + "\\s*k\xEDnh\\s+([^.;\n]*)", "u").exec(problem);
4642
4662
  if (!dm) return void 0;
4643
4663
  let region = dm[1];
4644
4664
  const cut = region.search(/đôi một|cắt nhau/u);
@@ -4763,7 +4783,7 @@ var angleBisectorFootRule = {
4763
4783
  };
4764
4784
 
4765
4785
  // src/stamps/geometry-2d/ai/rules/intersection.ts
4766
- 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])";
4786
+ 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])";
4767
4787
  var CONN = "(?:v\xE0|v\u1EDBi)";
4768
4788
  var GIAO_DIEM = new RegExp(`giao\\s*\u0111i\u1EC3m\\s+(?:c\u1EE7a\\s+)?${REF}\\s*${CONN}\\s*${REF}`, "gu");
4769
4789
  var CAT_TAI = new RegExp(`${REF}\\s+c\u1EAFt\\s+${REF}\\s+t\u1EA1i\\s+([A-Z])(?![A-Z])`, "gu");
@@ -4778,6 +4798,8 @@ var DISTRIB_TWO = new RegExp(
4778
4798
  var NAME_BEFORE6 = /([A-Z])(?:['′]?)\s+là\s+$/u;
4779
4799
  var PREFILTER8 = /giao\s*điểm|cắt|giao\s+nhau/u;
4780
4800
  function makeIntent(name, ref1, ref2) {
4801
+ ref1 = ref1.replace(/\s+/g, "");
4802
+ ref2 = ref2.replace(/\s+/g, "");
4781
4803
  const ends = [ref1[0], ref1[1], ref2[0], ref2[1]];
4782
4804
  if (new Set(ends).size !== 4) return null;
4783
4805
  if (ends.includes(name)) return null;
@@ -4823,15 +4845,15 @@ var intersectionRule = {
4823
4845
  };
4824
4846
 
4825
4847
  // src/stamps/geometry-2d/ai/rules/chord.ts
4826
- var CIRCLE_WORDS2 = /đường\s*tròn\s*(?:\(\s*)?(?:tâm\s+)?([A-Z])(?![A-Z])/u;
4827
- var CIRCLE_PAREN2 = /\(\s*([A-Z])\s*\)/u;
4848
+ var CIRCLE_WORDS2 = new RegExp(CIRCLE_KW + "\\s*(?:\\(\\s*)?(?:t\xE2m\\s+)?([^\\s;,).:]+)(?![A-Z])", "u");
4849
+ var CIRCLE_PAREN2 = /\(\s*([^\\s;,).:]+)\s*\)/u;
4828
4850
  var CHORD_FWD = /[Dd]ây\s+(?:cung\s+)?([A-Z])([A-Z])(?![A-Z])/gu;
4829
4851
  var CHORD_REV = /([A-Z])([A-Z])(?![A-Z])\s+là\s+(?:một\s+)?dây(?:\s+cung)?(?!\p{L})/gu;
4830
4852
  var THETA_A = 2.3;
4831
4853
  var THETA_B = 0.7;
4832
4854
  var PREFILTER9 = /[Dd]ây/u;
4833
4855
  function findCircleClauseId(clauses, circle) {
4834
- const frag = new RegExp(`\u0111\u01B0\u1EDDng\\s*tr\xF2n|\\(\\s*${circle}\\s*\\)`, "u");
4856
+ const frag = new RegExp(CIRCLE_KW + `|\\(\\s*${circle}\\s*\\)`, "u");
4835
4857
  for (const c of clauses) if (frag.test(c.text)) return c.id;
4836
4858
  return void 0;
4837
4859
  }
@@ -4943,8 +4965,14 @@ var incircleTangencyRule = {
4943
4965
  // src/stamps/geometry-2d/ai/rules/altitudeDiameterCircles.ts
4944
4966
  var TRI6 = /tam\s*giác(?:[^A-Z.;\n]*)\s+([A-Z])([A-Z])([A-Z])(?![A-Z])/u;
4945
4967
  var ALTITUDES = /các\s+đường\s*cao\s+([A-Z])([A-Z])\s*,\s*([A-Z])([A-Z])(?![A-Z])/u;
4946
- 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;
4947
- 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;
4968
+ var DIAMETER_INTERSECTION = new RegExp(
4969
+ 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])",
4970
+ "u"
4971
+ );
4972
+ var SEGMENT_CIRCLE = new RegExp(
4973
+ "[\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])",
4974
+ "gu"
4975
+ );
4948
4976
  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;
4949
4977
  function opposite3(triangle, apex) {
4950
4978
  const rest = triangle.filter((v) => v !== apex);
@@ -4954,7 +4982,7 @@ var altitudeDiameterCirclesRule = {
4954
4982
  id: "altitude-diameter-circles",
4955
4983
  priority: 67,
4956
4984
  languages: ["vi"],
4957
- patterns: [/[Đđ]ường\s*cao/u, /đường\s*kính/u],
4985
+ patterns: [new RegExp(DUONG_KW + "\\s*cao", "u"), new RegExp(DUONG_KW + "\\s*k\xEDnh", "u")],
4958
4986
  match(ctx) {
4959
4987
  const tri = TRI6.exec(ctx.problem);
4960
4988
  const alts = ALTITUDES.exec(ctx.problem);
@@ -5025,8 +5053,11 @@ var altitudeDiameterCirclesRule = {
5025
5053
  };
5026
5054
 
5027
5055
  // src/stamps/geometry-2d/ai/rules/diameterCircleCutsSides.ts
5028
- 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;
5029
- var PREFILTER11 = /đường\s*kính/u;
5056
+ var PATTERN = new RegExp(
5057
+ 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]*)",
5058
+ "u"
5059
+ );
5060
+ var PREFILTER11 = new RegExp(DUONG_KW + "\\s*k\xEDnh", "u");
5030
5061
  function sharedVertex(line, dia) {
5031
5062
  const shared = [line[0], line[1]].filter((ch) => dia.includes(ch));
5032
5063
  return shared.length === 1 ? shared[0] : void 0;