@drghaliasri/butex 5.3.3 → 5.4.1
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/dist/document.d.mts +4 -1
- package/dist/document.d.ts +4 -1
- package/dist/document.js +310 -0
- package/dist/document.js.map +1 -1
- package/dist/document.mjs +310 -0
- package/dist/document.mjs.map +1 -1
- package/dist/document2.d.mts +4 -1
- package/dist/document2.d.ts +4 -1
- package/dist/document2.js +429 -2
- package/dist/document2.js.map +1 -1
- package/dist/document2.mjs +429 -2
- package/dist/document2.mjs.map +1 -1
- package/dist/index.d.mts +188 -3
- package/dist/index.d.ts +188 -3
- package/dist/index.global.js +848 -3
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +848 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +848 -3
- package/dist/index.mjs.map +1 -1
- package/dist/react-document.js +1037 -4
- package/dist/react-document.js.map +1 -1
- package/dist/react-document.mjs +1037 -4
- package/dist/react-document.mjs.map +1 -1
- package/dist/react-document2.d.mts +4 -1
- package/dist/react-document2.d.ts +4 -1
- package/dist/react-document2.js +1039 -6
- package/dist/react-document2.js.map +1 -1
- package/dist/react-document2.mjs +1039 -6
- package/dist/react-document2.mjs.map +1 -1
- package/dist/react.d.mts +141 -1
- package/dist/react.d.ts +141 -1
- package/dist/react.js +919 -4
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +919 -4
- package/dist/react.mjs.map +1 -1
- package/package.json +1 -1
package/dist/react-document2.js
CHANGED
|
@@ -1388,6 +1388,158 @@ function createEmptyDocument2() {
|
|
|
1388
1388
|
};
|
|
1389
1389
|
}
|
|
1390
1390
|
|
|
1391
|
+
// src/editor/accentCommands.ts
|
|
1392
|
+
var ACCENT_COMMANDS = {
|
|
1393
|
+
vec: {
|
|
1394
|
+
id: "vec",
|
|
1395
|
+
englishTex: "\\vec",
|
|
1396
|
+
arabicTex: "\\arabvec",
|
|
1397
|
+
placement: "over",
|
|
1398
|
+
label: "\u20D7",
|
|
1399
|
+
title: "\u0633\u0647\u0645 \u0641\u0648\u0642"
|
|
1400
|
+
},
|
|
1401
|
+
hat: {
|
|
1402
|
+
id: "hat",
|
|
1403
|
+
englishTex: "\\hat",
|
|
1404
|
+
arabicTex: "\\hat",
|
|
1405
|
+
placement: "over",
|
|
1406
|
+
label: "\u02C6",
|
|
1407
|
+
title: "\u0642\u0628\u0639\u0629"
|
|
1408
|
+
},
|
|
1409
|
+
tilde: {
|
|
1410
|
+
id: "tilde",
|
|
1411
|
+
englishTex: "\\tilde",
|
|
1412
|
+
arabicTex: "\\tilde",
|
|
1413
|
+
placement: "over",
|
|
1414
|
+
label: "\u02DC",
|
|
1415
|
+
title: "\u0645\u062F\u0629"
|
|
1416
|
+
},
|
|
1417
|
+
dot: {
|
|
1418
|
+
id: "dot",
|
|
1419
|
+
englishTex: "\\dot",
|
|
1420
|
+
arabicTex: "\\dot",
|
|
1421
|
+
placement: "over",
|
|
1422
|
+
label: "\u02D9",
|
|
1423
|
+
title: "\u0646\u0642\u0637\u0629 \u0641\u0648\u0642"
|
|
1424
|
+
},
|
|
1425
|
+
ddot: {
|
|
1426
|
+
id: "ddot",
|
|
1427
|
+
englishTex: "\\ddot",
|
|
1428
|
+
arabicTex: "\\ddot",
|
|
1429
|
+
placement: "over",
|
|
1430
|
+
label: "\xA8",
|
|
1431
|
+
title: "\u0646\u0642\u0637\u062A\u0627\u0646 \u0641\u0648\u0642"
|
|
1432
|
+
},
|
|
1433
|
+
dddot: {
|
|
1434
|
+
id: "dddot",
|
|
1435
|
+
englishTex: "\\dddot",
|
|
1436
|
+
arabicTex: "\\dddot",
|
|
1437
|
+
placement: "over",
|
|
1438
|
+
label: "\u20DB",
|
|
1439
|
+
title: "\u062B\u0644\u0627\u062B \u0646\u0642\u0627\u0637 \u0641\u0648\u0642"
|
|
1440
|
+
},
|
|
1441
|
+
bar: {
|
|
1442
|
+
id: "bar",
|
|
1443
|
+
englishTex: "\\bar",
|
|
1444
|
+
arabicTex: "\\bar",
|
|
1445
|
+
placement: "over",
|
|
1446
|
+
label: "\xAF",
|
|
1447
|
+
title: "\u062E\u0637 \u0641\u0648\u0642"
|
|
1448
|
+
},
|
|
1449
|
+
check: {
|
|
1450
|
+
id: "check",
|
|
1451
|
+
englishTex: "\\check",
|
|
1452
|
+
arabicTex: "\\check",
|
|
1453
|
+
placement: "over",
|
|
1454
|
+
label: "\u02C7",
|
|
1455
|
+
title: "\u0639\u0644\u0627\u0645\u0629 \u062A\u062D\u0642\u0642"
|
|
1456
|
+
},
|
|
1457
|
+
breve: {
|
|
1458
|
+
id: "breve",
|
|
1459
|
+
englishTex: "\\breve",
|
|
1460
|
+
arabicTex: "\\breve",
|
|
1461
|
+
placement: "over",
|
|
1462
|
+
label: "\u02D8",
|
|
1463
|
+
title: "\u0642\u0648\u0633 \u0642\u0635\u064A\u0631"
|
|
1464
|
+
},
|
|
1465
|
+
acute: {
|
|
1466
|
+
id: "acute",
|
|
1467
|
+
englishTex: "\\acute",
|
|
1468
|
+
arabicTex: "\\grave",
|
|
1469
|
+
placement: "over",
|
|
1470
|
+
label: "\xB4",
|
|
1471
|
+
title: "\u0646\u0628\u0631\u0629 \u062D\u0627\u062F\u0629"
|
|
1472
|
+
},
|
|
1473
|
+
grave: {
|
|
1474
|
+
id: "grave",
|
|
1475
|
+
englishTex: "\\grave",
|
|
1476
|
+
arabicTex: "\\acute",
|
|
1477
|
+
placement: "over",
|
|
1478
|
+
label: "`",
|
|
1479
|
+
title: "\u0646\u0628\u0631\u0629 \u062B\u0642\u064A\u0644\u0629"
|
|
1480
|
+
},
|
|
1481
|
+
overline: {
|
|
1482
|
+
id: "overline",
|
|
1483
|
+
englishTex: "\\overline",
|
|
1484
|
+
arabicTex: "\\overline",
|
|
1485
|
+
placement: "over",
|
|
1486
|
+
label: "\u203E",
|
|
1487
|
+
title: "\u062E\u0637 \u0639\u0644\u0648\u064A \u0645\u0645\u062A\u062F"
|
|
1488
|
+
},
|
|
1489
|
+
underline: {
|
|
1490
|
+
id: "underline",
|
|
1491
|
+
englishTex: "\\underline",
|
|
1492
|
+
arabicTex: "\\underline",
|
|
1493
|
+
placement: "under",
|
|
1494
|
+
label: "_",
|
|
1495
|
+
title: "\u062E\u0637 \u0633\u0641\u0644\u064A"
|
|
1496
|
+
},
|
|
1497
|
+
overleftarrow: {
|
|
1498
|
+
id: "overleftarrow",
|
|
1499
|
+
englishTex: "\\overleftarrow",
|
|
1500
|
+
arabicTex: "\\overrightarrow",
|
|
1501
|
+
placement: "over",
|
|
1502
|
+
label: "\u2190",
|
|
1503
|
+
title: "\u0633\u0647\u0645 \u0639\u0644\u0648\u064A \u0625\u0644\u0649 \u0627\u0644\u064A\u0633\u0627\u0631"
|
|
1504
|
+
},
|
|
1505
|
+
overrightarrow: {
|
|
1506
|
+
id: "overrightarrow",
|
|
1507
|
+
englishTex: "\\overrightarrow",
|
|
1508
|
+
arabicTex: "\\overleftarrow",
|
|
1509
|
+
placement: "over",
|
|
1510
|
+
label: "\u2192",
|
|
1511
|
+
title: "\u0633\u0647\u0645 \u0639\u0644\u0648\u064A \u0625\u0644\u0649 \u0627\u0644\u064A\u0645\u064A\u0646"
|
|
1512
|
+
},
|
|
1513
|
+
overleftrightarrow: {
|
|
1514
|
+
id: "overleftrightarrow",
|
|
1515
|
+
englishTex: "\\overleftrightarrow",
|
|
1516
|
+
arabicTex: "\\overleftrightarrow",
|
|
1517
|
+
placement: "over",
|
|
1518
|
+
label: "\u2194",
|
|
1519
|
+
title: "\u0633\u0647\u0645 \u0639\u0644\u0648\u064A \u0645\u0632\u062F\u0648\u062C \u0627\u0644\u0627\u062A\u062C\u0627\u0647"
|
|
1520
|
+
}
|
|
1521
|
+
};
|
|
1522
|
+
function accentCommandSpec(id) {
|
|
1523
|
+
return Object.prototype.hasOwnProperty.call(ACCENT_COMMANDS, id) ? ACCENT_COMMANDS[id] : null;
|
|
1524
|
+
}
|
|
1525
|
+
function accentCommandsList() {
|
|
1526
|
+
return Object.values(ACCENT_COMMANDS);
|
|
1527
|
+
}
|
|
1528
|
+
function accentCommandIdFromTex(tex) {
|
|
1529
|
+
const normalized = tex.startsWith("\\") ? tex : `\\${tex}`;
|
|
1530
|
+
for (const spec of Object.values(ACCENT_COMMANDS)) {
|
|
1531
|
+
if (spec.englishTex === normalized) {
|
|
1532
|
+
return spec.id;
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
for (const spec of Object.values(ACCENT_COMMANDS)) {
|
|
1536
|
+
if (spec.arabicTex === normalized) {
|
|
1537
|
+
return spec.id;
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
return null;
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1391
1543
|
// src/editor/atomicCommands.ts
|
|
1392
1544
|
var ATOMIC_COMMANDS = {
|
|
1393
1545
|
///////////////////////// Functions ////////////////////////////////
|
|
@@ -2362,6 +2514,9 @@ function createEditorNode(kind, expr) {
|
|
|
2362
2514
|
denominator: null,
|
|
2363
2515
|
radicand: null,
|
|
2364
2516
|
rootIndex: null,
|
|
2517
|
+
overExpr: null,
|
|
2518
|
+
underExpr: null,
|
|
2519
|
+
baseExpr: null,
|
|
2365
2520
|
envName: null,
|
|
2366
2521
|
matrixStyle: null,
|
|
2367
2522
|
matrixRows: null,
|
|
@@ -2390,6 +2545,26 @@ function createSqrtNode() {
|
|
|
2390
2545
|
rootIndex: createEditorChain()
|
|
2391
2546
|
};
|
|
2392
2547
|
}
|
|
2548
|
+
function createOversetNode() {
|
|
2549
|
+
return {
|
|
2550
|
+
...createEditorNode("overset", ""),
|
|
2551
|
+
overExpr: createEditorChain(),
|
|
2552
|
+
baseExpr: createEditorChain()
|
|
2553
|
+
};
|
|
2554
|
+
}
|
|
2555
|
+
function createUndersetNode() {
|
|
2556
|
+
return {
|
|
2557
|
+
...createEditorNode("underset", ""),
|
|
2558
|
+
underExpr: createEditorChain(),
|
|
2559
|
+
baseExpr: createEditorChain()
|
|
2560
|
+
};
|
|
2561
|
+
}
|
|
2562
|
+
function createAccentNode(accentId) {
|
|
2563
|
+
return {
|
|
2564
|
+
...createEditorNode("accent", accentId),
|
|
2565
|
+
baseExpr: createEditorChain()
|
|
2566
|
+
};
|
|
2567
|
+
}
|
|
2393
2568
|
function createGridEnvNode(envName, rows, columns, columnAlignments) {
|
|
2394
2569
|
const safeRows = Math.max(1, Math.min(12, Math.trunc(rows)));
|
|
2395
2570
|
const safeColumns = Math.max(1, Math.min(12, Math.trunc(columns)));
|
|
@@ -2454,6 +2629,15 @@ function collectNodeIds(chain, ids) {
|
|
|
2454
2629
|
if (node.radicand) {
|
|
2455
2630
|
collectNodeIds(node.radicand, ids);
|
|
2456
2631
|
}
|
|
2632
|
+
if (node.overExpr) {
|
|
2633
|
+
collectNodeIds(node.overExpr, ids);
|
|
2634
|
+
}
|
|
2635
|
+
if (node.underExpr) {
|
|
2636
|
+
collectNodeIds(node.underExpr, ids);
|
|
2637
|
+
}
|
|
2638
|
+
if (node.baseExpr) {
|
|
2639
|
+
collectNodeIds(node.baseExpr, ids);
|
|
2640
|
+
}
|
|
2457
2641
|
if (node.matrixRows) {
|
|
2458
2642
|
for (const row of node.matrixRows) {
|
|
2459
2643
|
for (const cell of row) {
|
|
@@ -2590,6 +2774,22 @@ function renderMatrixRowsArabic(node, options) {
|
|
|
2590
2774
|
}
|
|
2591
2775
|
return `\\begin{${envName}}${rows.join(" \\\\\n")}\\end{${envName}}`;
|
|
2592
2776
|
}
|
|
2777
|
+
function renderAccentEnglish(command, accent, base, options) {
|
|
2778
|
+
const baseTex = base ? renderChainEnglish(base, options) : "";
|
|
2779
|
+
const accentTex = accent ? renderChainEnglish(accent, options) : "";
|
|
2780
|
+
if (accentTex === "") {
|
|
2781
|
+
return baseTex;
|
|
2782
|
+
}
|
|
2783
|
+
return `\\${command}{${accentTex}}{${baseTex}}`;
|
|
2784
|
+
}
|
|
2785
|
+
function renderAccentArabic(command, accent, base, options) {
|
|
2786
|
+
const baseTex = base ? renderChainArabic(base, options) : "";
|
|
2787
|
+
const accentTex = accent ? renderChainArabic(accent, options) : "";
|
|
2788
|
+
if (accentTex === "") {
|
|
2789
|
+
return baseTex;
|
|
2790
|
+
}
|
|
2791
|
+
return `\\${command}{${accentTex}}{${baseTex}}`;
|
|
2792
|
+
}
|
|
2593
2793
|
function escapeText(s) {
|
|
2594
2794
|
return s.replace(/\\/g, "\\textbackslash{}").replace(/[{}]/g, "\\$&");
|
|
2595
2795
|
}
|
|
@@ -2619,6 +2819,19 @@ function renderNodeEnglish(node, options) {
|
|
|
2619
2819
|
const body = `\\sqrt${optionalRootIndexEnglish(node, options)}{${renderChainEnglish(node.radicand, options)}}`;
|
|
2620
2820
|
return `${body}${latinScripts(node, options)}`;
|
|
2621
2821
|
}
|
|
2822
|
+
if (node.kind === "overset" && node.baseExpr) {
|
|
2823
|
+
const body = renderAccentEnglish("overset", node.overExpr, node.baseExpr, options);
|
|
2824
|
+
return `${body}${latinScripts(node, options)}`;
|
|
2825
|
+
}
|
|
2826
|
+
if (node.kind === "underset" && node.baseExpr) {
|
|
2827
|
+
const body = renderAccentEnglish("underset", node.underExpr, node.baseExpr, options);
|
|
2828
|
+
return `${body}${latinScripts(node, options)}`;
|
|
2829
|
+
}
|
|
2830
|
+
if (node.kind === "accent" && node.baseExpr) {
|
|
2831
|
+
const cmd = accentCommandSpec(node.expr)?.englishTex ?? `\\${node.expr}`;
|
|
2832
|
+
const body = `${cmd}{${renderChainEnglish(node.baseExpr, options)}}`;
|
|
2833
|
+
return `${body}${latinScripts(node, options)}`;
|
|
2834
|
+
}
|
|
2622
2835
|
if (node.kind === "env") {
|
|
2623
2836
|
return `${renderMatrixRowsEnglish(node, options)}${latinScripts(node, options)}`;
|
|
2624
2837
|
}
|
|
@@ -2651,6 +2864,19 @@ function renderNodeArabic(node, options) {
|
|
|
2651
2864
|
const content = `\\arabsqrt${optionalRootIndexArabic(node, options)}{${renderChainArabic(node.radicand, options)}}`;
|
|
2652
2865
|
return arabicScripts(node, content, options);
|
|
2653
2866
|
}
|
|
2867
|
+
if (node.kind === "overset" && node.baseExpr) {
|
|
2868
|
+
const content = renderAccentArabic("overset", node.overExpr, node.baseExpr, options);
|
|
2869
|
+
return arabicScripts(node, content, options);
|
|
2870
|
+
}
|
|
2871
|
+
if (node.kind === "underset" && node.baseExpr) {
|
|
2872
|
+
const content = renderAccentArabic("underset", node.underExpr, node.baseExpr, options);
|
|
2873
|
+
return arabicScripts(node, content, options);
|
|
2874
|
+
}
|
|
2875
|
+
if (node.kind === "accent" && node.baseExpr) {
|
|
2876
|
+
const cmd = accentCommandSpec(node.expr)?.arabicTex ?? `\\${node.expr}`;
|
|
2877
|
+
const content = `${cmd}{${renderChainArabic(node.baseExpr, options)}}`;
|
|
2878
|
+
return arabicScripts(node, content, options);
|
|
2879
|
+
}
|
|
2654
2880
|
if (node.kind === "env") {
|
|
2655
2881
|
return arabicScripts(node, renderMatrixRowsArabic(node, options), options);
|
|
2656
2882
|
}
|
|
@@ -2707,6 +2933,35 @@ function collectCaretPositions(chain) {
|
|
|
2707
2933
|
if (node.radicand) {
|
|
2708
2934
|
walkChain(node.radicand);
|
|
2709
2935
|
}
|
|
2936
|
+
if (node.kind === "overset") {
|
|
2937
|
+
if (node.overExpr) {
|
|
2938
|
+
walkChain(node.overExpr);
|
|
2939
|
+
}
|
|
2940
|
+
if (node.baseExpr) {
|
|
2941
|
+
walkChain(node.baseExpr);
|
|
2942
|
+
}
|
|
2943
|
+
} else if (node.kind === "underset") {
|
|
2944
|
+
if (node.baseExpr) {
|
|
2945
|
+
walkChain(node.baseExpr);
|
|
2946
|
+
}
|
|
2947
|
+
if (node.underExpr) {
|
|
2948
|
+
walkChain(node.underExpr);
|
|
2949
|
+
}
|
|
2950
|
+
} else if (node.kind === "accent") {
|
|
2951
|
+
if (node.baseExpr) {
|
|
2952
|
+
walkChain(node.baseExpr);
|
|
2953
|
+
}
|
|
2954
|
+
} else {
|
|
2955
|
+
if (node.overExpr) {
|
|
2956
|
+
walkChain(node.overExpr);
|
|
2957
|
+
}
|
|
2958
|
+
if (node.underExpr) {
|
|
2959
|
+
walkChain(node.underExpr);
|
|
2960
|
+
}
|
|
2961
|
+
if (node.baseExpr) {
|
|
2962
|
+
walkChain(node.baseExpr);
|
|
2963
|
+
}
|
|
2964
|
+
}
|
|
2710
2965
|
if (node.matrixRows) {
|
|
2711
2966
|
for (const row of node.matrixRows) {
|
|
2712
2967
|
for (const cell of row) {
|
|
@@ -2840,6 +3095,42 @@ function findChainById(root, chainId) {
|
|
|
2840
3095
|
return nested;
|
|
2841
3096
|
}
|
|
2842
3097
|
}
|
|
3098
|
+
if (node.overExpr) {
|
|
3099
|
+
if (node.overExpr.id === chainId) {
|
|
3100
|
+
return {
|
|
3101
|
+
chain: node.overExpr,
|
|
3102
|
+
relation: { kind: "overExpr", ownerNodeId: node.id, ownerChainId: root.id }
|
|
3103
|
+
};
|
|
3104
|
+
}
|
|
3105
|
+
const nested = findChainById(node.overExpr, chainId);
|
|
3106
|
+
if (nested) {
|
|
3107
|
+
return nested;
|
|
3108
|
+
}
|
|
3109
|
+
}
|
|
3110
|
+
if (node.underExpr) {
|
|
3111
|
+
if (node.underExpr.id === chainId) {
|
|
3112
|
+
return {
|
|
3113
|
+
chain: node.underExpr,
|
|
3114
|
+
relation: { kind: "underExpr", ownerNodeId: node.id, ownerChainId: root.id }
|
|
3115
|
+
};
|
|
3116
|
+
}
|
|
3117
|
+
const nested = findChainById(node.underExpr, chainId);
|
|
3118
|
+
if (nested) {
|
|
3119
|
+
return nested;
|
|
3120
|
+
}
|
|
3121
|
+
}
|
|
3122
|
+
if (node.baseExpr) {
|
|
3123
|
+
if (node.baseExpr.id === chainId) {
|
|
3124
|
+
return {
|
|
3125
|
+
chain: node.baseExpr,
|
|
3126
|
+
relation: { kind: "baseExpr", ownerNodeId: node.id, ownerChainId: root.id }
|
|
3127
|
+
};
|
|
3128
|
+
}
|
|
3129
|
+
const nested = findChainById(node.baseExpr, chainId);
|
|
3130
|
+
if (nested) {
|
|
3131
|
+
return nested;
|
|
3132
|
+
}
|
|
3133
|
+
}
|
|
2843
3134
|
if (node.matrixRows) {
|
|
2844
3135
|
for (let rowIndex = 0; rowIndex < node.matrixRows.length; rowIndex += 1) {
|
|
2845
3136
|
const row = node.matrixRows[rowIndex];
|
|
@@ -2913,6 +3204,24 @@ function findNodeById(root, nodeId) {
|
|
|
2913
3204
|
return nested;
|
|
2914
3205
|
}
|
|
2915
3206
|
}
|
|
3207
|
+
if (node.overExpr) {
|
|
3208
|
+
const nested = findNodeById(node.overExpr, nodeId);
|
|
3209
|
+
if (nested) {
|
|
3210
|
+
return nested;
|
|
3211
|
+
}
|
|
3212
|
+
}
|
|
3213
|
+
if (node.underExpr) {
|
|
3214
|
+
const nested = findNodeById(node.underExpr, nodeId);
|
|
3215
|
+
if (nested) {
|
|
3216
|
+
return nested;
|
|
3217
|
+
}
|
|
3218
|
+
}
|
|
3219
|
+
if (node.baseExpr) {
|
|
3220
|
+
const nested = findNodeById(node.baseExpr, nodeId);
|
|
3221
|
+
if (nested) {
|
|
3222
|
+
return nested;
|
|
3223
|
+
}
|
|
3224
|
+
}
|
|
2916
3225
|
if (node.matrixRows) {
|
|
2917
3226
|
for (const row of node.matrixRows) {
|
|
2918
3227
|
for (const cell of row) {
|
|
@@ -2948,6 +3257,15 @@ function nodeChildChains(node) {
|
|
|
2948
3257
|
if (node.radicand) {
|
|
2949
3258
|
chains.push(node.radicand);
|
|
2950
3259
|
}
|
|
3260
|
+
if (node.overExpr) {
|
|
3261
|
+
chains.push(node.overExpr);
|
|
3262
|
+
}
|
|
3263
|
+
if (node.underExpr) {
|
|
3264
|
+
chains.push(node.underExpr);
|
|
3265
|
+
}
|
|
3266
|
+
if (node.baseExpr) {
|
|
3267
|
+
chains.push(node.baseExpr);
|
|
3268
|
+
}
|
|
2951
3269
|
if (node.matrixRows) {
|
|
2952
3270
|
for (const row of node.matrixRows) {
|
|
2953
3271
|
chains.push(...row);
|
|
@@ -3318,6 +3636,91 @@ function derivativeTemplateInitialCaret(englishFrac) {
|
|
|
3318
3636
|
};
|
|
3319
3637
|
}
|
|
3320
3638
|
|
|
3639
|
+
// src/editor/limitsTemplates.ts
|
|
3640
|
+
var LIMITS_SERIES_TEMPLATE_IDS = /* @__PURE__ */ new Set([
|
|
3641
|
+
"sum",
|
|
3642
|
+
"prod",
|
|
3643
|
+
"lim",
|
|
3644
|
+
"max",
|
|
3645
|
+
"min",
|
|
3646
|
+
"sup",
|
|
3647
|
+
"inf"
|
|
3648
|
+
]);
|
|
3649
|
+
function isLimitsSeriesTemplateId(commandId) {
|
|
3650
|
+
return LIMITS_SERIES_TEMPLATE_IDS.has(commandId);
|
|
3651
|
+
}
|
|
3652
|
+
function syncChainIds2(english, arabic) {
|
|
3653
|
+
arabic.id = english.id;
|
|
3654
|
+
const limit = Math.min(english.nodes.length, arabic.nodes.length);
|
|
3655
|
+
for (let index = 0; index < limit; index += 1) {
|
|
3656
|
+
arabic.nodes[index].id = english.nodes[index].id;
|
|
3657
|
+
}
|
|
3658
|
+
}
|
|
3659
|
+
function syncOversetIds(english, arabic) {
|
|
3660
|
+
arabic.id = english.id;
|
|
3661
|
+
if (english.overExpr && arabic.overExpr) {
|
|
3662
|
+
syncChainIds2(english.overExpr, arabic.overExpr);
|
|
3663
|
+
}
|
|
3664
|
+
if (english.baseExpr && arabic.baseExpr) {
|
|
3665
|
+
syncChainIds2(english.baseExpr, arabic.baseExpr);
|
|
3666
|
+
}
|
|
3667
|
+
}
|
|
3668
|
+
function syncUndersetIds(english, arabic) {
|
|
3669
|
+
arabic.id = english.id;
|
|
3670
|
+
if (english.underExpr && arabic.underExpr) {
|
|
3671
|
+
syncChainIds2(english.underExpr, arabic.underExpr);
|
|
3672
|
+
}
|
|
3673
|
+
if (english.baseExpr && arabic.baseExpr) {
|
|
3674
|
+
syncChainIds2(english.baseExpr, arabic.baseExpr);
|
|
3675
|
+
}
|
|
3676
|
+
}
|
|
3677
|
+
function buildLimitsSeriesTemplate(commandId) {
|
|
3678
|
+
if (!isLimitsSeriesTemplateId(commandId)) {
|
|
3679
|
+
throw new Error(`BuTeX: unsupported limits-series template id: ${commandId}`);
|
|
3680
|
+
}
|
|
3681
|
+
const englishOp = createAtomicCommandNode(commandId);
|
|
3682
|
+
const arabicOp = createAtomicCommandNode(commandId);
|
|
3683
|
+
arabicOp.id = englishOp.id;
|
|
3684
|
+
const englishOverset = createOversetNode();
|
|
3685
|
+
const arabicOverset = createOversetNode();
|
|
3686
|
+
syncOversetIds(englishOverset, arabicOverset);
|
|
3687
|
+
englishOverset.baseExpr = createEditorChain([englishOp]);
|
|
3688
|
+
arabicOverset.baseExpr = createEditorChain([arabicOp]);
|
|
3689
|
+
syncChainIds2(englishOverset.baseExpr, arabicOverset.baseExpr);
|
|
3690
|
+
const englishUnderset = createUndersetNode();
|
|
3691
|
+
const arabicUnderset = createUndersetNode();
|
|
3692
|
+
syncUndersetIds(englishUnderset, arabicUnderset);
|
|
3693
|
+
englishUnderset.baseExpr = createEditorChain([englishOverset]);
|
|
3694
|
+
arabicUnderset.baseExpr = createEditorChain([arabicOverset]);
|
|
3695
|
+
syncChainIds2(englishUnderset.baseExpr, arabicUnderset.baseExpr);
|
|
3696
|
+
return { english: englishUnderset, arabic: arabicUnderset };
|
|
3697
|
+
}
|
|
3698
|
+
function buildAccentPairTemplate() {
|
|
3699
|
+
const englishOverset = createOversetNode();
|
|
3700
|
+
const arabicOverset = createOversetNode();
|
|
3701
|
+
syncOversetIds(englishOverset, arabicOverset);
|
|
3702
|
+
const englishUnderset = createUndersetNode();
|
|
3703
|
+
const arabicUnderset = createUndersetNode();
|
|
3704
|
+
syncUndersetIds(englishUnderset, arabicUnderset);
|
|
3705
|
+
englishUnderset.baseExpr = createEditorChain([englishOverset]);
|
|
3706
|
+
arabicUnderset.baseExpr = createEditorChain([arabicOverset]);
|
|
3707
|
+
syncChainIds2(englishUnderset.baseExpr, arabicUnderset.baseExpr);
|
|
3708
|
+
return { english: englishUnderset, arabic: arabicUnderset };
|
|
3709
|
+
}
|
|
3710
|
+
function accentPairTemplateInitialCaret(englishUnderset) {
|
|
3711
|
+
const overset = englishUnderset.baseExpr?.nodes[0];
|
|
3712
|
+
return {
|
|
3713
|
+
chainId: overset?.baseExpr?.id ?? englishUnderset.underExpr?.id ?? "",
|
|
3714
|
+
index: 0
|
|
3715
|
+
};
|
|
3716
|
+
}
|
|
3717
|
+
function limitsSeriesTemplateInitialCaret(englishUnderset) {
|
|
3718
|
+
return {
|
|
3719
|
+
chainId: englishUnderset.underExpr?.id ?? englishUnderset.baseExpr?.id ?? "",
|
|
3720
|
+
index: 0
|
|
3721
|
+
};
|
|
3722
|
+
}
|
|
3723
|
+
|
|
3321
3724
|
// src/editor/uiLocale.ts
|
|
3322
3725
|
var ENGLISH_COMMAND_TITLES = {
|
|
3323
3726
|
cos: "Cosine",
|
|
@@ -3361,6 +3764,24 @@ var ENGLISH_COMMAND_TITLES = {
|
|
|
3361
3764
|
quadSpace: "Large space",
|
|
3362
3765
|
qquadSpace: "Extra-large space"
|
|
3363
3766
|
};
|
|
3767
|
+
var ENGLISH_ACCENT_TITLES = {
|
|
3768
|
+
vec: "Vector arrow",
|
|
3769
|
+
hat: "Hat",
|
|
3770
|
+
tilde: "Tilde",
|
|
3771
|
+
dot: "Dot",
|
|
3772
|
+
ddot: "Double dot",
|
|
3773
|
+
dddot: "Triple dot",
|
|
3774
|
+
bar: "Bar",
|
|
3775
|
+
check: "Check",
|
|
3776
|
+
breve: "Breve",
|
|
3777
|
+
acute: "Acute",
|
|
3778
|
+
grave: "Grave",
|
|
3779
|
+
overline: "Overline",
|
|
3780
|
+
underline: "Underline",
|
|
3781
|
+
overleftarrow: "Over left arrow",
|
|
3782
|
+
overrightarrow: "Over right arrow",
|
|
3783
|
+
overleftrightarrow: "Over left-right arrow"
|
|
3784
|
+
};
|
|
3364
3785
|
var ENGLISH_OPERATOR_TITLES = {
|
|
3365
3786
|
inf: "Infinity",
|
|
3366
3787
|
times: "Multiplication",
|
|
@@ -3434,6 +3855,10 @@ var EQUATION_EDITOR_MESSAGES = {
|
|
|
3434
3855
|
insertBraces: "\u0625\u062F\u0631\u0627\u062C \u062D\u0627\u0635\u0631\u062A\u064A\u0646",
|
|
3435
3856
|
insertFraction: "\u0625\u062F\u0631\u0627\u062C \u0643\u0633\u0631",
|
|
3436
3857
|
insertRoot: "\u0625\u062F\u0631\u0627\u062C \u062C\u0630\u0631",
|
|
3858
|
+
insertOverset: "\u0625\u062F\u0631\u0627\u062C \u0641\u0648\u0642",
|
|
3859
|
+
insertUnderset: "\u0625\u062F\u0631\u0627\u062C \u062A\u062D\u062A",
|
|
3860
|
+
insertAccentPair: "\u0625\u062F\u0631\u0627\u062C \u0641\u0648\u0642 \u0648\u062A\u062D\u062A",
|
|
3861
|
+
insertAccents: "\u0625\u062F\u0631\u0627\u062C \u0644\u0643\u0646\u0629",
|
|
3437
3862
|
environments: "\u0627\u0644\u0628\u064A\u0626\u0627\u062A",
|
|
3438
3863
|
insertEnvironment: "\u0625\u062F\u0631\u0627\u062C \u0628\u064A\u0626\u0629 \u0634\u0628\u0643\u064A\u0629",
|
|
3439
3864
|
environmentType: "\u0646\u0648\u0639 \u0627\u0644\u0628\u064A\u0626\u0629",
|
|
@@ -3541,6 +3966,10 @@ var EQUATION_EDITOR_MESSAGES = {
|
|
|
3541
3966
|
insertBraces: "Insert braces",
|
|
3542
3967
|
insertFraction: "Insert fraction",
|
|
3543
3968
|
insertRoot: "Insert root",
|
|
3969
|
+
insertOverset: "Insert overset",
|
|
3970
|
+
insertUnderset: "Insert underset",
|
|
3971
|
+
insertAccentPair: "Insert overset and underset",
|
|
3972
|
+
insertAccents: "Insert accent",
|
|
3544
3973
|
environments: "Environments",
|
|
3545
3974
|
insertEnvironment: "Insert grid environment",
|
|
3546
3975
|
environmentType: "Environment type",
|
|
@@ -3641,6 +4070,9 @@ function atomicCommandTitle(spec, locale) {
|
|
|
3641
4070
|
function atomicOperatorCommandTitle(spec, locale) {
|
|
3642
4071
|
return locale === "en" ? ENGLISH_OPERATOR_TITLES[spec.id] ?? spec.title : spec.title;
|
|
3643
4072
|
}
|
|
4073
|
+
function accentCommandTitle(spec, locale) {
|
|
4074
|
+
return locale === "en" ? ENGLISH_ACCENT_TITLES[spec.id] ?? spec.title : spec.title;
|
|
4075
|
+
}
|
|
3644
4076
|
|
|
3645
4077
|
// src/editor/state.ts
|
|
3646
4078
|
function ensureSyncEntry(session, nodeId) {
|
|
@@ -3675,7 +4107,7 @@ function syncSelectionToCaret(session) {
|
|
|
3675
4107
|
session.selectedNodeId = located.relation.ownerNodeId;
|
|
3676
4108
|
return;
|
|
3677
4109
|
}
|
|
3678
|
-
if (located.relation.kind === "inner" || located.relation.kind === "numerator" || located.relation.kind === "denominator" || located.relation.kind === "radicand" || located.relation.kind === "rootIndex" || located.relation.kind === "matrixCell") {
|
|
4110
|
+
if (located.relation.kind === "inner" || located.relation.kind === "numerator" || located.relation.kind === "denominator" || located.relation.kind === "radicand" || located.relation.kind === "rootIndex" || located.relation.kind === "overExpr" || located.relation.kind === "underExpr" || located.relation.kind === "baseExpr" || located.relation.kind === "matrixCell") {
|
|
3679
4111
|
session.selectedNodeId = located.relation.ownerNodeId;
|
|
3680
4112
|
return;
|
|
3681
4113
|
}
|
|
@@ -4032,6 +4464,106 @@ function moveCaretVertical(session, direction) {
|
|
|
4032
4464
|
appendDebug(next, "moveCaretVertical", "sqrt-radicand-down-exit");
|
|
4033
4465
|
return next;
|
|
4034
4466
|
}
|
|
4467
|
+
if (located.relation.kind === "overExpr" && ownerLocated && ownerNode && ownerNode.baseExpr) {
|
|
4468
|
+
if (direction === "down") {
|
|
4469
|
+
next.caret = {
|
|
4470
|
+
chainId: ownerNode.baseExpr.id,
|
|
4471
|
+
index: ownerNode.baseExpr.nodes.length
|
|
4472
|
+
};
|
|
4473
|
+
next.selectedStructureNodeId = null;
|
|
4474
|
+
syncSelectionToCaret(next);
|
|
4475
|
+
appendDebug(next, "moveCaretVertical", "overset-over->base");
|
|
4476
|
+
return next;
|
|
4477
|
+
}
|
|
4478
|
+
next.caret = {
|
|
4479
|
+
chainId: ownerLocated.chain.id,
|
|
4480
|
+
index: ownerLocated.index
|
|
4481
|
+
};
|
|
4482
|
+
next.selectedStructureNodeId = null;
|
|
4483
|
+
syncSelectionToCaret(next);
|
|
4484
|
+
appendDebug(next, "moveCaretVertical", "overset-over-up-exit");
|
|
4485
|
+
return next;
|
|
4486
|
+
}
|
|
4487
|
+
if (located.relation.kind === "baseExpr" && ownerLocated && ownerNode && ownerNode.kind === "overset" && ownerNode.overExpr) {
|
|
4488
|
+
if (direction === "up") {
|
|
4489
|
+
next.caret = {
|
|
4490
|
+
chainId: ownerNode.overExpr.id,
|
|
4491
|
+
index: ownerNode.overExpr.nodes.length
|
|
4492
|
+
};
|
|
4493
|
+
next.selectedStructureNodeId = null;
|
|
4494
|
+
syncSelectionToCaret(next);
|
|
4495
|
+
appendDebug(next, "moveCaretVertical", "overset-base->over");
|
|
4496
|
+
return next;
|
|
4497
|
+
}
|
|
4498
|
+
next.caret = {
|
|
4499
|
+
chainId: ownerLocated.chain.id,
|
|
4500
|
+
index: ownerLocated.index + 1
|
|
4501
|
+
};
|
|
4502
|
+
next.selectedStructureNodeId = null;
|
|
4503
|
+
syncSelectionToCaret(next);
|
|
4504
|
+
appendDebug(next, "moveCaretVertical", "overset-base-down-exit");
|
|
4505
|
+
return next;
|
|
4506
|
+
}
|
|
4507
|
+
if (located.relation.kind === "baseExpr" && ownerLocated && ownerNode && ownerNode.kind === "underset" && ownerNode.underExpr) {
|
|
4508
|
+
if (direction === "down") {
|
|
4509
|
+
next.caret = {
|
|
4510
|
+
chainId: ownerNode.underExpr.id,
|
|
4511
|
+
index: ownerNode.underExpr.nodes.length
|
|
4512
|
+
};
|
|
4513
|
+
next.selectedStructureNodeId = null;
|
|
4514
|
+
syncSelectionToCaret(next);
|
|
4515
|
+
appendDebug(next, "moveCaretVertical", "underset-base->under");
|
|
4516
|
+
return next;
|
|
4517
|
+
}
|
|
4518
|
+
next.caret = {
|
|
4519
|
+
chainId: ownerLocated.chain.id,
|
|
4520
|
+
index: ownerLocated.index
|
|
4521
|
+
};
|
|
4522
|
+
next.selectedStructureNodeId = null;
|
|
4523
|
+
syncSelectionToCaret(next);
|
|
4524
|
+
appendDebug(next, "moveCaretVertical", "underset-base-up-exit");
|
|
4525
|
+
return next;
|
|
4526
|
+
}
|
|
4527
|
+
if (located.relation.kind === "underExpr" && ownerLocated && ownerNode && ownerNode.baseExpr) {
|
|
4528
|
+
if (direction === "up") {
|
|
4529
|
+
next.caret = {
|
|
4530
|
+
chainId: ownerNode.baseExpr.id,
|
|
4531
|
+
index: ownerNode.baseExpr.nodes.length
|
|
4532
|
+
};
|
|
4533
|
+
next.selectedStructureNodeId = null;
|
|
4534
|
+
syncSelectionToCaret(next);
|
|
4535
|
+
appendDebug(next, "moveCaretVertical", "underset-under->base");
|
|
4536
|
+
return next;
|
|
4537
|
+
}
|
|
4538
|
+
next.caret = {
|
|
4539
|
+
chainId: ownerLocated.chain.id,
|
|
4540
|
+
index: ownerLocated.index + 1
|
|
4541
|
+
};
|
|
4542
|
+
next.selectedStructureNodeId = null;
|
|
4543
|
+
syncSelectionToCaret(next);
|
|
4544
|
+
appendDebug(next, "moveCaretVertical", "underset-under-down-exit");
|
|
4545
|
+
return next;
|
|
4546
|
+
}
|
|
4547
|
+
if (located.relation.kind === "baseExpr" && ownerLocated && ownerNode && ownerNode.kind === "accent") {
|
|
4548
|
+
if (direction === "up") {
|
|
4549
|
+
next.caret = {
|
|
4550
|
+
chainId: ownerLocated.chain.id,
|
|
4551
|
+
index: ownerLocated.index
|
|
4552
|
+
};
|
|
4553
|
+
next.selectedStructureNodeId = null;
|
|
4554
|
+
syncSelectionToCaret(next);
|
|
4555
|
+
appendDebug(next, "moveCaretVertical", "accent-base-up-exit");
|
|
4556
|
+
return next;
|
|
4557
|
+
}
|
|
4558
|
+
next.caret = {
|
|
4559
|
+
chainId: ownerLocated.chain.id,
|
|
4560
|
+
index: ownerLocated.index + 1
|
|
4561
|
+
};
|
|
4562
|
+
next.selectedStructureNodeId = null;
|
|
4563
|
+
syncSelectionToCaret(next);
|
|
4564
|
+
appendDebug(next, "moveCaretVertical", "accent-base-down-exit");
|
|
4565
|
+
return next;
|
|
4566
|
+
}
|
|
4035
4567
|
if (located.relation.kind === "matrixCell" && ownerLocated && ownerNode?.matrixRows) {
|
|
4036
4568
|
const rowIndex = located.relation.rowIndex ?? 0;
|
|
4037
4569
|
const columnIndex = located.relation.columnIndex ?? 0;
|
|
@@ -4409,6 +4941,119 @@ function insertSqrt(session) {
|
|
|
4409
4941
|
appendDebug(next, "insertSqrt", "");
|
|
4410
4942
|
return next;
|
|
4411
4943
|
}
|
|
4944
|
+
function insertOverset(session) {
|
|
4945
|
+
const base = replaceSelectionFirst(session);
|
|
4946
|
+
const next = cloneEditorSession(base);
|
|
4947
|
+
const englishNode = createOversetNode();
|
|
4948
|
+
const arabicNode = createOversetNode();
|
|
4949
|
+
arabicNode.id = englishNode.id;
|
|
4950
|
+
if (arabicNode.overExpr && englishNode.overExpr) {
|
|
4951
|
+
arabicNode.overExpr.id = englishNode.overExpr.id;
|
|
4952
|
+
}
|
|
4953
|
+
if (arabicNode.baseExpr && englishNode.baseExpr) {
|
|
4954
|
+
arabicNode.baseExpr.id = englishNode.baseExpr.id;
|
|
4955
|
+
}
|
|
4956
|
+
insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);
|
|
4957
|
+
next.caret = {
|
|
4958
|
+
chainId: englishNode.overExpr ? englishNode.overExpr.id : next.caret.chainId,
|
|
4959
|
+
index: 0
|
|
4960
|
+
};
|
|
4961
|
+
next.selectedStructureNodeId = null;
|
|
4962
|
+
syncSelectionToCaret(next);
|
|
4963
|
+
appendDebug(next, "insertOverset", "");
|
|
4964
|
+
return next;
|
|
4965
|
+
}
|
|
4966
|
+
function insertUnderset(session) {
|
|
4967
|
+
const base = replaceSelectionFirst(session);
|
|
4968
|
+
const next = cloneEditorSession(base);
|
|
4969
|
+
const englishNode = createUndersetNode();
|
|
4970
|
+
const arabicNode = createUndersetNode();
|
|
4971
|
+
arabicNode.id = englishNode.id;
|
|
4972
|
+
if (arabicNode.underExpr && englishNode.underExpr) {
|
|
4973
|
+
arabicNode.underExpr.id = englishNode.underExpr.id;
|
|
4974
|
+
}
|
|
4975
|
+
if (arabicNode.baseExpr && englishNode.baseExpr) {
|
|
4976
|
+
arabicNode.baseExpr.id = englishNode.baseExpr.id;
|
|
4977
|
+
}
|
|
4978
|
+
insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);
|
|
4979
|
+
next.caret = {
|
|
4980
|
+
chainId: englishNode.underExpr ? englishNode.underExpr.id : next.caret.chainId,
|
|
4981
|
+
index: 0
|
|
4982
|
+
};
|
|
4983
|
+
next.selectedStructureNodeId = null;
|
|
4984
|
+
syncSelectionToCaret(next);
|
|
4985
|
+
appendDebug(next, "insertUnderset", "");
|
|
4986
|
+
return next;
|
|
4987
|
+
}
|
|
4988
|
+
function insertLimitsSeriesTemplate(session, commandId) {
|
|
4989
|
+
const base = replaceSelectionFirst(session);
|
|
4990
|
+
const next = cloneEditorSession(base);
|
|
4991
|
+
const { english, arabic } = buildLimitsSeriesTemplate(commandId);
|
|
4992
|
+
insertMirroredNode(next, next.caret.chainId, next.caret.index, english, arabic);
|
|
4993
|
+
syncSubtreeRecursive(next, english, arabic);
|
|
4994
|
+
next.caret = limitsSeriesTemplateInitialCaret(english);
|
|
4995
|
+
next.selectedStructureNodeId = null;
|
|
4996
|
+
syncSelectionToCaret(next);
|
|
4997
|
+
appendDebug(next, "insertLimitsSeriesTemplate", commandId);
|
|
4998
|
+
return next;
|
|
4999
|
+
}
|
|
5000
|
+
function insertAccentPair(session) {
|
|
5001
|
+
const base = replaceSelectionFirst(session);
|
|
5002
|
+
const next = cloneEditorSession(base);
|
|
5003
|
+
const { english, arabic } = buildAccentPairTemplate();
|
|
5004
|
+
insertMirroredNode(next, next.caret.chainId, next.caret.index, english, arabic);
|
|
5005
|
+
syncSubtreeRecursive(next, english, arabic);
|
|
5006
|
+
next.caret = accentPairTemplateInitialCaret(english);
|
|
5007
|
+
next.selectedStructureNodeId = null;
|
|
5008
|
+
syncSelectionToCaret(next);
|
|
5009
|
+
appendDebug(next, "insertAccentPair", "");
|
|
5010
|
+
return next;
|
|
5011
|
+
}
|
|
5012
|
+
function insertAccent(session, accentId) {
|
|
5013
|
+
const next = cloneEditorSession(session);
|
|
5014
|
+
const englishNode = createAccentNode(accentId);
|
|
5015
|
+
const arabicNode = createAccentNode(accentId);
|
|
5016
|
+
arabicNode.id = englishNode.id;
|
|
5017
|
+
if (arabicNode.baseExpr && englishNode.baseExpr) {
|
|
5018
|
+
arabicNode.baseExpr.id = englishNode.baseExpr.id;
|
|
5019
|
+
}
|
|
5020
|
+
if (isSelectionActive(next.selection) && next.selection) {
|
|
5021
|
+
const sel = next.selection;
|
|
5022
|
+
const { start, end } = normalizeSelection(sel);
|
|
5023
|
+
const englishLocated = findChainById(next.englishTree, sel.chainId);
|
|
5024
|
+
const arabicLocated = findChainById(next.arabicTree, sel.chainId);
|
|
5025
|
+
if (englishLocated && arabicLocated && end > start) {
|
|
5026
|
+
const count = end - start;
|
|
5027
|
+
const englishWrapped = englishLocated.chain.nodes.splice(start, count);
|
|
5028
|
+
const arabicWrapped = arabicLocated.chain.nodes.splice(start, count);
|
|
5029
|
+
englishNode.baseExpr.nodes = englishWrapped;
|
|
5030
|
+
arabicNode.baseExpr.nodes = arabicWrapped;
|
|
5031
|
+
englishLocated.chain.nodes.splice(start, 0, englishNode);
|
|
5032
|
+
arabicLocated.chain.nodes.splice(start, 0, arabicNode);
|
|
5033
|
+
syncSubtreeRecursive(next, englishNode, arabicNode);
|
|
5034
|
+
next.caret = {
|
|
5035
|
+
chainId: englishNode.baseExpr.id,
|
|
5036
|
+
index: englishWrapped.length
|
|
5037
|
+
};
|
|
5038
|
+
next.selection = null;
|
|
5039
|
+
next.selectedStructureNodeId = null;
|
|
5040
|
+
syncSelectionToCaret(next);
|
|
5041
|
+
appendDebug(next, "insertAccent", `${accentId}:wrap`);
|
|
5042
|
+
return next;
|
|
5043
|
+
}
|
|
5044
|
+
}
|
|
5045
|
+
insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);
|
|
5046
|
+
syncSubtreeRecursive(next, englishNode, arabicNode);
|
|
5047
|
+
next.caret = {
|
|
5048
|
+
chainId: englishNode.baseExpr ? englishNode.baseExpr.id : next.caret.chainId,
|
|
5049
|
+
index: 0
|
|
5050
|
+
};
|
|
5051
|
+
next.selection = null;
|
|
5052
|
+
next.selectedStructureNodeId = null;
|
|
5053
|
+
syncSelectionToCaret(next);
|
|
5054
|
+
appendDebug(next, "insertAccent", `${accentId}:empty`);
|
|
5055
|
+
return next;
|
|
5056
|
+
}
|
|
4412
5057
|
function insertMatrixEnv(session, style, rows, columns) {
|
|
4413
5058
|
return insertGridEnv(session, style, rows, columns);
|
|
4414
5059
|
}
|
|
@@ -4656,7 +5301,7 @@ function deleteBackward(session) {
|
|
|
4656
5301
|
if (!previousNode) {
|
|
4657
5302
|
return session;
|
|
4658
5303
|
}
|
|
4659
|
-
if ((previousNode.kind === "delimiter" || previousNode.kind === "frac" || previousNode.kind === "sqrt" || previousNode.kind === "env") && next.selectedStructureNodeId !== previousNode.id) {
|
|
5304
|
+
if ((previousNode.kind === "delimiter" || previousNode.kind === "frac" || previousNode.kind === "sqrt" || previousNode.kind === "overset" || previousNode.kind === "underset" || previousNode.kind === "accent" || previousNode.kind === "env") && next.selectedStructureNodeId !== previousNode.id) {
|
|
4660
5305
|
next.selectedStructureNodeId = previousNode.id;
|
|
4661
5306
|
next.selectedNodeId = previousNode.id;
|
|
4662
5307
|
appendDebug(next, "deleteBackward", "selected structure");
|
|
@@ -5146,6 +5791,168 @@ function buildSqrtNodeBody(node, buildChain, side) {
|
|
|
5146
5791
|
return wrap;
|
|
5147
5792
|
}
|
|
5148
5793
|
|
|
5794
|
+
// src/editor/display/overset.ts
|
|
5795
|
+
var OVERSET_CSS = `
|
|
5796
|
+
.overset {
|
|
5797
|
+
display: inline-flex;
|
|
5798
|
+
flex-direction: column;
|
|
5799
|
+
align-items: center;
|
|
5800
|
+
justify-content: center;
|
|
5801
|
+
vertical-align: middle;
|
|
5802
|
+
margin: 0 2px;
|
|
5803
|
+
min-width: 1.2em;
|
|
5804
|
+
}
|
|
5805
|
+
|
|
5806
|
+
.overset-over {
|
|
5807
|
+
display: inline-flex;
|
|
5808
|
+
justify-content: center;
|
|
5809
|
+
align-items: center;
|
|
5810
|
+
min-height: 0.85em;
|
|
5811
|
+
padding: 0 2px;
|
|
5812
|
+
font-size: 0.72em;
|
|
5813
|
+
line-height: 1.1;
|
|
5814
|
+
}
|
|
5815
|
+
|
|
5816
|
+
.overset-base {
|
|
5817
|
+
display: inline-flex;
|
|
5818
|
+
justify-content: center;
|
|
5819
|
+
align-items: center;
|
|
5820
|
+
min-height: 1.05em;
|
|
5821
|
+
padding: 0 2px;
|
|
5822
|
+
}
|
|
5823
|
+
`.trim();
|
|
5824
|
+
function buildOversetNodeBody(node, buildChain) {
|
|
5825
|
+
const wrap = document.createElement("span");
|
|
5826
|
+
wrap.className = "overset";
|
|
5827
|
+
const over = document.createElement("span");
|
|
5828
|
+
over.className = "overset-over";
|
|
5829
|
+
if (node.overExpr) {
|
|
5830
|
+
over.appendChild(buildChain(node.overExpr));
|
|
5831
|
+
}
|
|
5832
|
+
const base = document.createElement("span");
|
|
5833
|
+
base.className = "overset-base";
|
|
5834
|
+
if (node.baseExpr) {
|
|
5835
|
+
base.appendChild(buildChain(node.baseExpr));
|
|
5836
|
+
}
|
|
5837
|
+
wrap.appendChild(over);
|
|
5838
|
+
wrap.appendChild(base);
|
|
5839
|
+
return wrap;
|
|
5840
|
+
}
|
|
5841
|
+
|
|
5842
|
+
// src/editor/display/underset.ts
|
|
5843
|
+
var UNDERSET_CSS = `
|
|
5844
|
+
.underset {
|
|
5845
|
+
display: inline-flex;
|
|
5846
|
+
flex-direction: column;
|
|
5847
|
+
align-items: center;
|
|
5848
|
+
justify-content: center;
|
|
5849
|
+
vertical-align: middle;
|
|
5850
|
+
margin: 0 2px;
|
|
5851
|
+
min-width: 1.2em;
|
|
5852
|
+
}
|
|
5853
|
+
|
|
5854
|
+
.underset-base {
|
|
5855
|
+
display: inline-flex;
|
|
5856
|
+
justify-content: center;
|
|
5857
|
+
align-items: center;
|
|
5858
|
+
min-height: 1.05em;
|
|
5859
|
+
padding: 0 2px;
|
|
5860
|
+
}
|
|
5861
|
+
|
|
5862
|
+
.underset-under {
|
|
5863
|
+
display: inline-flex;
|
|
5864
|
+
justify-content: center;
|
|
5865
|
+
align-items: center;
|
|
5866
|
+
min-height: 0.85em;
|
|
5867
|
+
padding: 0 2px;
|
|
5868
|
+
font-size: 0.72em;
|
|
5869
|
+
line-height: 1.1;
|
|
5870
|
+
}
|
|
5871
|
+
`.trim();
|
|
5872
|
+
function buildUndersetNodeBody(node, buildChain) {
|
|
5873
|
+
const wrap = document.createElement("span");
|
|
5874
|
+
wrap.className = "underset";
|
|
5875
|
+
const base = document.createElement("span");
|
|
5876
|
+
base.className = "underset-base";
|
|
5877
|
+
if (node.baseExpr) {
|
|
5878
|
+
base.appendChild(buildChain(node.baseExpr));
|
|
5879
|
+
}
|
|
5880
|
+
const under = document.createElement("span");
|
|
5881
|
+
under.className = "underset-under";
|
|
5882
|
+
if (node.underExpr) {
|
|
5883
|
+
under.appendChild(buildChain(node.underExpr));
|
|
5884
|
+
}
|
|
5885
|
+
wrap.appendChild(base);
|
|
5886
|
+
wrap.appendChild(under);
|
|
5887
|
+
return wrap;
|
|
5888
|
+
}
|
|
5889
|
+
|
|
5890
|
+
// src/editor/display/accent.ts
|
|
5891
|
+
var ACCENT_CSS = `
|
|
5892
|
+
.math-accent {
|
|
5893
|
+
display: inline-flex;
|
|
5894
|
+
flex-direction: column;
|
|
5895
|
+
align-items: center;
|
|
5896
|
+
justify-content: center;
|
|
5897
|
+
vertical-align: middle;
|
|
5898
|
+
margin: 0 2px;
|
|
5899
|
+
min-width: 1.1em;
|
|
5900
|
+
}
|
|
5901
|
+
|
|
5902
|
+
.math-accent-chrome {
|
|
5903
|
+
display: inline-flex;
|
|
5904
|
+
justify-content: center;
|
|
5905
|
+
align-items: center;
|
|
5906
|
+
min-height: 0.7em;
|
|
5907
|
+
padding: 0 2px;
|
|
5908
|
+
font-size: 0.85em;
|
|
5909
|
+
line-height: 1;
|
|
5910
|
+
color: var(--butex-script-color, #475569);
|
|
5911
|
+
user-select: none;
|
|
5912
|
+
}
|
|
5913
|
+
|
|
5914
|
+
.math-accent-base {
|
|
5915
|
+
display: inline-flex;
|
|
5916
|
+
justify-content: center;
|
|
5917
|
+
align-items: center;
|
|
5918
|
+
min-height: 1.05em;
|
|
5919
|
+
padding: 0 2px;
|
|
5920
|
+
}
|
|
5921
|
+
|
|
5922
|
+
.math-accent--under .math-accent-chrome {
|
|
5923
|
+
min-height: 0.45em;
|
|
5924
|
+
border-top: 1.5px solid currentColor;
|
|
5925
|
+
width: 100%;
|
|
5926
|
+
font-size: 0;
|
|
5927
|
+
color: var(--butex-surface-fg, #0f172a);
|
|
5928
|
+
}
|
|
5929
|
+
`.trim();
|
|
5930
|
+
function buildAccentNodeBody(node, buildChain) {
|
|
5931
|
+
const wrap = document.createElement("span");
|
|
5932
|
+
const spec = accentCommandSpec(node.expr);
|
|
5933
|
+
const placement = spec?.placement ?? "over";
|
|
5934
|
+
wrap.className = placement === "under" ? "math-accent math-accent--under" : "math-accent math-accent--over";
|
|
5935
|
+
const chrome = document.createElement("span");
|
|
5936
|
+
chrome.className = "math-accent-chrome";
|
|
5937
|
+
chrome.setAttribute("aria-hidden", "true");
|
|
5938
|
+
if (placement === "over") {
|
|
5939
|
+
chrome.textContent = spec?.label ?? "\u02C6";
|
|
5940
|
+
}
|
|
5941
|
+
const base = document.createElement("span");
|
|
5942
|
+
base.className = "math-accent-base";
|
|
5943
|
+
if (node.baseExpr) {
|
|
5944
|
+
base.appendChild(buildChain(node.baseExpr));
|
|
5945
|
+
}
|
|
5946
|
+
if (placement === "under") {
|
|
5947
|
+
wrap.appendChild(base);
|
|
5948
|
+
wrap.appendChild(chrome);
|
|
5949
|
+
} else {
|
|
5950
|
+
wrap.appendChild(chrome);
|
|
5951
|
+
wrap.appendChild(base);
|
|
5952
|
+
}
|
|
5953
|
+
return wrap;
|
|
5954
|
+
}
|
|
5955
|
+
|
|
5149
5956
|
// src/editor/display/env.ts
|
|
5150
5957
|
var WRAPPERS = {
|
|
5151
5958
|
matrix: { left: "", right: "" },
|
|
@@ -5518,6 +6325,15 @@ function buildNodeBody(node, buildChain, side, digitForm = "western", uiLocale =
|
|
|
5518
6325
|
if (node.kind === "sqrt") {
|
|
5519
6326
|
return buildSqrtNodeBody(node, buildChain, side);
|
|
5520
6327
|
}
|
|
6328
|
+
if (node.kind === "overset") {
|
|
6329
|
+
return buildOversetNodeBody(node, buildChain);
|
|
6330
|
+
}
|
|
6331
|
+
if (node.kind === "underset") {
|
|
6332
|
+
return buildUndersetNodeBody(node, buildChain);
|
|
6333
|
+
}
|
|
6334
|
+
if (node.kind === "accent") {
|
|
6335
|
+
return buildAccentNodeBody(node, buildChain);
|
|
6336
|
+
}
|
|
5521
6337
|
if (node.kind === "env") {
|
|
5522
6338
|
return buildMatrixEnvNodeBody(node, buildChain, side);
|
|
5523
6339
|
}
|
|
@@ -5717,6 +6533,12 @@ ${FRAC_CSS}
|
|
|
5717
6533
|
|
|
5718
6534
|
${SQRT_CSS}
|
|
5719
6535
|
|
|
6536
|
+
${OVERSET_CSS}
|
|
6537
|
+
|
|
6538
|
+
${UNDERSET_CSS}
|
|
6539
|
+
|
|
6540
|
+
${ACCENT_CSS}
|
|
6541
|
+
|
|
5720
6542
|
${MATRIX_ENV_CSS}
|
|
5721
6543
|
|
|
5722
6544
|
${ATOMIC_COMMAND_CSS}
|
|
@@ -6436,6 +7258,26 @@ function createEditorRuntime(options) {
|
|
|
6436
7258
|
applyStructural((prev) => insertSqrt(prev));
|
|
6437
7259
|
surfaceEl.focus();
|
|
6438
7260
|
},
|
|
7261
|
+
insertOverset: () => {
|
|
7262
|
+
applyStructural((prev) => insertOverset(prev));
|
|
7263
|
+
surfaceEl.focus();
|
|
7264
|
+
},
|
|
7265
|
+
insertUnderset: () => {
|
|
7266
|
+
applyStructural((prev) => insertUnderset(prev));
|
|
7267
|
+
surfaceEl.focus();
|
|
7268
|
+
},
|
|
7269
|
+
insertLimitsSeriesTemplate: (commandId) => {
|
|
7270
|
+
applyStructural((prev) => insertLimitsSeriesTemplate(prev, commandId));
|
|
7271
|
+
surfaceEl.focus();
|
|
7272
|
+
},
|
|
7273
|
+
insertAccentPair: () => {
|
|
7274
|
+
applyStructural((prev) => insertAccentPair(prev));
|
|
7275
|
+
surfaceEl.focus();
|
|
7276
|
+
},
|
|
7277
|
+
insertAccent: (accentId) => {
|
|
7278
|
+
applyStructural((prev) => insertAccent(prev, accentId));
|
|
7279
|
+
surfaceEl.focus();
|
|
7280
|
+
},
|
|
6439
7281
|
insertAtomicCommand: (commandId) => {
|
|
6440
7282
|
applyStructural((prev) => insertAtomicCommand(prev, commandId));
|
|
6441
7283
|
surfaceEl.focus();
|
|
@@ -6762,6 +7604,56 @@ function commandToEditorNode(node) {
|
|
|
6762
7604
|
}
|
|
6763
7605
|
return { editable: true, node: sqrt };
|
|
6764
7606
|
}
|
|
7607
|
+
if (node.name === "\\overset" && node.mandatoryArgs.length >= 2) {
|
|
7608
|
+
const overset = createOversetNode();
|
|
7609
|
+
const overExpr = chainToEditorChain(node.mandatoryArgs[0]);
|
|
7610
|
+
const baseExpr = chainToEditorChain(node.mandatoryArgs[1]);
|
|
7611
|
+
if (!overExpr.editable) {
|
|
7612
|
+
return overExpr;
|
|
7613
|
+
}
|
|
7614
|
+
if (!baseExpr.editable) {
|
|
7615
|
+
return baseExpr;
|
|
7616
|
+
}
|
|
7617
|
+
overset.overExpr = overExpr.chain;
|
|
7618
|
+
overset.baseExpr = baseExpr.chain;
|
|
7619
|
+
const scripts = attachScripts(node, overset);
|
|
7620
|
+
if (scripts) {
|
|
7621
|
+
return scripts;
|
|
7622
|
+
}
|
|
7623
|
+
return { editable: true, node: overset };
|
|
7624
|
+
}
|
|
7625
|
+
if (node.name === "\\underset" && node.mandatoryArgs.length >= 2) {
|
|
7626
|
+
const underset = createUndersetNode();
|
|
7627
|
+
const underExpr = chainToEditorChain(node.mandatoryArgs[0]);
|
|
7628
|
+
const baseExpr = chainToEditorChain(node.mandatoryArgs[1]);
|
|
7629
|
+
if (!underExpr.editable) {
|
|
7630
|
+
return underExpr;
|
|
7631
|
+
}
|
|
7632
|
+
if (!baseExpr.editable) {
|
|
7633
|
+
return baseExpr;
|
|
7634
|
+
}
|
|
7635
|
+
underset.underExpr = underExpr.chain;
|
|
7636
|
+
underset.baseExpr = baseExpr.chain;
|
|
7637
|
+
const scripts = attachScripts(node, underset);
|
|
7638
|
+
if (scripts) {
|
|
7639
|
+
return scripts;
|
|
7640
|
+
}
|
|
7641
|
+
return { editable: true, node: underset };
|
|
7642
|
+
}
|
|
7643
|
+
const accentId = accentCommandIdFromTex(node.name);
|
|
7644
|
+
if (accentId && node.mandatoryArgs.length >= 1) {
|
|
7645
|
+
const accent = createAccentNode(accentId);
|
|
7646
|
+
const baseExpr = chainToEditorChain(node.mandatoryArgs[0]);
|
|
7647
|
+
if (!baseExpr.editable) {
|
|
7648
|
+
return baseExpr;
|
|
7649
|
+
}
|
|
7650
|
+
accent.baseExpr = baseExpr.chain;
|
|
7651
|
+
const scripts = attachScripts(node, accent);
|
|
7652
|
+
if (scripts) {
|
|
7653
|
+
return scripts;
|
|
7654
|
+
}
|
|
7655
|
+
return { editable: true, node: accent };
|
|
7656
|
+
}
|
|
6765
7657
|
const atomicId = commandIdForTex(node.name);
|
|
6766
7658
|
if (atomicId && node.optionalArgs.length === 0 && node.mandatoryArgs.length === 0) {
|
|
6767
7659
|
const atomic = createEditorNode("atomicCommand", atomicId);
|
|
@@ -6898,6 +7790,21 @@ function editorEnvToAstNode(node) {
|
|
|
6898
7790
|
const scripts = attachAstScripts(node, env);
|
|
6899
7791
|
return scripts ?? { ok: true, node: env };
|
|
6900
7792
|
}
|
|
7793
|
+
function accentChainForExport(accent) {
|
|
7794
|
+
if (!accent) {
|
|
7795
|
+
return { ok: true, chain: new ChainNode([]) };
|
|
7796
|
+
}
|
|
7797
|
+
return editorChainToAstChain(accent);
|
|
7798
|
+
}
|
|
7799
|
+
function nodeFromAccentBase(command, accent, base) {
|
|
7800
|
+
if (accent.chain.length > 0) {
|
|
7801
|
+
return new CommandNode(command, [], [accent, base]);
|
|
7802
|
+
}
|
|
7803
|
+
if (base.chain.length === 1) {
|
|
7804
|
+
return base.chain[0];
|
|
7805
|
+
}
|
|
7806
|
+
return new DelimiterNode("", base, "");
|
|
7807
|
+
}
|
|
6901
7808
|
function editorNodeToAstNode(node) {
|
|
6902
7809
|
let astNode;
|
|
6903
7810
|
if (node.kind === "char") {
|
|
@@ -6936,6 +7843,36 @@ function editorNodeToAstNode(node) {
|
|
|
6936
7843
|
optionalArgs.push(rootIndex.chain);
|
|
6937
7844
|
}
|
|
6938
7845
|
astNode = new CommandNode("\\sqrt", optionalArgs, [radicand.chain]);
|
|
7846
|
+
} else if (node.kind === "overset" && node.baseExpr) {
|
|
7847
|
+
const accent = accentChainForExport(node.overExpr);
|
|
7848
|
+
if (!accent.ok) {
|
|
7849
|
+
return accent;
|
|
7850
|
+
}
|
|
7851
|
+
const baseExpr = editorChainToAstChain(node.baseExpr);
|
|
7852
|
+
if (!baseExpr.ok) {
|
|
7853
|
+
return baseExpr;
|
|
7854
|
+
}
|
|
7855
|
+
astNode = nodeFromAccentBase("\\overset", accent.chain, baseExpr.chain);
|
|
7856
|
+
} else if (node.kind === "underset" && node.baseExpr) {
|
|
7857
|
+
const accent = accentChainForExport(node.underExpr);
|
|
7858
|
+
if (!accent.ok) {
|
|
7859
|
+
return accent;
|
|
7860
|
+
}
|
|
7861
|
+
const baseExpr = editorChainToAstChain(node.baseExpr);
|
|
7862
|
+
if (!baseExpr.ok) {
|
|
7863
|
+
return baseExpr;
|
|
7864
|
+
}
|
|
7865
|
+
astNode = nodeFromAccentBase("\\underset", accent.chain, baseExpr.chain);
|
|
7866
|
+
} else if (node.kind === "accent" && node.baseExpr) {
|
|
7867
|
+
const tex = accentCommandSpec(node.expr)?.englishTex;
|
|
7868
|
+
if (!tex) {
|
|
7869
|
+
return { ok: false, reason: `\u0644\u0643\u0646\u0629 \u0631\u064A\u0627\u0636\u064A\u0629 \u063A\u064A\u0631 \u0645\u062F\u0639\u0648\u0645\u0629 \u062D\u0627\u0644\u064A\u0627: ${node.expr}` };
|
|
7870
|
+
}
|
|
7871
|
+
const baseExpr = editorChainToAstChain(node.baseExpr);
|
|
7872
|
+
if (!baseExpr.ok) {
|
|
7873
|
+
return baseExpr;
|
|
7874
|
+
}
|
|
7875
|
+
astNode = new CommandNode(tex, [], [baseExpr.chain]);
|
|
6939
7876
|
} else if (node.kind === "atomicCommand") {
|
|
6940
7877
|
const tex = atomicCommandSpec(node.expr)?.englishTex;
|
|
6941
7878
|
if (!tex) {
|
|
@@ -7707,7 +8644,6 @@ function arabicXeLatexPreamblePkg(twocolumn = false) {
|
|
|
7707
8644
|
\usepackage{polyglossia} % For Arabic support
|
|
7708
8645
|
\usepackage{array}
|
|
7709
8646
|
\usepackage{cancel}
|
|
7710
|
-
\usepackage{bidi} % For bidirectional text handling
|
|
7711
8647
|
\usepackage{multirow}
|
|
7712
8648
|
\usepackage{booktabs}
|
|
7713
8649
|
\usepackage{graphicx} % For \reflectbox
|
|
@@ -7715,7 +8651,8 @@ function arabicXeLatexPreamblePkg(twocolumn = false) {
|
|
|
7715
8651
|
\usepackage{tikz}
|
|
7716
8652
|
\usepackage{tcolorbox} % For tcolorbox environment
|
|
7717
8653
|
\usepackage{textcomp} % For \textrightarrow command
|
|
7718
|
-
|
|
8654
|
+
\usepackage{url}
|
|
8655
|
+
\usepackage{bidi}
|
|
7719
8656
|
|
|
7720
8657
|
% visit : https://www.symbolcopy.com/punctuation-symbol.html
|
|
7721
8658
|
% for inversed punctuation
|
|
@@ -10999,6 +11936,29 @@ var WIDGET_CHROME_CSS = `
|
|
|
10999
11936
|
padding-top: 1px;
|
|
11000
11937
|
}
|
|
11001
11938
|
|
|
11939
|
+
.butex-widget .toolbar-accent-icon {
|
|
11940
|
+
display: inline-flex;
|
|
11941
|
+
flex-direction: column;
|
|
11942
|
+
align-items: center;
|
|
11943
|
+
justify-content: center;
|
|
11944
|
+
min-width: 14px;
|
|
11945
|
+
font-size: 10px;
|
|
11946
|
+
line-height: 1;
|
|
11947
|
+
gap: 1px;
|
|
11948
|
+
}
|
|
11949
|
+
|
|
11950
|
+
.butex-widget .toolbar-accent-icon--over span:first-child,
|
|
11951
|
+
.butex-widget .toolbar-accent-icon--under span:last-child {
|
|
11952
|
+
font-size: 8px;
|
|
11953
|
+
opacity: 0.85;
|
|
11954
|
+
}
|
|
11955
|
+
|
|
11956
|
+
.butex-widget .toolbar-accent-icon--pair span:first-child,
|
|
11957
|
+
.butex-widget .toolbar-accent-icon--pair span:last-child {
|
|
11958
|
+
font-size: 8px;
|
|
11959
|
+
opacity: 0.85;
|
|
11960
|
+
}
|
|
11961
|
+
|
|
11002
11962
|
.butex-widget .matrix-command-menu {
|
|
11003
11963
|
position: relative;
|
|
11004
11964
|
display: inline-flex;
|
|
@@ -11735,6 +12695,7 @@ var CHARACTER_FONT_OPTIONS = [
|
|
|
11735
12695
|
{ id: "diwani", label: "\u062F\u064A\u0648" },
|
|
11736
12696
|
{ id: "diwaniOutline", label: "\u0638\u0644" }
|
|
11737
12697
|
];
|
|
12698
|
+
var ACCENT_COMMANDS_LIST = accentCommandsList();
|
|
11738
12699
|
var FUNCTION_COMMANDS = atomicCommandsByCategory("function");
|
|
11739
12700
|
var LIMITS_SERIES_COMMANDS = atomicCommandsByCategory("limits_series");
|
|
11740
12701
|
var FUNCTION2_COMMANDS = atomicCommandsByCategory("function2");
|
|
@@ -11882,6 +12843,7 @@ var ButexEditor = (0, import_react8.forwardRef)(
|
|
|
11882
12843
|
const [operator2MenuOpen, setOperator2MenuOpen] = (0, import_react8.useState)(false);
|
|
11883
12844
|
const [operator3MenuOpen, setOperator3MenuOpen] = (0, import_react8.useState)(false);
|
|
11884
12845
|
const [dotMenuOpen, setDotMenuOpen] = (0, import_react8.useState)(false);
|
|
12846
|
+
const [accentMenuOpen, setAccentMenuOpen] = (0, import_react8.useState)(false);
|
|
11885
12847
|
const [integralMenuOpen, setIntegralMenuOpen] = (0, import_react8.useState)(false);
|
|
11886
12848
|
const [selectedDigitForm2, setSelectedDigitForm] = (0, import_react8.useState)("western");
|
|
11887
12849
|
const [selectedCharacterFont, setSelectedCharacterFont] = (0, import_react8.useState)("default");
|
|
@@ -12151,7 +13113,78 @@ ${arabic || currentMessages.empty}`;
|
|
|
12151
13113
|
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("button", { id: "insert-sqrt", className: "icon-btn", type: "button", title: messages.insertRoot, "aria-label": messages.insertRoot, onClick: () => {
|
|
12152
13114
|
runtimeRef.current?.insertSqrt();
|
|
12153
13115
|
focusSurface();
|
|
12154
|
-
}, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "toolbar-sqrt-icon", "aria-hidden": "true", children: "\u221A" }) })
|
|
13116
|
+
}, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "toolbar-sqrt-icon", "aria-hidden": "true", children: "\u221A" }) }),
|
|
13117
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("button", { id: "insert-overset", className: "icon-btn", type: "button", title: messages.insertOverset, "aria-label": messages.insertOverset, onClick: () => {
|
|
13118
|
+
runtimeRef.current?.insertOverset();
|
|
13119
|
+
focusSurface();
|
|
13120
|
+
}, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: "toolbar-accent-icon toolbar-accent-icon--over", "aria-hidden": "true", children: [
|
|
13121
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: "\u2217" }),
|
|
13122
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: "\u25A1" })
|
|
13123
|
+
] }) }),
|
|
13124
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("button", { id: "insert-underset", className: "icon-btn", type: "button", title: messages.insertUnderset, "aria-label": messages.insertUnderset, onClick: () => {
|
|
13125
|
+
runtimeRef.current?.insertUnderset();
|
|
13126
|
+
focusSurface();
|
|
13127
|
+
}, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: "toolbar-accent-icon toolbar-accent-icon--under", "aria-hidden": "true", children: [
|
|
13128
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: "\u25A1" }),
|
|
13129
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: "\u2217" })
|
|
13130
|
+
] }) }),
|
|
13131
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("button", { id: "insert-accent-pair", className: "icon-btn", type: "button", title: messages.insertAccentPair, "aria-label": messages.insertAccentPair, onClick: () => {
|
|
13132
|
+
runtimeRef.current?.insertAccentPair();
|
|
13133
|
+
focusSurface();
|
|
13134
|
+
}, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: "toolbar-accent-icon toolbar-accent-icon--pair", "aria-hidden": "true", children: [
|
|
13135
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: "\u2217" }),
|
|
13136
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: "\u25A1" }),
|
|
13137
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: "\u2217" })
|
|
13138
|
+
] }) }),
|
|
13139
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
13140
|
+
"div",
|
|
13141
|
+
{
|
|
13142
|
+
className: "function-command-menu operator-command-menu",
|
|
13143
|
+
onBlur: (event) => {
|
|
13144
|
+
const nextFocus = event.relatedTarget;
|
|
13145
|
+
if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {
|
|
13146
|
+
setAccentMenuOpen(false);
|
|
13147
|
+
}
|
|
13148
|
+
},
|
|
13149
|
+
children: [
|
|
13150
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
13151
|
+
"button",
|
|
13152
|
+
{
|
|
13153
|
+
id: "insert-accents",
|
|
13154
|
+
className: "icon-btn function-command-btn operator-command-btn",
|
|
13155
|
+
type: "button",
|
|
13156
|
+
title: messages.insertAccents,
|
|
13157
|
+
"aria-label": messages.insertAccents,
|
|
13158
|
+
"aria-haspopup": "listbox",
|
|
13159
|
+
"aria-expanded": accentMenuOpen,
|
|
13160
|
+
onClick: () => setAccentMenuOpen((open) => !open),
|
|
13161
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: "toolbar-accent-icon toolbar-accent-icon--over", "aria-hidden": "true", children: [
|
|
13162
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: "\u02C6" }),
|
|
13163
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: "\u25A1" })
|
|
13164
|
+
] })
|
|
13165
|
+
}
|
|
13166
|
+
),
|
|
13167
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "function-command-options operator-command-options", role: "listbox", "aria-label": messages.insertAccents, hidden: !accentMenuOpen, children: ACCENT_COMMANDS_LIST.map((command) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
13168
|
+
"button",
|
|
13169
|
+
{
|
|
13170
|
+
className: "function-command-option operator-command-option",
|
|
13171
|
+
type: "button",
|
|
13172
|
+
role: "option",
|
|
13173
|
+
title: accentCommandTitle(command, uiLocale),
|
|
13174
|
+
"aria-label": accentCommandTitle(command, uiLocale),
|
|
13175
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
13176
|
+
onClick: () => {
|
|
13177
|
+
runtimeRef.current?.insertAccent(command.id);
|
|
13178
|
+
setAccentMenuOpen(false);
|
|
13179
|
+
focusSurface();
|
|
13180
|
+
},
|
|
13181
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "operator-command-label", children: command.label })
|
|
13182
|
+
},
|
|
13183
|
+
command.id
|
|
13184
|
+
)) })
|
|
13185
|
+
]
|
|
13186
|
+
}
|
|
13187
|
+
)
|
|
12155
13188
|
] }),
|
|
12156
13189
|
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "toolbar-group toolbar-environments", role: "group", "aria-label": messages.environments, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
12157
13190
|
"div",
|
|
@@ -12479,7 +13512,7 @@ ${arabic || currentMessages.empty}`;
|
|
|
12479
13512
|
"aria-label": atomicCommandTitle(command, uiLocale),
|
|
12480
13513
|
onMouseDown: (event) => event.preventDefault(),
|
|
12481
13514
|
onClick: () => {
|
|
12482
|
-
runtimeRef.current?.
|
|
13515
|
+
runtimeRef.current?.insertLimitsSeriesTemplate(command.id);
|
|
12483
13516
|
setLimitsSeriesMenuOpen(false);
|
|
12484
13517
|
focusSurface();
|
|
12485
13518
|
},
|