@drghaliasri/butex 4.1.0 → 4.2.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.
- package/README.md +4 -3
- package/dist/document.js +37 -1
- package/dist/document.js.map +1 -1
- package/dist/document.mjs +37 -1
- package/dist/document.mjs.map +1 -1
- package/dist/document2.js +40 -1
- package/dist/document2.js.map +1 -1
- package/dist/document2.mjs +40 -1
- package/dist/document2.mjs.map +1 -1
- package/dist/index.d.mts +20 -2
- package/dist/index.d.ts +20 -2
- package/dist/index.global.js +223 -4
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +223 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +223 -4
- package/dist/index.mjs.map +1 -1
- package/dist/react-document.js +317 -5
- package/dist/react-document.js.map +1 -1
- package/dist/react-document.mjs +317 -5
- package/dist/react-document.mjs.map +1 -1
- package/dist/react-document2.js +317 -5
- package/dist/react-document2.js.map +1 -1
- package/dist/react-document2.mjs +317 -5
- package/dist/react-document2.mjs.map +1 -1
- package/dist/react.d.mts +11 -0
- package/dist/react.d.ts +11 -0
- package/dist/react.js +303 -4
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +303 -4
- package/dist/react.mjs.map +1 -1
- package/package.json +1 -1
package/dist/react-document.mjs
CHANGED
|
@@ -917,6 +917,16 @@ var ATOMIC_COMMANDS = {
|
|
|
917
917
|
arabicLabel: "\u0645\u062D\u062F\u062F",
|
|
918
918
|
title: "\u0645\u062D\u062F\u062F"
|
|
919
919
|
},
|
|
920
|
+
////////////////////// Derivatives ////////////////////////////////
|
|
921
|
+
ad: {
|
|
922
|
+
id: "ad",
|
|
923
|
+
category: "derivative",
|
|
924
|
+
englishTex: "\\mathrm{d}",
|
|
925
|
+
englishLabel: "d",
|
|
926
|
+
arabicTex: "\\ad",
|
|
927
|
+
arabicLabel: "\u0621",
|
|
928
|
+
title: "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0627\u0634\u062A\u0642\u0627\u0642"
|
|
929
|
+
},
|
|
920
930
|
////////////////////// Groups /////////////////////////////////
|
|
921
931
|
N: {
|
|
922
932
|
id: "N",
|
|
@@ -1740,6 +1750,22 @@ function createEditorSession(englishTree, arabicTree, activeSide = "arabic") {
|
|
|
1740
1750
|
};
|
|
1741
1751
|
}
|
|
1742
1752
|
|
|
1753
|
+
// src/editor/divideOperator.ts
|
|
1754
|
+
var DIVIDE_OPERATOR_EN = "/";
|
|
1755
|
+
var DIVIDE_OPERATOR_AR = "\\";
|
|
1756
|
+
function isDivideOperatorExpr(expr) {
|
|
1757
|
+
return expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR;
|
|
1758
|
+
}
|
|
1759
|
+
function divideOperatorSurfaceExpr(expr, side) {
|
|
1760
|
+
if (!isDivideOperatorExpr(expr)) {
|
|
1761
|
+
return expr;
|
|
1762
|
+
}
|
|
1763
|
+
return side === "arabic" ? DIVIDE_OPERATOR_AR : DIVIDE_OPERATOR_EN;
|
|
1764
|
+
}
|
|
1765
|
+
function renderDivideOperatorLatex(side) {
|
|
1766
|
+
return side === "arabic" ? "\\backslash" : DIVIDE_OPERATOR_EN;
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1743
1769
|
// src/editor/digits.ts
|
|
1744
1770
|
var WESTERN = "0123456789";
|
|
1745
1771
|
var ARABIC_INDIC = "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669";
|
|
@@ -1888,6 +1914,9 @@ function renderNodeEnglish(node, options) {
|
|
|
1888
1914
|
if (node.kind === "char") {
|
|
1889
1915
|
return `${renderCharContent(node, options)}${latinScripts(node, options)}`;
|
|
1890
1916
|
}
|
|
1917
|
+
if (node.kind === "operator" && isDivideOperatorExpr(node.expr)) {
|
|
1918
|
+
return `${renderDivideOperatorLatex("english")}${latinScripts(node, options)}`;
|
|
1919
|
+
}
|
|
1891
1920
|
return `${formatDigits(node.expr, selectedDigitForm(options))}${latinScripts(node, options)}`;
|
|
1892
1921
|
}
|
|
1893
1922
|
function renderNodeArabic(node, options) {
|
|
@@ -1922,6 +1951,9 @@ function renderNodeArabic(node, options) {
|
|
|
1922
1951
|
const content = renderCharContent(node, options);
|
|
1923
1952
|
return arabicScripts(node, (node.characterFont ?? "default") === "default" ? `\\text{${escapeText(expr)}}` : content, options);
|
|
1924
1953
|
}
|
|
1954
|
+
if (node.kind === "operator" && isDivideOperatorExpr(node.expr)) {
|
|
1955
|
+
return arabicScripts(node, renderDivideOperatorLatex("arabic"), options);
|
|
1956
|
+
}
|
|
1925
1957
|
return arabicScripts(node, formatDigits(node.expr, selectedDigitForm(options)), options);
|
|
1926
1958
|
}
|
|
1927
1959
|
function renderChainEnglish(chain, options) {
|
|
@@ -2445,6 +2477,128 @@ function undoRedoCanRedo(stacks) {
|
|
|
2445
2477
|
return stacks.future.length > 0;
|
|
2446
2478
|
}
|
|
2447
2479
|
|
|
2480
|
+
// src/editor/derivativeTemplates.ts
|
|
2481
|
+
var ARABIC_VAR = "\u0633";
|
|
2482
|
+
var ENGLISH_VAR = "x";
|
|
2483
|
+
function mirroredAd() {
|
|
2484
|
+
const english = createAtomicCommandNode("ad");
|
|
2485
|
+
const arabic = createAtomicCommandNode("ad");
|
|
2486
|
+
arabic.id = english.id;
|
|
2487
|
+
return { english, arabic };
|
|
2488
|
+
}
|
|
2489
|
+
function mirroredVar() {
|
|
2490
|
+
const english = createEditorNode("char", ENGLISH_VAR);
|
|
2491
|
+
const arabic = createEditorNode("char", ARABIC_VAR);
|
|
2492
|
+
arabic.id = english.id;
|
|
2493
|
+
return { english, arabic };
|
|
2494
|
+
}
|
|
2495
|
+
function withMirroredSuperscript2(english, arabic) {
|
|
2496
|
+
const englishSup = createEditorChain([createEditorNode("number", "2")]);
|
|
2497
|
+
const arabicSup = createEditorChain([createEditorNode("number", "2")]);
|
|
2498
|
+
arabicSup.id = englishSup.id;
|
|
2499
|
+
arabicSup.nodes[0].id = englishSup.nodes[0].id;
|
|
2500
|
+
english.superscript = englishSup;
|
|
2501
|
+
arabic.superscript = arabicSup;
|
|
2502
|
+
}
|
|
2503
|
+
function syncChainIds(english, arabic) {
|
|
2504
|
+
arabic.id = english.id;
|
|
2505
|
+
const limit = Math.min(english.nodes.length, arabic.nodes.length);
|
|
2506
|
+
for (let index = 0; index < limit; index += 1) {
|
|
2507
|
+
arabic.nodes[index].id = english.nodes[index].id;
|
|
2508
|
+
}
|
|
2509
|
+
}
|
|
2510
|
+
function syncFracIds(englishFrac, arabicFrac) {
|
|
2511
|
+
arabicFrac.id = englishFrac.id;
|
|
2512
|
+
if (englishFrac.numerator && arabicFrac.numerator) {
|
|
2513
|
+
syncChainIds(englishFrac.numerator, arabicFrac.numerator);
|
|
2514
|
+
}
|
|
2515
|
+
if (englishFrac.denominator && arabicFrac.denominator) {
|
|
2516
|
+
syncChainIds(englishFrac.denominator, arabicFrac.denominator);
|
|
2517
|
+
}
|
|
2518
|
+
}
|
|
2519
|
+
function buildAdVarChain() {
|
|
2520
|
+
const ad = mirroredAd();
|
|
2521
|
+
const variable = mirroredVar();
|
|
2522
|
+
const english = createEditorChain([ad.english, variable.english]);
|
|
2523
|
+
const arabic = createEditorChain([ad.arabic, variable.arabic]);
|
|
2524
|
+
syncChainIds(english, arabic);
|
|
2525
|
+
return { english, arabic };
|
|
2526
|
+
}
|
|
2527
|
+
function mirroredEmptyDelimiter() {
|
|
2528
|
+
const english = createDelimiterNode("", "");
|
|
2529
|
+
const arabic = createDelimiterNode("", "");
|
|
2530
|
+
arabic.id = english.id;
|
|
2531
|
+
if (english.innerExpr && arabic.innerExpr) {
|
|
2532
|
+
syncChainIds(english.innerExpr, arabic.innerExpr);
|
|
2533
|
+
}
|
|
2534
|
+
return { english, arabic };
|
|
2535
|
+
}
|
|
2536
|
+
function setMirroredDelimiterInner(english, arabic, pairs) {
|
|
2537
|
+
const englishInner = createEditorChain(pairs.map((pair) => pair.english));
|
|
2538
|
+
const arabicInner = createEditorChain(pairs.map((pair) => pair.arabic));
|
|
2539
|
+
syncChainIds(englishInner, arabicInner);
|
|
2540
|
+
english.innerExpr = englishInner;
|
|
2541
|
+
arabic.innerExpr = arabicInner;
|
|
2542
|
+
}
|
|
2543
|
+
function buildFirstDerivativeFrac() {
|
|
2544
|
+
const englishFrac = createFracNode();
|
|
2545
|
+
const arabicFrac = createFracNode();
|
|
2546
|
+
syncFracIds(englishFrac, arabicFrac);
|
|
2547
|
+
const numerator = buildAdVarChain();
|
|
2548
|
+
const denominator = buildAdVarChain();
|
|
2549
|
+
englishFrac.numerator = numerator.english;
|
|
2550
|
+
englishFrac.denominator = denominator.english;
|
|
2551
|
+
arabicFrac.numerator = numerator.arabic;
|
|
2552
|
+
arabicFrac.denominator = denominator.arabic;
|
|
2553
|
+
return { english: englishFrac, arabic: arabicFrac };
|
|
2554
|
+
}
|
|
2555
|
+
function buildSecondDerivativeFrac() {
|
|
2556
|
+
const englishFrac = createFracNode();
|
|
2557
|
+
const arabicFrac = createFracNode();
|
|
2558
|
+
syncFracIds(englishFrac, arabicFrac);
|
|
2559
|
+
const numAd = mirroredAd();
|
|
2560
|
+
const numVar = mirroredVar();
|
|
2561
|
+
withMirroredSuperscript2(numAd.english, numAd.arabic);
|
|
2562
|
+
const englishNumerator = createEditorChain([numAd.english, numVar.english]);
|
|
2563
|
+
const arabicNumerator = createEditorChain([numAd.arabic, numVar.arabic]);
|
|
2564
|
+
syncChainIds(englishNumerator, arabicNumerator);
|
|
2565
|
+
englishFrac.numerator = englishNumerator;
|
|
2566
|
+
arabicFrac.numerator = arabicNumerator;
|
|
2567
|
+
const denGroup = mirroredEmptyDelimiter();
|
|
2568
|
+
const denInnerAd = mirroredAd();
|
|
2569
|
+
const denInnerVar = mirroredVar();
|
|
2570
|
+
setMirroredDelimiterInner(denGroup.english, denGroup.arabic, [
|
|
2571
|
+
{ english: denInnerAd.english, arabic: denInnerAd.arabic },
|
|
2572
|
+
{ english: denInnerVar.english, arabic: denInnerVar.arabic }
|
|
2573
|
+
]);
|
|
2574
|
+
withMirroredSuperscript2(denGroup.english, denGroup.arabic);
|
|
2575
|
+
englishFrac.denominator = createEditorChain([denGroup.english]);
|
|
2576
|
+
arabicFrac.denominator = createEditorChain([denGroup.arabic]);
|
|
2577
|
+
syncChainIds(englishFrac.denominator, arabicFrac.denominator);
|
|
2578
|
+
return { english: englishFrac, arabic: arabicFrac };
|
|
2579
|
+
}
|
|
2580
|
+
var DERIVATIVE_TEMPLATE_VAR_CARET_INDEX = 1;
|
|
2581
|
+
function derivativeTemplateInitialCaret(englishFrac) {
|
|
2582
|
+
const denominator = englishFrac.denominator;
|
|
2583
|
+
if (!denominator) {
|
|
2584
|
+
return {
|
|
2585
|
+
chainId: englishFrac.numerator?.id ?? "",
|
|
2586
|
+
index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX
|
|
2587
|
+
};
|
|
2588
|
+
}
|
|
2589
|
+
const loneDelimiter = denominator.nodes.length === 1 && denominator.nodes[0]?.kind === "delimiter" && denominator.nodes[0].innerExpr;
|
|
2590
|
+
if (loneDelimiter) {
|
|
2591
|
+
return {
|
|
2592
|
+
chainId: denominator.nodes[0].innerExpr.id,
|
|
2593
|
+
index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX
|
|
2594
|
+
};
|
|
2595
|
+
}
|
|
2596
|
+
return {
|
|
2597
|
+
chainId: denominator.id,
|
|
2598
|
+
index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX
|
|
2599
|
+
};
|
|
2600
|
+
}
|
|
2601
|
+
|
|
2448
2602
|
// src/editor/uiLocale.ts
|
|
2449
2603
|
var ENGLISH_COMMAND_TITLES = {
|
|
2450
2604
|
cos: "Cosine",
|
|
@@ -2475,6 +2629,7 @@ var ENGLISH_COMMAND_TITLES = {
|
|
|
2475
2629
|
ln: "Natural logarithm",
|
|
2476
2630
|
log: "Logarithm",
|
|
2477
2631
|
det: "Determinant",
|
|
2632
|
+
ad: "Derivative (d / ad)",
|
|
2478
2633
|
N: "Natural numbers",
|
|
2479
2634
|
Z: "Integers",
|
|
2480
2635
|
Q: "Rational numbers",
|
|
@@ -2586,6 +2741,10 @@ var EQUATION_EDITOR_MESSAGES = {
|
|
|
2586
2741
|
insertFunction: "\u0625\u062F\u0631\u0627\u062C \u062F\u0627\u0644\u0629",
|
|
2587
2742
|
insertLimitsSeries: "\u0625\u062F\u0631\u0627\u062C \u062D\u062F\u0648\u062F \u0648\u0645\u062A\u0633\u0644\u0633\u0644\u0627\u062A",
|
|
2588
2743
|
insertAdditionalFunctions: "\u0625\u062F\u0631\u0627\u062C \u062F\u0648\u0627\u0644 \u0625\u0636\u0627\u0641\u064A\u0629",
|
|
2744
|
+
derivatives: "\u0627\u0644\u0627\u0634\u062A\u0642\u0627\u0642",
|
|
2745
|
+
insertDerivative: "\u0625\u062F\u0631\u0627\u062C \u0639\u0644\u0627\u0645\u0629 \u0627\u0634\u062A\u0642\u0627\u0642",
|
|
2746
|
+
insertFirstDerivative: "\u0625\u062F\u0631\u0627\u062C \u0627\u0634\u062A\u0642\u0627\u0642 \u0623\u0648\u0644",
|
|
2747
|
+
insertSecondDerivative: "\u0625\u062F\u0631\u0627\u062C \u0627\u0634\u062A\u0642\u0627\u0642 \u062B\u0627\u0646\u064A",
|
|
2589
2748
|
insertNumberSets: "\u0625\u062F\u0631\u0627\u062C \u0645\u062C\u0645\u0648\u0639\u0627\u062A \u0623\u0639\u062F\u0627\u062F",
|
|
2590
2749
|
operations: "\u0627\u0644\u0639\u0645\u0644\u064A\u0627\u062A",
|
|
2591
2750
|
insertOperation: "\u0625\u062F\u0631\u0627\u062C \u0631\u0645\u0632 \u0639\u0645\u0644\u064A\u0629",
|
|
@@ -2689,6 +2848,10 @@ var EQUATION_EDITOR_MESSAGES = {
|
|
|
2689
2848
|
insertFunction: "Insert function",
|
|
2690
2849
|
insertLimitsSeries: "Insert limits and series",
|
|
2691
2850
|
insertAdditionalFunctions: "Insert additional functions",
|
|
2851
|
+
derivatives: "Derivatives",
|
|
2852
|
+
insertDerivative: "Insert derivative marker",
|
|
2853
|
+
insertFirstDerivative: "Insert first derivative",
|
|
2854
|
+
insertSecondDerivative: "Insert second derivative",
|
|
2692
2855
|
insertNumberSets: "Insert number sets",
|
|
2693
2856
|
operations: "Operators",
|
|
2694
2857
|
insertOperation: "Insert operator",
|
|
@@ -3396,10 +3559,27 @@ function insertNumber(session, expr) {
|
|
|
3396
3559
|
inserted.forceSplitNextLeaf = false;
|
|
3397
3560
|
return inserted;
|
|
3398
3561
|
}
|
|
3562
|
+
function insertDivideOperator(session) {
|
|
3563
|
+
const base = replaceSelectionFirst(session);
|
|
3564
|
+
const next = cloneEditorSession(base);
|
|
3565
|
+
const englishNode = createEditorNode("operator", DIVIDE_OPERATOR_EN);
|
|
3566
|
+
const arabicNode = createEditorNode("operator", DIVIDE_OPERATOR_AR);
|
|
3567
|
+
arabicNode.id = englishNode.id;
|
|
3568
|
+
insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);
|
|
3569
|
+
markExprSync(next, englishNode.id);
|
|
3570
|
+
next.caret.index += 1;
|
|
3571
|
+
next.selectedStructureNodeId = null;
|
|
3572
|
+
syncSelectionToCaret(next);
|
|
3573
|
+
appendDebug(next, "insertDivideOperator", "");
|
|
3574
|
+
return next;
|
|
3575
|
+
}
|
|
3399
3576
|
function insertOperator(session, expr) {
|
|
3400
3577
|
if (expr === "." && !session.splitLeafTyping && precedingIsExtendableNumber(session)) {
|
|
3401
3578
|
return insertNumber(session, ".");
|
|
3402
3579
|
}
|
|
3580
|
+
if (expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR) {
|
|
3581
|
+
return insertDivideOperator(session);
|
|
3582
|
+
}
|
|
3403
3583
|
const base = replaceSelectionFirst(session);
|
|
3404
3584
|
return insertLeaf(base, "operator", expr);
|
|
3405
3585
|
}
|
|
@@ -3470,6 +3650,24 @@ function insertFraction(session) {
|
|
|
3470
3650
|
appendDebug(next, "insertFraction", "");
|
|
3471
3651
|
return next;
|
|
3472
3652
|
}
|
|
3653
|
+
function insertDerivativeFrac(session, build, debugLabel) {
|
|
3654
|
+
const base = replaceSelectionFirst(session);
|
|
3655
|
+
const next = cloneEditorSession(base);
|
|
3656
|
+
const { english, arabic } = build();
|
|
3657
|
+
insertMirroredNode(next, next.caret.chainId, next.caret.index, english, arabic);
|
|
3658
|
+
syncSubtreeRecursive(next, english, arabic);
|
|
3659
|
+
next.caret = derivativeTemplateInitialCaret(english);
|
|
3660
|
+
next.selectedStructureNodeId = null;
|
|
3661
|
+
syncSelectionToCaret(next);
|
|
3662
|
+
appendDebug(next, debugLabel, "");
|
|
3663
|
+
return next;
|
|
3664
|
+
}
|
|
3665
|
+
function insertFirstDerivative(session) {
|
|
3666
|
+
return insertDerivativeFrac(session, buildFirstDerivativeFrac, "insertFirstDerivative");
|
|
3667
|
+
}
|
|
3668
|
+
function insertSecondDerivative(session) {
|
|
3669
|
+
return insertDerivativeFrac(session, buildSecondDerivativeFrac, "insertSecondDerivative");
|
|
3670
|
+
}
|
|
3473
3671
|
function insertSqrt(session) {
|
|
3474
3672
|
const base = replaceSelectionFirst(session);
|
|
3475
3673
|
const next = cloneEditorSession(base);
|
|
@@ -3940,6 +4138,11 @@ function pasteText(session, text) {
|
|
|
3940
4138
|
i += 1;
|
|
3941
4139
|
continue;
|
|
3942
4140
|
}
|
|
4141
|
+
if (ch === DIVIDE_OPERATOR_AR) {
|
|
4142
|
+
s = insertDivideOperator(s);
|
|
4143
|
+
i += 1;
|
|
4144
|
+
continue;
|
|
4145
|
+
}
|
|
3943
4146
|
s = insertChar(s, ch);
|
|
3944
4147
|
i += 1;
|
|
3945
4148
|
}
|
|
@@ -3947,7 +4150,7 @@ function pasteText(session, text) {
|
|
|
3947
4150
|
}
|
|
3948
4151
|
|
|
3949
4152
|
// src/editor/display/base.ts
|
|
3950
|
-
function buildBaseNodeBody(node, digitForm = "western") {
|
|
4153
|
+
function buildBaseNodeBody(node, digitForm = "western", side = "english") {
|
|
3951
4154
|
const value = document.createElement("span");
|
|
3952
4155
|
value.className = "node-value";
|
|
3953
4156
|
if (node.kind === "char" && node.characterFont === "takween") {
|
|
@@ -3957,7 +4160,8 @@ function buildBaseNodeBody(node, digitForm = "western") {
|
|
|
3957
4160
|
} else if (node.kind === "char" && node.characterFont === "diwaniOutline") {
|
|
3958
4161
|
value.classList.add("node-value--diwani-outline");
|
|
3959
4162
|
}
|
|
3960
|
-
|
|
4163
|
+
const surfaceExpr = node.kind === "operator" ? divideOperatorSurfaceExpr(node.expr, side) : node.expr;
|
|
4164
|
+
value.textContent = surfaceExpr === "" ? "\u25A1" : formatDigits(surfaceExpr, digitForm);
|
|
3961
4165
|
return value;
|
|
3962
4166
|
}
|
|
3963
4167
|
|
|
@@ -4478,7 +4682,7 @@ function buildFunctionAtomicCommandBody(node, side, spec) {
|
|
|
4478
4682
|
value.appendChild(label);
|
|
4479
4683
|
return value;
|
|
4480
4684
|
}
|
|
4481
|
-
value.textContent = side === "arabic" ? spec?.arabicLabel ?? node.expr : spec?.englishTex.replace(
|
|
4685
|
+
value.textContent = side === "arabic" ? spec?.arabicLabel ?? node.expr : spec?.englishLabel ?? spec?.englishTex.replace(/^\\/, "") ?? node.expr;
|
|
4482
4686
|
return value;
|
|
4483
4687
|
}
|
|
4484
4688
|
function buildSpacingAtomicCommandBody(spec, side, uiLocale) {
|
|
@@ -4604,7 +4808,7 @@ function buildNodeBody(node, buildChain, side, digitForm = "western", uiLocale =
|
|
|
4604
4808
|
if (node.kind === "atomicOperatorCommand") {
|
|
4605
4809
|
return buildAtomicOperatorCommandNodeBody(node, side, uiLocale);
|
|
4606
4810
|
}
|
|
4607
|
-
return buildBaseNodeBody(node, digitForm);
|
|
4811
|
+
return buildBaseNodeBody(node, digitForm, side);
|
|
4608
4812
|
}
|
|
4609
4813
|
|
|
4610
4814
|
// src/editor/styles.ts
|
|
@@ -5322,6 +5526,10 @@ function createEditorRuntime(options) {
|
|
|
5322
5526
|
applyStructural((prev) => insertNumber(prev, char));
|
|
5323
5527
|
return;
|
|
5324
5528
|
}
|
|
5529
|
+
if (char === "\\") {
|
|
5530
|
+
applyStructural((prev) => insertDivideOperator(prev));
|
|
5531
|
+
return;
|
|
5532
|
+
}
|
|
5325
5533
|
if (isOperator(char)) {
|
|
5326
5534
|
applyStructural((prev) => insertOperator(prev, char));
|
|
5327
5535
|
return;
|
|
@@ -5485,6 +5693,14 @@ function createEditorRuntime(options) {
|
|
|
5485
5693
|
applyStructural((prev) => insertFraction(prev));
|
|
5486
5694
|
surfaceEl.focus();
|
|
5487
5695
|
},
|
|
5696
|
+
insertFirstDerivative: () => {
|
|
5697
|
+
applyStructural((prev) => insertFirstDerivative(prev));
|
|
5698
|
+
surfaceEl.focus();
|
|
5699
|
+
},
|
|
5700
|
+
insertSecondDerivative: () => {
|
|
5701
|
+
applyStructural((prev) => insertSecondDerivative(prev));
|
|
5702
|
+
surfaceEl.focus();
|
|
5703
|
+
},
|
|
5488
5704
|
insertMatrixEnv: (style, rows, columns) => {
|
|
5489
5705
|
applyStructural((prev) => insertMatrixEnv(prev, style, rows, columns));
|
|
5490
5706
|
surfaceEl.focus();
|
|
@@ -5628,6 +5844,19 @@ var COMMAND_FONT_MAP = {
|
|
|
5628
5844
|
"\\butexdiwanioutline": "diwaniOutline",
|
|
5629
5845
|
"\\diwanioutlineshaded": "diwaniOutline"
|
|
5630
5846
|
};
|
|
5847
|
+
var CHAR_FONT_EXPORT_TEX = {
|
|
5848
|
+
takween: "\\butextakween",
|
|
5849
|
+
diwani: "\\butexdiwani",
|
|
5850
|
+
diwaniOutline: "\\butexdiwanioutline"
|
|
5851
|
+
};
|
|
5852
|
+
function charEditorNodeToAstNode(node) {
|
|
5853
|
+
const font = node.characterFont ?? "default";
|
|
5854
|
+
const charNode = new CharNode(node.expr);
|
|
5855
|
+
if (font === "default") {
|
|
5856
|
+
return charNode;
|
|
5857
|
+
}
|
|
5858
|
+
return new CommandNode(CHAR_FONT_EXPORT_TEX[font], [], [new ChainNode([charNode])]);
|
|
5859
|
+
}
|
|
5631
5860
|
function commandIdForTex(tex) {
|
|
5632
5861
|
for (const spec of Object.values(ATOMIC_COMMANDS)) {
|
|
5633
5862
|
const renderTex = spec.arabicRenderTex;
|
|
@@ -5953,7 +6182,7 @@ function editorEnvToAstNode(node) {
|
|
|
5953
6182
|
function editorNodeToAstNode(node) {
|
|
5954
6183
|
let astNode;
|
|
5955
6184
|
if (node.kind === "char") {
|
|
5956
|
-
astNode =
|
|
6185
|
+
astNode = charEditorNodeToAstNode(node);
|
|
5957
6186
|
} else if (node.kind === "number") {
|
|
5958
6187
|
astNode = new NumberNode(node.expr);
|
|
5959
6188
|
} else if (node.kind === "operator") {
|
|
@@ -7831,6 +8060,7 @@ var CHARACTER_FONT_OPTIONS = [
|
|
|
7831
8060
|
var FUNCTION_COMMANDS = atomicCommandsByCategory("function");
|
|
7832
8061
|
var LIMITS_SERIES_COMMANDS = atomicCommandsByCategory("limits_series");
|
|
7833
8062
|
var FUNCTION2_COMMANDS = atomicCommandsByCategory("function2");
|
|
8063
|
+
var DERIVATIVE_COMMANDS = atomicCommandsByCategory("derivative");
|
|
7834
8064
|
var GROUP_COMMANDS = atomicCommandsByCategory("groups");
|
|
7835
8065
|
var SPACING_COMMANDS = atomicCommandsByCategory("spacing").filter(isSpacingCommandSpec);
|
|
7836
8066
|
var OPERATOR_COMMANDS = atomicOperatorCommandsByCategory("operators1");
|
|
@@ -7968,6 +8198,7 @@ var ButexEditor = forwardRef(
|
|
|
7968
8198
|
const [functionMenuOpen, setFunctionMenuOpen] = useState(false);
|
|
7969
8199
|
const [limitsSeriesMenuOpen, setLimitsSeriesMenuOpen] = useState(false);
|
|
7970
8200
|
const [function2MenuOpen, setFunction2MenuOpen] = useState(false);
|
|
8201
|
+
const [derivativeMenuOpen, setDerivativeMenuOpen] = useState(false);
|
|
7971
8202
|
const [groupMenuOpen, setGroupMenuOpen] = useState(false);
|
|
7972
8203
|
const [operatorMenuOpen, setOperatorMenuOpen] = useState(false);
|
|
7973
8204
|
const [operator2MenuOpen, setOperator2MenuOpen] = useState(false);
|
|
@@ -8626,6 +8857,87 @@ ${arabic || currentMessages.empty}`;
|
|
|
8626
8857
|
]
|
|
8627
8858
|
}
|
|
8628
8859
|
),
|
|
8860
|
+
/* @__PURE__ */ jsxs(
|
|
8861
|
+
"div",
|
|
8862
|
+
{
|
|
8863
|
+
className: "function-command-menu function-command-menu--derivative",
|
|
8864
|
+
onBlur: (event) => {
|
|
8865
|
+
const nextFocus = event.relatedTarget;
|
|
8866
|
+
if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {
|
|
8867
|
+
setDerivativeMenuOpen(false);
|
|
8868
|
+
}
|
|
8869
|
+
},
|
|
8870
|
+
children: [
|
|
8871
|
+
/* @__PURE__ */ jsx(
|
|
8872
|
+
"button",
|
|
8873
|
+
{
|
|
8874
|
+
className: "icon-btn function-command-btn",
|
|
8875
|
+
type: "button",
|
|
8876
|
+
title: messages.insertDerivative,
|
|
8877
|
+
"aria-label": messages.insertDerivative,
|
|
8878
|
+
"aria-haspopup": "listbox",
|
|
8879
|
+
"aria-expanded": derivativeMenuOpen,
|
|
8880
|
+
onClick: () => setDerivativeMenuOpen((open) => !open),
|
|
8881
|
+
children: DERIVATIVE_COMMANDS[0]?.arabicLabel ?? "\u0621"
|
|
8882
|
+
}
|
|
8883
|
+
),
|
|
8884
|
+
/* @__PURE__ */ jsxs("div", { className: "function-command-options", role: "listbox", "aria-label": messages.insertDerivative, hidden: !derivativeMenuOpen, children: [
|
|
8885
|
+
DERIVATIVE_COMMANDS.map((command) => /* @__PURE__ */ jsx(
|
|
8886
|
+
"button",
|
|
8887
|
+
{
|
|
8888
|
+
className: "function-command-option",
|
|
8889
|
+
type: "button",
|
|
8890
|
+
role: "option",
|
|
8891
|
+
title: atomicCommandTitle(command, uiLocale),
|
|
8892
|
+
"aria-label": atomicCommandTitle(command, uiLocale),
|
|
8893
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
8894
|
+
onClick: () => {
|
|
8895
|
+
runtimeRef.current?.insertAtomicCommand(command.id);
|
|
8896
|
+
setDerivativeMenuOpen(false);
|
|
8897
|
+
focusSurface();
|
|
8898
|
+
},
|
|
8899
|
+
children: command.arabicLabel
|
|
8900
|
+
},
|
|
8901
|
+
command.id
|
|
8902
|
+
)),
|
|
8903
|
+
/* @__PURE__ */ jsx(
|
|
8904
|
+
"button",
|
|
8905
|
+
{
|
|
8906
|
+
className: "function-command-option",
|
|
8907
|
+
type: "button",
|
|
8908
|
+
role: "option",
|
|
8909
|
+
title: messages.insertFirstDerivative,
|
|
8910
|
+
"aria-label": messages.insertFirstDerivative,
|
|
8911
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
8912
|
+
onClick: () => {
|
|
8913
|
+
runtimeRef.current?.insertFirstDerivative();
|
|
8914
|
+
setDerivativeMenuOpen(false);
|
|
8915
|
+
focusSurface();
|
|
8916
|
+
},
|
|
8917
|
+
children: "\u0621/\u0633"
|
|
8918
|
+
}
|
|
8919
|
+
),
|
|
8920
|
+
/* @__PURE__ */ jsx(
|
|
8921
|
+
"button",
|
|
8922
|
+
{
|
|
8923
|
+
className: "function-command-option",
|
|
8924
|
+
type: "button",
|
|
8925
|
+
role: "option",
|
|
8926
|
+
title: messages.insertSecondDerivative,
|
|
8927
|
+
"aria-label": messages.insertSecondDerivative,
|
|
8928
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
8929
|
+
onClick: () => {
|
|
8930
|
+
runtimeRef.current?.insertSecondDerivative();
|
|
8931
|
+
setDerivativeMenuOpen(false);
|
|
8932
|
+
focusSurface();
|
|
8933
|
+
},
|
|
8934
|
+
children: "\u0621\xB2/\u0633\xB2"
|
|
8935
|
+
}
|
|
8936
|
+
)
|
|
8937
|
+
] })
|
|
8938
|
+
]
|
|
8939
|
+
}
|
|
8940
|
+
),
|
|
8629
8941
|
/* @__PURE__ */ jsxs(
|
|
8630
8942
|
"div",
|
|
8631
8943
|
{
|