@drghaliasri/butex 4.1.0 → 4.3.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 +59 -4
- 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.d.mts +3 -1
- package/dist/react-document2.d.ts +3 -1
- package/dist/react-document2.js +330 -15
- package/dist/react-document2.js.map +1 -1
- package/dist/react-document2.mjs +330 -15
- 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.d.mts
CHANGED
|
@@ -302,6 +302,15 @@ declare const ATOMIC_COMMANDS: {
|
|
|
302
302
|
readonly arabicLabel: "محدد";
|
|
303
303
|
readonly title: "محدد";
|
|
304
304
|
};
|
|
305
|
+
readonly ad: {
|
|
306
|
+
readonly id: "ad";
|
|
307
|
+
readonly category: "derivative";
|
|
308
|
+
readonly englishTex: "\\mathrm{d}";
|
|
309
|
+
readonly englishLabel: "d";
|
|
310
|
+
readonly arabicTex: "\\ad";
|
|
311
|
+
readonly arabicLabel: "ء";
|
|
312
|
+
readonly title: "علامة الاشتقاق";
|
|
313
|
+
};
|
|
305
314
|
readonly N: {
|
|
306
315
|
readonly id: "N";
|
|
307
316
|
readonly category: "groups";
|
|
@@ -916,6 +925,8 @@ type EditorRuntimeApi = {
|
|
|
916
925
|
setCurrentDigitForm: (digitForm: DigitFormId) => void;
|
|
917
926
|
insertDelimiterByKind: (kind: 'paren' | 'bracket' | 'brace') => void;
|
|
918
927
|
insertFraction: () => void;
|
|
928
|
+
insertFirstDerivative: () => void;
|
|
929
|
+
insertSecondDerivative: () => void;
|
|
919
930
|
insertMatrixEnv: (style: MatrixEnvStyle, rows: number, columns: number) => void;
|
|
920
931
|
insertArrayEnv: (rows: number, columns: number) => void;
|
|
921
932
|
insertAlignedEnv: (rows: number, columns: number) => void;
|
package/dist/react.d.ts
CHANGED
|
@@ -302,6 +302,15 @@ declare const ATOMIC_COMMANDS: {
|
|
|
302
302
|
readonly arabicLabel: "محدد";
|
|
303
303
|
readonly title: "محدد";
|
|
304
304
|
};
|
|
305
|
+
readonly ad: {
|
|
306
|
+
readonly id: "ad";
|
|
307
|
+
readonly category: "derivative";
|
|
308
|
+
readonly englishTex: "\\mathrm{d}";
|
|
309
|
+
readonly englishLabel: "d";
|
|
310
|
+
readonly arabicTex: "\\ad";
|
|
311
|
+
readonly arabicLabel: "ء";
|
|
312
|
+
readonly title: "علامة الاشتقاق";
|
|
313
|
+
};
|
|
305
314
|
readonly N: {
|
|
306
315
|
readonly id: "N";
|
|
307
316
|
readonly category: "groups";
|
|
@@ -916,6 +925,8 @@ type EditorRuntimeApi = {
|
|
|
916
925
|
setCurrentDigitForm: (digitForm: DigitFormId) => void;
|
|
917
926
|
insertDelimiterByKind: (kind: 'paren' | 'bracket' | 'brace') => void;
|
|
918
927
|
insertFraction: () => void;
|
|
928
|
+
insertFirstDerivative: () => void;
|
|
929
|
+
insertSecondDerivative: () => void;
|
|
919
930
|
insertMatrixEnv: (style: MatrixEnvStyle, rows: number, columns: number) => void;
|
|
920
931
|
insertArrayEnv: (rows: number, columns: number) => void;
|
|
921
932
|
insertAlignedEnv: (rows: number, columns: number) => void;
|
package/dist/react.js
CHANGED
|
@@ -376,6 +376,16 @@ var ATOMIC_COMMANDS = {
|
|
|
376
376
|
arabicLabel: "\u0645\u062D\u062F\u062F",
|
|
377
377
|
title: "\u0645\u062D\u062F\u062F"
|
|
378
378
|
},
|
|
379
|
+
////////////////////// Derivatives ////////////////////////////////
|
|
380
|
+
ad: {
|
|
381
|
+
id: "ad",
|
|
382
|
+
category: "derivative",
|
|
383
|
+
englishTex: "\\mathrm{d}",
|
|
384
|
+
englishLabel: "d",
|
|
385
|
+
arabicTex: "\\ad",
|
|
386
|
+
arabicLabel: "\u0621",
|
|
387
|
+
title: "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0627\u0634\u062A\u0642\u0627\u0642"
|
|
388
|
+
},
|
|
379
389
|
////////////////////// Groups /////////////////////////////////
|
|
380
390
|
N: {
|
|
381
391
|
id: "N",
|
|
@@ -1036,6 +1046,22 @@ function atomicOperatorCommandSpec(id) {
|
|
|
1036
1046
|
return Object.prototype.hasOwnProperty.call(ATOMIC_OPERATOR_COMMANDS, id) ? ATOMIC_OPERATOR_COMMANDS[id] : null;
|
|
1037
1047
|
}
|
|
1038
1048
|
|
|
1049
|
+
// src/editor/divideOperator.ts
|
|
1050
|
+
var DIVIDE_OPERATOR_EN = "/";
|
|
1051
|
+
var DIVIDE_OPERATOR_AR = "\\";
|
|
1052
|
+
function isDivideOperatorExpr(expr) {
|
|
1053
|
+
return expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR;
|
|
1054
|
+
}
|
|
1055
|
+
function divideOperatorSurfaceExpr(expr, side) {
|
|
1056
|
+
if (!isDivideOperatorExpr(expr)) {
|
|
1057
|
+
return expr;
|
|
1058
|
+
}
|
|
1059
|
+
return side === "arabic" ? DIVIDE_OPERATOR_AR : DIVIDE_OPERATOR_EN;
|
|
1060
|
+
}
|
|
1061
|
+
function renderDivideOperatorLatex(side) {
|
|
1062
|
+
return side === "arabic" ? "\\backslash" : DIVIDE_OPERATOR_EN;
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1039
1065
|
// src/editor/digits.ts
|
|
1040
1066
|
var WESTERN = "0123456789";
|
|
1041
1067
|
var ARABIC_INDIC = "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669";
|
|
@@ -1184,6 +1210,9 @@ function renderNodeEnglish(node, options) {
|
|
|
1184
1210
|
if (node.kind === "char") {
|
|
1185
1211
|
return `${renderCharContent(node, options)}${latinScripts(node, options)}`;
|
|
1186
1212
|
}
|
|
1213
|
+
if (node.kind === "operator" && isDivideOperatorExpr(node.expr)) {
|
|
1214
|
+
return `${renderDivideOperatorLatex("english")}${latinScripts(node, options)}`;
|
|
1215
|
+
}
|
|
1187
1216
|
return `${formatDigits(node.expr, selectedDigitForm(options))}${latinScripts(node, options)}`;
|
|
1188
1217
|
}
|
|
1189
1218
|
function renderNodeArabic(node, options) {
|
|
@@ -1218,6 +1247,9 @@ function renderNodeArabic(node, options) {
|
|
|
1218
1247
|
const content = renderCharContent(node, options);
|
|
1219
1248
|
return arabicScripts(node, (node.characterFont ?? "default") === "default" ? `\\text{${escapeText(expr)}}` : content, options);
|
|
1220
1249
|
}
|
|
1250
|
+
if (node.kind === "operator" && isDivideOperatorExpr(node.expr)) {
|
|
1251
|
+
return arabicScripts(node, renderDivideOperatorLatex("arabic"), options);
|
|
1252
|
+
}
|
|
1221
1253
|
return arabicScripts(node, formatDigits(node.expr, selectedDigitForm(options)), options);
|
|
1222
1254
|
}
|
|
1223
1255
|
function renderChainEnglish(chain, options) {
|
|
@@ -1741,6 +1773,128 @@ function undoRedoCanRedo(stacks) {
|
|
|
1741
1773
|
return stacks.future.length > 0;
|
|
1742
1774
|
}
|
|
1743
1775
|
|
|
1776
|
+
// src/editor/derivativeTemplates.ts
|
|
1777
|
+
var ARABIC_VAR = "\u0633";
|
|
1778
|
+
var ENGLISH_VAR = "x";
|
|
1779
|
+
function mirroredAd() {
|
|
1780
|
+
const english = createAtomicCommandNode("ad");
|
|
1781
|
+
const arabic = createAtomicCommandNode("ad");
|
|
1782
|
+
arabic.id = english.id;
|
|
1783
|
+
return { english, arabic };
|
|
1784
|
+
}
|
|
1785
|
+
function mirroredVar() {
|
|
1786
|
+
const english = createEditorNode("char", ENGLISH_VAR);
|
|
1787
|
+
const arabic = createEditorNode("char", ARABIC_VAR);
|
|
1788
|
+
arabic.id = english.id;
|
|
1789
|
+
return { english, arabic };
|
|
1790
|
+
}
|
|
1791
|
+
function withMirroredSuperscript2(english, arabic) {
|
|
1792
|
+
const englishSup = createEditorChain([createEditorNode("number", "2")]);
|
|
1793
|
+
const arabicSup = createEditorChain([createEditorNode("number", "2")]);
|
|
1794
|
+
arabicSup.id = englishSup.id;
|
|
1795
|
+
arabicSup.nodes[0].id = englishSup.nodes[0].id;
|
|
1796
|
+
english.superscript = englishSup;
|
|
1797
|
+
arabic.superscript = arabicSup;
|
|
1798
|
+
}
|
|
1799
|
+
function syncChainIds(english, arabic) {
|
|
1800
|
+
arabic.id = english.id;
|
|
1801
|
+
const limit = Math.min(english.nodes.length, arabic.nodes.length);
|
|
1802
|
+
for (let index = 0; index < limit; index += 1) {
|
|
1803
|
+
arabic.nodes[index].id = english.nodes[index].id;
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
function syncFracIds(englishFrac, arabicFrac) {
|
|
1807
|
+
arabicFrac.id = englishFrac.id;
|
|
1808
|
+
if (englishFrac.numerator && arabicFrac.numerator) {
|
|
1809
|
+
syncChainIds(englishFrac.numerator, arabicFrac.numerator);
|
|
1810
|
+
}
|
|
1811
|
+
if (englishFrac.denominator && arabicFrac.denominator) {
|
|
1812
|
+
syncChainIds(englishFrac.denominator, arabicFrac.denominator);
|
|
1813
|
+
}
|
|
1814
|
+
}
|
|
1815
|
+
function buildAdVarChain() {
|
|
1816
|
+
const ad = mirroredAd();
|
|
1817
|
+
const variable = mirroredVar();
|
|
1818
|
+
const english = createEditorChain([ad.english, variable.english]);
|
|
1819
|
+
const arabic = createEditorChain([ad.arabic, variable.arabic]);
|
|
1820
|
+
syncChainIds(english, arabic);
|
|
1821
|
+
return { english, arabic };
|
|
1822
|
+
}
|
|
1823
|
+
function mirroredEmptyDelimiter() {
|
|
1824
|
+
const english = createDelimiterNode("", "");
|
|
1825
|
+
const arabic = createDelimiterNode("", "");
|
|
1826
|
+
arabic.id = english.id;
|
|
1827
|
+
if (english.innerExpr && arabic.innerExpr) {
|
|
1828
|
+
syncChainIds(english.innerExpr, arabic.innerExpr);
|
|
1829
|
+
}
|
|
1830
|
+
return { english, arabic };
|
|
1831
|
+
}
|
|
1832
|
+
function setMirroredDelimiterInner(english, arabic, pairs) {
|
|
1833
|
+
const englishInner = createEditorChain(pairs.map((pair) => pair.english));
|
|
1834
|
+
const arabicInner = createEditorChain(pairs.map((pair) => pair.arabic));
|
|
1835
|
+
syncChainIds(englishInner, arabicInner);
|
|
1836
|
+
english.innerExpr = englishInner;
|
|
1837
|
+
arabic.innerExpr = arabicInner;
|
|
1838
|
+
}
|
|
1839
|
+
function buildFirstDerivativeFrac() {
|
|
1840
|
+
const englishFrac = createFracNode();
|
|
1841
|
+
const arabicFrac = createFracNode();
|
|
1842
|
+
syncFracIds(englishFrac, arabicFrac);
|
|
1843
|
+
const numerator = buildAdVarChain();
|
|
1844
|
+
const denominator = buildAdVarChain();
|
|
1845
|
+
englishFrac.numerator = numerator.english;
|
|
1846
|
+
englishFrac.denominator = denominator.english;
|
|
1847
|
+
arabicFrac.numerator = numerator.arabic;
|
|
1848
|
+
arabicFrac.denominator = denominator.arabic;
|
|
1849
|
+
return { english: englishFrac, arabic: arabicFrac };
|
|
1850
|
+
}
|
|
1851
|
+
function buildSecondDerivativeFrac() {
|
|
1852
|
+
const englishFrac = createFracNode();
|
|
1853
|
+
const arabicFrac = createFracNode();
|
|
1854
|
+
syncFracIds(englishFrac, arabicFrac);
|
|
1855
|
+
const numAd = mirroredAd();
|
|
1856
|
+
const numVar = mirroredVar();
|
|
1857
|
+
withMirroredSuperscript2(numAd.english, numAd.arabic);
|
|
1858
|
+
const englishNumerator = createEditorChain([numAd.english, numVar.english]);
|
|
1859
|
+
const arabicNumerator = createEditorChain([numAd.arabic, numVar.arabic]);
|
|
1860
|
+
syncChainIds(englishNumerator, arabicNumerator);
|
|
1861
|
+
englishFrac.numerator = englishNumerator;
|
|
1862
|
+
arabicFrac.numerator = arabicNumerator;
|
|
1863
|
+
const denGroup = mirroredEmptyDelimiter();
|
|
1864
|
+
const denInnerAd = mirroredAd();
|
|
1865
|
+
const denInnerVar = mirroredVar();
|
|
1866
|
+
setMirroredDelimiterInner(denGroup.english, denGroup.arabic, [
|
|
1867
|
+
{ english: denInnerAd.english, arabic: denInnerAd.arabic },
|
|
1868
|
+
{ english: denInnerVar.english, arabic: denInnerVar.arabic }
|
|
1869
|
+
]);
|
|
1870
|
+
withMirroredSuperscript2(denGroup.english, denGroup.arabic);
|
|
1871
|
+
englishFrac.denominator = createEditorChain([denGroup.english]);
|
|
1872
|
+
arabicFrac.denominator = createEditorChain([denGroup.arabic]);
|
|
1873
|
+
syncChainIds(englishFrac.denominator, arabicFrac.denominator);
|
|
1874
|
+
return { english: englishFrac, arabic: arabicFrac };
|
|
1875
|
+
}
|
|
1876
|
+
var DERIVATIVE_TEMPLATE_VAR_CARET_INDEX = 1;
|
|
1877
|
+
function derivativeTemplateInitialCaret(englishFrac) {
|
|
1878
|
+
const denominator = englishFrac.denominator;
|
|
1879
|
+
if (!denominator) {
|
|
1880
|
+
return {
|
|
1881
|
+
chainId: englishFrac.numerator?.id ?? "",
|
|
1882
|
+
index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX
|
|
1883
|
+
};
|
|
1884
|
+
}
|
|
1885
|
+
const loneDelimiter = denominator.nodes.length === 1 && denominator.nodes[0]?.kind === "delimiter" && denominator.nodes[0].innerExpr;
|
|
1886
|
+
if (loneDelimiter) {
|
|
1887
|
+
return {
|
|
1888
|
+
chainId: denominator.nodes[0].innerExpr.id,
|
|
1889
|
+
index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX
|
|
1890
|
+
};
|
|
1891
|
+
}
|
|
1892
|
+
return {
|
|
1893
|
+
chainId: denominator.id,
|
|
1894
|
+
index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX
|
|
1895
|
+
};
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1744
1898
|
// src/editor/uiLocale.ts
|
|
1745
1899
|
var ENGLISH_COMMAND_TITLES = {
|
|
1746
1900
|
cos: "Cosine",
|
|
@@ -1771,6 +1925,7 @@ var ENGLISH_COMMAND_TITLES = {
|
|
|
1771
1925
|
ln: "Natural logarithm",
|
|
1772
1926
|
log: "Logarithm",
|
|
1773
1927
|
det: "Determinant",
|
|
1928
|
+
ad: "Derivative (d / ad)",
|
|
1774
1929
|
N: "Natural numbers",
|
|
1775
1930
|
Z: "Integers",
|
|
1776
1931
|
Q: "Rational numbers",
|
|
@@ -1882,6 +2037,10 @@ var EQUATION_EDITOR_MESSAGES = {
|
|
|
1882
2037
|
insertFunction: "\u0625\u062F\u0631\u0627\u062C \u062F\u0627\u0644\u0629",
|
|
1883
2038
|
insertLimitsSeries: "\u0625\u062F\u0631\u0627\u062C \u062D\u062F\u0648\u062F \u0648\u0645\u062A\u0633\u0644\u0633\u0644\u0627\u062A",
|
|
1884
2039
|
insertAdditionalFunctions: "\u0625\u062F\u0631\u0627\u062C \u062F\u0648\u0627\u0644 \u0625\u0636\u0627\u0641\u064A\u0629",
|
|
2040
|
+
derivatives: "\u0627\u0644\u0627\u0634\u062A\u0642\u0627\u0642",
|
|
2041
|
+
insertDerivative: "\u0625\u062F\u0631\u0627\u062C \u0639\u0644\u0627\u0645\u0629 \u0627\u0634\u062A\u0642\u0627\u0642",
|
|
2042
|
+
insertFirstDerivative: "\u0625\u062F\u0631\u0627\u062C \u0627\u0634\u062A\u0642\u0627\u0642 \u0623\u0648\u0644",
|
|
2043
|
+
insertSecondDerivative: "\u0625\u062F\u0631\u0627\u062C \u0627\u0634\u062A\u0642\u0627\u0642 \u062B\u0627\u0646\u064A",
|
|
1885
2044
|
insertNumberSets: "\u0625\u062F\u0631\u0627\u062C \u0645\u062C\u0645\u0648\u0639\u0627\u062A \u0623\u0639\u062F\u0627\u062F",
|
|
1886
2045
|
operations: "\u0627\u0644\u0639\u0645\u0644\u064A\u0627\u062A",
|
|
1887
2046
|
insertOperation: "\u0625\u062F\u0631\u0627\u062C \u0631\u0645\u0632 \u0639\u0645\u0644\u064A\u0629",
|
|
@@ -1985,6 +2144,10 @@ var EQUATION_EDITOR_MESSAGES = {
|
|
|
1985
2144
|
insertFunction: "Insert function",
|
|
1986
2145
|
insertLimitsSeries: "Insert limits and series",
|
|
1987
2146
|
insertAdditionalFunctions: "Insert additional functions",
|
|
2147
|
+
derivatives: "Derivatives",
|
|
2148
|
+
insertDerivative: "Insert derivative marker",
|
|
2149
|
+
insertFirstDerivative: "Insert first derivative",
|
|
2150
|
+
insertSecondDerivative: "Insert second derivative",
|
|
1988
2151
|
insertNumberSets: "Insert number sets",
|
|
1989
2152
|
operations: "Operators",
|
|
1990
2153
|
insertOperation: "Insert operator",
|
|
@@ -2692,10 +2855,27 @@ function insertNumber(session, expr) {
|
|
|
2692
2855
|
inserted.forceSplitNextLeaf = false;
|
|
2693
2856
|
return inserted;
|
|
2694
2857
|
}
|
|
2858
|
+
function insertDivideOperator(session) {
|
|
2859
|
+
const base = replaceSelectionFirst(session);
|
|
2860
|
+
const next = cloneEditorSession(base);
|
|
2861
|
+
const englishNode = createEditorNode("operator", DIVIDE_OPERATOR_EN);
|
|
2862
|
+
const arabicNode = createEditorNode("operator", DIVIDE_OPERATOR_AR);
|
|
2863
|
+
arabicNode.id = englishNode.id;
|
|
2864
|
+
insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);
|
|
2865
|
+
markExprSync(next, englishNode.id);
|
|
2866
|
+
next.caret.index += 1;
|
|
2867
|
+
next.selectedStructureNodeId = null;
|
|
2868
|
+
syncSelectionToCaret(next);
|
|
2869
|
+
appendDebug(next, "insertDivideOperator", "");
|
|
2870
|
+
return next;
|
|
2871
|
+
}
|
|
2695
2872
|
function insertOperator(session, expr) {
|
|
2696
2873
|
if (expr === "." && !session.splitLeafTyping && precedingIsExtendableNumber(session)) {
|
|
2697
2874
|
return insertNumber(session, ".");
|
|
2698
2875
|
}
|
|
2876
|
+
if (expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR) {
|
|
2877
|
+
return insertDivideOperator(session);
|
|
2878
|
+
}
|
|
2699
2879
|
const base = replaceSelectionFirst(session);
|
|
2700
2880
|
return insertLeaf(base, "operator", expr);
|
|
2701
2881
|
}
|
|
@@ -2766,6 +2946,24 @@ function insertFraction(session) {
|
|
|
2766
2946
|
appendDebug(next, "insertFraction", "");
|
|
2767
2947
|
return next;
|
|
2768
2948
|
}
|
|
2949
|
+
function insertDerivativeFrac(session, build, debugLabel) {
|
|
2950
|
+
const base = replaceSelectionFirst(session);
|
|
2951
|
+
const next = cloneEditorSession(base);
|
|
2952
|
+
const { english, arabic } = build();
|
|
2953
|
+
insertMirroredNode(next, next.caret.chainId, next.caret.index, english, arabic);
|
|
2954
|
+
syncSubtreeRecursive(next, english, arabic);
|
|
2955
|
+
next.caret = derivativeTemplateInitialCaret(english);
|
|
2956
|
+
next.selectedStructureNodeId = null;
|
|
2957
|
+
syncSelectionToCaret(next);
|
|
2958
|
+
appendDebug(next, debugLabel, "");
|
|
2959
|
+
return next;
|
|
2960
|
+
}
|
|
2961
|
+
function insertFirstDerivative(session) {
|
|
2962
|
+
return insertDerivativeFrac(session, buildFirstDerivativeFrac, "insertFirstDerivative");
|
|
2963
|
+
}
|
|
2964
|
+
function insertSecondDerivative(session) {
|
|
2965
|
+
return insertDerivativeFrac(session, buildSecondDerivativeFrac, "insertSecondDerivative");
|
|
2966
|
+
}
|
|
2769
2967
|
function insertSqrt(session) {
|
|
2770
2968
|
const base = replaceSelectionFirst(session);
|
|
2771
2969
|
const next = cloneEditorSession(base);
|
|
@@ -3236,6 +3434,11 @@ function pasteText(session, text) {
|
|
|
3236
3434
|
i += 1;
|
|
3237
3435
|
continue;
|
|
3238
3436
|
}
|
|
3437
|
+
if (ch === DIVIDE_OPERATOR_AR) {
|
|
3438
|
+
s = insertDivideOperator(s);
|
|
3439
|
+
i += 1;
|
|
3440
|
+
continue;
|
|
3441
|
+
}
|
|
3239
3442
|
s = insertChar(s, ch);
|
|
3240
3443
|
i += 1;
|
|
3241
3444
|
}
|
|
@@ -3243,7 +3446,7 @@ function pasteText(session, text) {
|
|
|
3243
3446
|
}
|
|
3244
3447
|
|
|
3245
3448
|
// src/editor/display/base.ts
|
|
3246
|
-
function buildBaseNodeBody(node, digitForm = "western") {
|
|
3449
|
+
function buildBaseNodeBody(node, digitForm = "western", side = "english") {
|
|
3247
3450
|
const value = document.createElement("span");
|
|
3248
3451
|
value.className = "node-value";
|
|
3249
3452
|
if (node.kind === "char" && node.characterFont === "takween") {
|
|
@@ -3253,7 +3456,8 @@ function buildBaseNodeBody(node, digitForm = "western") {
|
|
|
3253
3456
|
} else if (node.kind === "char" && node.characterFont === "diwaniOutline") {
|
|
3254
3457
|
value.classList.add("node-value--diwani-outline");
|
|
3255
3458
|
}
|
|
3256
|
-
|
|
3459
|
+
const surfaceExpr = node.kind === "operator" ? divideOperatorSurfaceExpr(node.expr, side) : node.expr;
|
|
3460
|
+
value.textContent = surfaceExpr === "" ? "\u25A1" : formatDigits(surfaceExpr, digitForm);
|
|
3257
3461
|
return value;
|
|
3258
3462
|
}
|
|
3259
3463
|
|
|
@@ -3774,7 +3978,7 @@ function buildFunctionAtomicCommandBody(node, side, spec) {
|
|
|
3774
3978
|
value.appendChild(label);
|
|
3775
3979
|
return value;
|
|
3776
3980
|
}
|
|
3777
|
-
value.textContent = side === "arabic" ? spec?.arabicLabel ?? node.expr : spec?.englishTex.replace(
|
|
3981
|
+
value.textContent = side === "arabic" ? spec?.arabicLabel ?? node.expr : spec?.englishLabel ?? spec?.englishTex.replace(/^\\/, "") ?? node.expr;
|
|
3778
3982
|
return value;
|
|
3779
3983
|
}
|
|
3780
3984
|
function buildSpacingAtomicCommandBody(spec, side, uiLocale) {
|
|
@@ -3900,7 +4104,7 @@ function buildNodeBody(node, buildChain, side, digitForm = "western", uiLocale =
|
|
|
3900
4104
|
if (node.kind === "atomicOperatorCommand") {
|
|
3901
4105
|
return buildAtomicOperatorCommandNodeBody(node, side, uiLocale);
|
|
3902
4106
|
}
|
|
3903
|
-
return buildBaseNodeBody(node, digitForm);
|
|
4107
|
+
return buildBaseNodeBody(node, digitForm, side);
|
|
3904
4108
|
}
|
|
3905
4109
|
|
|
3906
4110
|
// src/editor/styles.ts
|
|
@@ -4618,6 +4822,10 @@ function createEditorRuntime(options) {
|
|
|
4618
4822
|
applyStructural((prev) => insertNumber(prev, char));
|
|
4619
4823
|
return;
|
|
4620
4824
|
}
|
|
4825
|
+
if (char === "\\") {
|
|
4826
|
+
applyStructural((prev) => insertDivideOperator(prev));
|
|
4827
|
+
return;
|
|
4828
|
+
}
|
|
4621
4829
|
if (isOperator(char)) {
|
|
4622
4830
|
applyStructural((prev) => insertOperator(prev, char));
|
|
4623
4831
|
return;
|
|
@@ -4781,6 +4989,14 @@ function createEditorRuntime(options) {
|
|
|
4781
4989
|
applyStructural((prev) => insertFraction(prev));
|
|
4782
4990
|
surfaceEl.focus();
|
|
4783
4991
|
},
|
|
4992
|
+
insertFirstDerivative: () => {
|
|
4993
|
+
applyStructural((prev) => insertFirstDerivative(prev));
|
|
4994
|
+
surfaceEl.focus();
|
|
4995
|
+
},
|
|
4996
|
+
insertSecondDerivative: () => {
|
|
4997
|
+
applyStructural((prev) => insertSecondDerivative(prev));
|
|
4998
|
+
surfaceEl.focus();
|
|
4999
|
+
},
|
|
4784
5000
|
insertMatrixEnv: (style, rows, columns) => {
|
|
4785
5001
|
applyStructural((prev) => insertMatrixEnv(prev, style, rows, columns));
|
|
4786
5002
|
surfaceEl.focus();
|
|
@@ -6152,6 +6368,7 @@ var CHARACTER_FONT_OPTIONS = [
|
|
|
6152
6368
|
var FUNCTION_COMMANDS = atomicCommandsByCategory("function");
|
|
6153
6369
|
var LIMITS_SERIES_COMMANDS = atomicCommandsByCategory("limits_series");
|
|
6154
6370
|
var FUNCTION2_COMMANDS = atomicCommandsByCategory("function2");
|
|
6371
|
+
var DERIVATIVE_COMMANDS = atomicCommandsByCategory("derivative");
|
|
6155
6372
|
var GROUP_COMMANDS = atomicCommandsByCategory("groups");
|
|
6156
6373
|
var SPACING_COMMANDS = atomicCommandsByCategory("spacing").filter(isSpacingCommandSpec);
|
|
6157
6374
|
var OPERATOR_COMMANDS = atomicOperatorCommandsByCategory("operators1");
|
|
@@ -6289,6 +6506,7 @@ var ButexEditor = (0, import_react.forwardRef)(
|
|
|
6289
6506
|
const [functionMenuOpen, setFunctionMenuOpen] = (0, import_react.useState)(false);
|
|
6290
6507
|
const [limitsSeriesMenuOpen, setLimitsSeriesMenuOpen] = (0, import_react.useState)(false);
|
|
6291
6508
|
const [function2MenuOpen, setFunction2MenuOpen] = (0, import_react.useState)(false);
|
|
6509
|
+
const [derivativeMenuOpen, setDerivativeMenuOpen] = (0, import_react.useState)(false);
|
|
6292
6510
|
const [groupMenuOpen, setGroupMenuOpen] = (0, import_react.useState)(false);
|
|
6293
6511
|
const [operatorMenuOpen, setOperatorMenuOpen] = (0, import_react.useState)(false);
|
|
6294
6512
|
const [operator2MenuOpen, setOperator2MenuOpen] = (0, import_react.useState)(false);
|
|
@@ -6947,6 +7165,87 @@ ${arabic || currentMessages.empty}`;
|
|
|
6947
7165
|
]
|
|
6948
7166
|
}
|
|
6949
7167
|
),
|
|
7168
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
7169
|
+
"div",
|
|
7170
|
+
{
|
|
7171
|
+
className: "function-command-menu function-command-menu--derivative",
|
|
7172
|
+
onBlur: (event) => {
|
|
7173
|
+
const nextFocus = event.relatedTarget;
|
|
7174
|
+
if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {
|
|
7175
|
+
setDerivativeMenuOpen(false);
|
|
7176
|
+
}
|
|
7177
|
+
},
|
|
7178
|
+
children: [
|
|
7179
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
7180
|
+
"button",
|
|
7181
|
+
{
|
|
7182
|
+
className: "icon-btn function-command-btn",
|
|
7183
|
+
type: "button",
|
|
7184
|
+
title: messages.insertDerivative,
|
|
7185
|
+
"aria-label": messages.insertDerivative,
|
|
7186
|
+
"aria-haspopup": "listbox",
|
|
7187
|
+
"aria-expanded": derivativeMenuOpen,
|
|
7188
|
+
onClick: () => setDerivativeMenuOpen((open) => !open),
|
|
7189
|
+
children: DERIVATIVE_COMMANDS[0]?.arabicLabel ?? "\u0621"
|
|
7190
|
+
}
|
|
7191
|
+
),
|
|
7192
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "function-command-options", role: "listbox", "aria-label": messages.insertDerivative, hidden: !derivativeMenuOpen, children: [
|
|
7193
|
+
DERIVATIVE_COMMANDS.map((command) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
7194
|
+
"button",
|
|
7195
|
+
{
|
|
7196
|
+
className: "function-command-option",
|
|
7197
|
+
type: "button",
|
|
7198
|
+
role: "option",
|
|
7199
|
+
title: atomicCommandTitle(command, uiLocale),
|
|
7200
|
+
"aria-label": atomicCommandTitle(command, uiLocale),
|
|
7201
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
7202
|
+
onClick: () => {
|
|
7203
|
+
runtimeRef.current?.insertAtomicCommand(command.id);
|
|
7204
|
+
setDerivativeMenuOpen(false);
|
|
7205
|
+
focusSurface();
|
|
7206
|
+
},
|
|
7207
|
+
children: command.arabicLabel
|
|
7208
|
+
},
|
|
7209
|
+
command.id
|
|
7210
|
+
)),
|
|
7211
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
7212
|
+
"button",
|
|
7213
|
+
{
|
|
7214
|
+
className: "function-command-option",
|
|
7215
|
+
type: "button",
|
|
7216
|
+
role: "option",
|
|
7217
|
+
title: messages.insertFirstDerivative,
|
|
7218
|
+
"aria-label": messages.insertFirstDerivative,
|
|
7219
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
7220
|
+
onClick: () => {
|
|
7221
|
+
runtimeRef.current?.insertFirstDerivative();
|
|
7222
|
+
setDerivativeMenuOpen(false);
|
|
7223
|
+
focusSurface();
|
|
7224
|
+
},
|
|
7225
|
+
children: "\u0621/\u0633"
|
|
7226
|
+
}
|
|
7227
|
+
),
|
|
7228
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
7229
|
+
"button",
|
|
7230
|
+
{
|
|
7231
|
+
className: "function-command-option",
|
|
7232
|
+
type: "button",
|
|
7233
|
+
role: "option",
|
|
7234
|
+
title: messages.insertSecondDerivative,
|
|
7235
|
+
"aria-label": messages.insertSecondDerivative,
|
|
7236
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
7237
|
+
onClick: () => {
|
|
7238
|
+
runtimeRef.current?.insertSecondDerivative();
|
|
7239
|
+
setDerivativeMenuOpen(false);
|
|
7240
|
+
focusSurface();
|
|
7241
|
+
},
|
|
7242
|
+
children: "\u0621\xB2/\u0633\xB2"
|
|
7243
|
+
}
|
|
7244
|
+
)
|
|
7245
|
+
] })
|
|
7246
|
+
]
|
|
7247
|
+
}
|
|
7248
|
+
),
|
|
6950
7249
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
6951
7250
|
"div",
|
|
6952
7251
|
{
|