nerdamer 1.1.13 → 2.0.0-rc.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.
Files changed (341) hide show
  1. package/LICENSE.md +184 -0
  2. package/README.md +293 -312
  3. package/dist/bundle.js +2 -0
  4. package/dist/bundle.js.LICENSE.txt +7 -0
  5. package/dist/parser.js +2 -0
  6. package/dist/parser.js.LICENSE.txt +7 -0
  7. package/docs-data/parser-functions.json +1960 -0
  8. package/index.d.ts +10 -426
  9. package/output/algebra/adapters.d.ts +33 -0
  10. package/output/algebra/adapters.js +109 -0
  11. package/output/algebra/algorithms/arith.d.ts +84 -0
  12. package/output/algebra/algorithms/arith.js +323 -0
  13. package/output/algebra/algorithms/factor.d.ts +3 -0
  14. package/output/algebra/algorithms/factor.js +5 -0
  15. package/output/algebra/algorithms/factorMultivariate.d.ts +23 -0
  16. package/output/algebra/algorithms/factorMultivariate.js +2393 -0
  17. package/output/algebra/algorithms/factorUnivariate.d.ts +72 -0
  18. package/output/algebra/algorithms/factorUnivariate.js +1072 -0
  19. package/output/algebra/algorithms/gcd.d.ts +22 -0
  20. package/output/algebra/algorithms/gcd.js +690 -0
  21. package/output/algebra/algorithms/groebnerBase.d.ts +157 -0
  22. package/output/algebra/algorithms/groebnerBase.js +1166 -0
  23. package/output/algebra/algorithms/multiPoly/MultiPoly.d.ts +137 -0
  24. package/output/algebra/algorithms/multiPoly/MultiPoly.js +346 -0
  25. package/output/algebra/algorithms/poly.d.ts +228 -0
  26. package/output/algebra/algorithms/poly.js +1299 -0
  27. package/output/algebra/algorithms/rational.d.ts +17 -0
  28. package/output/algebra/algorithms/rational.js +115 -0
  29. package/output/algebra/factor/factor.d.ts +62 -0
  30. package/output/algebra/factor/factor.js +158 -0
  31. package/output/algebra/gcd/gcd.d.ts +29 -0
  32. package/output/algebra/gcd/gcd.js +141 -0
  33. package/output/algebra/groebner.d.ts +21 -0
  34. package/output/algebra/groebner.js +42 -0
  35. package/output/algebra/partfrac.d.ts +19 -0
  36. package/output/algebra/partfrac.js +398 -0
  37. package/output/algebra/polynomialize.d.ts +20 -0
  38. package/output/algebra/polynomialize.js +24 -0
  39. package/output/algebra/simplify/complexsimp.d.ts +7 -0
  40. package/output/algebra/simplify/complexsimp.js +24 -0
  41. package/output/algebra/simplify/factorCommon.d.ts +13 -0
  42. package/output/algebra/simplify/factorCommon.js +136 -0
  43. package/output/algebra/simplify/funcsimp.d.ts +26 -0
  44. package/output/algebra/simplify/funcsimp.js +633 -0
  45. package/output/algebra/simplify/invtrigrewrite.d.ts +10 -0
  46. package/output/algebra/simplify/invtrigrewrite.js +96 -0
  47. package/output/algebra/simplify/ratsimp.d.ts +21 -0
  48. package/output/algebra/simplify/ratsimp.js +140 -0
  49. package/output/algebra/simplify/simplify.d.ts +25 -0
  50. package/output/algebra/simplify/simplify.js +228 -0
  51. package/output/algebra/simplify/trigreduce.d.ts +38 -0
  52. package/output/algebra/simplify/trigreduce.js +424 -0
  53. package/output/algebra/simplify/trigrewrite.d.ts +17 -0
  54. package/output/algebra/simplify/trigrewrite.js +156 -0
  55. package/output/algebra/simplify/trigsimp.d.ts +11 -0
  56. package/output/algebra/simplify/trigsimp.js +369 -0
  57. package/output/algebra/simplify/utils.d.ts +32 -0
  58. package/output/algebra/simplify/utils.js +56 -0
  59. package/output/algebra/utils.d.ts +32 -0
  60. package/output/algebra/utils.js +48 -0
  61. package/output/api/advanced.d.ts +7 -0
  62. package/output/api/advanced.js +18 -0
  63. package/output/api/algebra.d.ts +17 -0
  64. package/output/api/algebra.js +32 -0
  65. package/output/api/assumptions.d.ts +4 -0
  66. package/output/api/assumptions.js +11 -0
  67. package/output/api/calculus.d.ts +9 -0
  68. package/output/api/calculus.js +21 -0
  69. package/output/api/core.d.ts +17 -0
  70. package/output/api/core.js +41 -0
  71. package/output/api/debug.d.ts +16 -0
  72. package/output/api/debug.js +23 -0
  73. package/output/api/parser.d.ts +85 -0
  74. package/output/api/parser.js +16 -0
  75. package/output/api/solve.d.ts +10 -0
  76. package/output/api/solve.js +16 -0
  77. package/output/api/structures.d.ts +10 -0
  78. package/output/api/structures.js +22 -0
  79. package/output/calculus/derivative/diff.d.ts +30 -0
  80. package/output/calculus/derivative/diff.js +238 -0
  81. package/output/calculus/fresnel.d.ts +16 -0
  82. package/output/calculus/fresnel.js +39 -0
  83. package/output/calculus/integrate/byParts.d.ts +18 -0
  84. package/output/calculus/integrate/byParts.js +339 -0
  85. package/output/calculus/integrate/bySubstitution.d.ts +135 -0
  86. package/output/calculus/integrate/bySubstitution.js +411 -0
  87. package/output/calculus/integrate/integrate.d.ts +38 -0
  88. package/output/calculus/integrate/integrate.js +652 -0
  89. package/output/calculus/integrate/integrationTable.d.ts +2 -0
  90. package/output/calculus/integrate/integrationTable.js +914 -0
  91. package/output/calculus/integrate/utils.d.ts +28 -0
  92. package/output/calculus/integrate/utils.js +96 -0
  93. package/output/calculus/laplace/ilaplace.d.ts +31 -0
  94. package/output/calculus/laplace/ilaplace.js +192 -0
  95. package/output/calculus/laplace/ilaplaceTable.d.ts +2 -0
  96. package/output/calculus/laplace/ilaplaceTable.js +200 -0
  97. package/output/calculus/laplace/laplace.d.ts +22 -0
  98. package/output/calculus/laplace/laplace.js +109 -0
  99. package/output/calculus/laplace/laplaceTable.d.ts +2 -0
  100. package/output/calculus/laplace/laplaceTable.js +187 -0
  101. package/output/calculus/limit/limit.d.ts +35 -0
  102. package/output/calculus/limit/limit.js +1183 -0
  103. package/output/calculus/limit/limitsTable.d.ts +2 -0
  104. package/output/calculus/limit/limitsTable.js +7 -0
  105. package/output/core/Settings.d.ts +32 -0
  106. package/output/core/Settings.js +68 -0
  107. package/output/core/adapters.d.ts +18 -0
  108. package/output/core/adapters.js +40 -0
  109. package/output/core/classes/assumption/Assumption.d.ts +218 -0
  110. package/output/core/classes/assumption/Assumption.js +605 -0
  111. package/output/core/classes/assumption/assertiveFunctions.d.ts +6 -0
  112. package/output/core/classes/assumption/assertiveFunctions.js +64 -0
  113. package/output/core/classes/assumption/assume.d.ts +90 -0
  114. package/output/core/classes/assumption/assume.js +145 -0
  115. package/output/core/classes/collection/Collection.d.ts +107 -0
  116. package/output/core/classes/collection/Collection.js +231 -0
  117. package/output/core/classes/complex/Complex.d.ts +99 -0
  118. package/output/core/classes/complex/Complex.js +135 -0
  119. package/output/core/classes/decimalSet/DecimalSet.d.ts +226 -0
  120. package/output/core/classes/decimalSet/DecimalSet.js +453 -0
  121. package/output/core/classes/dictionary/Dictionary.d.ts +102 -0
  122. package/output/core/classes/dictionary/Dictionary.js +213 -0
  123. package/output/core/classes/equation/Equation.d.ts +256 -0
  124. package/output/core/classes/equation/Equation.js +350 -0
  125. package/output/core/classes/expression/CoeffObject.d.ts +100 -0
  126. package/output/core/classes/expression/CoeffObject.js +198 -0
  127. package/output/core/classes/expression/Expression.d.ts +1674 -0
  128. package/output/core/classes/expression/Expression.js +2332 -0
  129. package/output/core/classes/expression/analysis.d.ts +25 -0
  130. package/output/core/classes/expression/analysis.js +218 -0
  131. package/output/core/classes/expression/collect.d.ts +9 -0
  132. package/output/core/classes/expression/collect.js +49 -0
  133. package/output/core/classes/expression/format.d.ts +45 -0
  134. package/output/core/classes/expression/format.js +217 -0
  135. package/output/core/classes/expression/products.d.ts +23 -0
  136. package/output/core/classes/expression/products.js +115 -0
  137. package/output/core/classes/expression/shortcuts.d.ts +35 -0
  138. package/output/core/classes/expression/shortcuts.js +129 -0
  139. package/output/core/classes/expression/traversal.d.ts +31 -0
  140. package/output/core/classes/expression/traversal.js +216 -0
  141. package/output/core/classes/expression/trig.d.ts +25 -0
  142. package/output/core/classes/expression/trig.js +40 -0
  143. package/output/core/classes/expression/utils.d.ts +52 -0
  144. package/output/core/classes/expression/utils.js +189 -0
  145. package/output/core/classes/lookupTable/LookupTable.d.ts +12 -0
  146. package/output/core/classes/lookupTable/LookupTable.js +55 -0
  147. package/output/core/classes/matrix/Matrix.d.ts +227 -0
  148. package/output/core/classes/matrix/Matrix.js +889 -0
  149. package/output/core/classes/matrix/Sylvester.d.ts +11 -0
  150. package/output/core/classes/matrix/Sylvester.js +54 -0
  151. package/output/core/classes/matrix/functions.d.ts +26 -0
  152. package/output/core/classes/matrix/functions.js +52 -0
  153. package/output/core/classes/matrix/utils.d.ts +9 -0
  154. package/output/core/classes/matrix/utils.js +22 -0
  155. package/output/core/classes/parser/Parser.d.ts +480 -0
  156. package/output/core/classes/parser/Parser.js +1812 -0
  157. package/output/core/classes/parser/Token.d.ts +58 -0
  158. package/output/core/classes/parser/Token.js +137 -0
  159. package/output/core/classes/parser/constants.d.ts +160 -0
  160. package/output/core/classes/parser/constants.js +227 -0
  161. package/output/core/classes/parser/helpers.d.ts +21 -0
  162. package/output/core/classes/parser/helpers.js +42 -0
  163. package/output/core/classes/parser/operations/add.d.ts +15 -0
  164. package/output/core/classes/parser/operations/add.js +238 -0
  165. package/output/core/classes/parser/operations/comma.d.ts +7 -0
  166. package/output/core/classes/parser/operations/comma.js +11 -0
  167. package/output/core/classes/parser/operations/compare.d.ts +21 -0
  168. package/output/core/classes/parser/operations/compare.js +461 -0
  169. package/output/core/classes/parser/operations/divide.d.ts +2 -0
  170. package/output/core/classes/parser/operations/divide.js +72 -0
  171. package/output/core/classes/parser/operations/functions.d.ts +46 -0
  172. package/output/core/classes/parser/operations/functions.js +430 -0
  173. package/output/core/classes/parser/operations/multiply.d.ts +11 -0
  174. package/output/core/classes/parser/operations/multiply.js +321 -0
  175. package/output/core/classes/parser/operations/power.d.ts +48 -0
  176. package/output/core/classes/parser/operations/power.js +673 -0
  177. package/output/core/classes/parser/operations/subtract.d.ts +3 -0
  178. package/output/core/classes/parser/operations/subtract.js +35 -0
  179. package/output/core/classes/parser/preprocess.d.ts +14 -0
  180. package/output/core/classes/parser/preprocess.js +259 -0
  181. package/output/core/classes/parser/scripting/controlFlow.d.ts +121 -0
  182. package/output/core/classes/parser/scripting/controlFlow.js +355 -0
  183. package/output/core/classes/parser/scripting/evaluate.d.ts +10 -0
  184. package/output/core/classes/parser/scripting/evaluate.js +112 -0
  185. package/output/core/classes/parser/scripting/functions.d.ts +14 -0
  186. package/output/core/classes/parser/scripting/functions.js +59 -0
  187. package/output/core/classes/parser/scripting/scope.d.ts +35 -0
  188. package/output/core/classes/parser/scripting/scope.js +155 -0
  189. package/output/core/classes/parser/types.d.ts +125 -0
  190. package/output/core/classes/parser/types.js +2 -0
  191. package/output/core/classes/parser/wrappers/IndexedReference.d.ts +31 -0
  192. package/output/core/classes/parser/wrappers/IndexedReference.js +68 -0
  193. package/output/core/classes/parser/wrappers/KeyValuePair.d.ts +24 -0
  194. package/output/core/classes/parser/wrappers/KeyValuePair.js +51 -0
  195. package/output/core/classes/polynomial/Polynomial.d.ts +500 -0
  196. package/output/core/classes/polynomial/Polynomial.js +1149 -0
  197. package/output/core/classes/polynomial/Term.d.ts +222 -0
  198. package/output/core/classes/polynomial/Term.js +430 -0
  199. package/output/core/classes/polynomial/functions.d.ts +69 -0
  200. package/output/core/classes/polynomial/functions.js +126 -0
  201. package/output/core/classes/polynomial/utils.d.ts +62 -0
  202. package/output/core/classes/polynomial/utils.js +206 -0
  203. package/output/core/classes/rational/Rational.d.ts +504 -0
  204. package/output/core/classes/rational/Rational.js +779 -0
  205. package/output/core/classes/seq/SEQ.d.ts +13 -0
  206. package/output/core/classes/seq/SEQ.js +137 -0
  207. package/output/core/classes/valuesSet/ValuesSet.d.ts +179 -0
  208. package/output/core/classes/valuesSet/ValuesSet.js +381 -0
  209. package/output/core/classes/vector/Vector.d.ts +222 -0
  210. package/output/core/classes/vector/Vector.js +497 -0
  211. package/output/core/classes/vector/functions.d.ts +28 -0
  212. package/output/core/classes/vector/functions.js +47 -0
  213. package/output/core/common/classes/MathematicalAggregate.d.ts +53 -0
  214. package/output/core/common/classes/MathematicalAggregate.js +140 -0
  215. package/output/core/common/classes/Scope.d.ts +62 -0
  216. package/output/core/common/classes/Scope.js +122 -0
  217. package/output/core/common/classes/StructuredEntity.d.ts +55 -0
  218. package/output/core/common/classes/StructuredEntity.js +151 -0
  219. package/output/core/common/common.d.ts +63 -0
  220. package/output/core/common/common.js +279 -0
  221. package/output/core/common/functions/functions.d.ts +14 -0
  222. package/output/core/common/functions/functions.js +33 -0
  223. package/output/core/common/functions/structuredEntityUtils.d.ts +27 -0
  224. package/output/core/common/functions/structuredEntityUtils.js +40 -0
  225. package/output/core/converters/BaseConverter.d.ts +97 -0
  226. package/output/core/converters/BaseConverter.js +405 -0
  227. package/output/core/converters/Converter.d.ts +111 -0
  228. package/output/core/converters/Converter.js +802 -0
  229. package/output/core/converters/Pattern.d.ts +71 -0
  230. package/output/core/converters/Pattern.js +302 -0
  231. package/output/core/dispatch.d.ts +34 -0
  232. package/output/core/dispatch.js +304 -0
  233. package/output/core/errors.d.ts +531 -0
  234. package/output/core/errors.js +621 -0
  235. package/output/core/functions/bigint/bigint.d.ts +121 -0
  236. package/output/core/functions/bigint/bigint.js +392 -0
  237. package/output/core/functions/bigint/primeFactor.d.ts +49 -0
  238. package/output/core/functions/bigint/primeFactor.js +267 -0
  239. package/output/core/functions/bigint/primes.d.ts +1 -0
  240. package/output/core/functions/bigint/primes.js +11 -0
  241. package/output/core/functions/build/definitions.d.ts +12 -0
  242. package/output/core/functions/build/definitions.js +133 -0
  243. package/output/core/functions/build/index.d.ts +32 -0
  244. package/output/core/functions/build/index.js +136 -0
  245. package/output/core/functions/complex.d.ts +90 -0
  246. package/output/core/functions/complex.js +482 -0
  247. package/output/core/functions/decimal.d.ts +24 -0
  248. package/output/core/functions/decimal.js +664 -0
  249. package/output/core/functions/expand/expand.d.ts +42 -0
  250. package/output/core/functions/expand/expand.js +376 -0
  251. package/output/core/functions/fresnelNumeric.d.ts +12 -0
  252. package/output/core/functions/fresnelNumeric.js +123 -0
  253. package/output/core/functions/numeric.d.ts +140 -0
  254. package/output/core/functions/numeric.js +790 -0
  255. package/output/core/functions/rationalNormalization.d.ts +11 -0
  256. package/output/core/functions/rationalNormalization.js +117 -0
  257. package/output/core/functions/setFunction.d.ts +19 -0
  258. package/output/core/functions/setFunction.js +75 -0
  259. package/output/core/functions/string.d.ts +26 -0
  260. package/output/core/functions/string.js +101 -0
  261. package/output/core/functions/subst.d.ts +90 -0
  262. package/output/core/functions/subst.js +498 -0
  263. package/output/core/functions/utils.d.ts +24 -0
  264. package/output/core/functions/utils.js +51 -0
  265. package/output/core/types.d.ts +48 -0
  266. package/output/core/types.js +2 -0
  267. package/output/index.d.ts +339 -0
  268. package/output/index.js +715 -0
  269. package/output/math/defint/defintDecimal.d.ts +37 -0
  270. package/output/math/defint/defintDecimal.js +320 -0
  271. package/output/math/defint/defintNative.d.ts +57 -0
  272. package/output/math/defint/defintNative.js +292 -0
  273. package/output/math/geometry.d.ts +8 -0
  274. package/output/math/geometry.js +32 -0
  275. package/output/math/math.d.ts +655 -0
  276. package/output/math/math.js +1811 -0
  277. package/output/math/trig.d.ts +518 -0
  278. package/output/math/trig.js +1444 -0
  279. package/output/math/trunc.d.ts +19 -0
  280. package/output/math/trunc.js +36 -0
  281. package/output/math/utils.d.ts +60 -0
  282. package/output/math/utils.js +180 -0
  283. package/output/solve/classes/DecimalMatrix.d.ts +17 -0
  284. package/output/solve/classes/DecimalMatrix.js +86 -0
  285. package/output/solve/classes/FunctionSolver.d.ts +135 -0
  286. package/output/solve/classes/FunctionSolver.js +433 -0
  287. package/output/solve/classes/MultivariateSolver.d.ts +84 -0
  288. package/output/solve/classes/MultivariateSolver.js +240 -0
  289. package/output/solve/classes/PolynomialSolver.d.ts +85 -0
  290. package/output/solve/classes/PolynomialSolver.js +292 -0
  291. package/output/solve/classes/SolutionSet.d.ts +153 -0
  292. package/output/solve/classes/SolutionSet.js +357 -0
  293. package/output/solve/classes/Solver.d.ts +17 -0
  294. package/output/solve/classes/Solver.js +132 -0
  295. package/output/solve/classes/SymbolicSolver.d.ts +74 -0
  296. package/output/solve/classes/SymbolicSolver.js +601 -0
  297. package/output/solve/linsolve.d.ts +51 -0
  298. package/output/solve/linsolve.js +225 -0
  299. package/output/solve/solve.d.ts +34 -0
  300. package/output/solve/solve.js +260 -0
  301. package/output/solve/solveSystem.d.ts +31 -0
  302. package/output/solve/solveSystem.js +290 -0
  303. package/output/solve/utils.d.ts +9 -0
  304. package/output/solve/utils.js +62 -0
  305. package/output/utils/array.d.ts +42 -0
  306. package/output/utils/array.js +98 -0
  307. package/output/utils/debug.d.ts +131 -0
  308. package/output/utils/debug.js +295 -0
  309. package/output/utils/decimal.d.ts +3 -0
  310. package/output/utils/decimal.js +16 -0
  311. package/output/utils/numeric.d.ts +14 -0
  312. package/output/utils/numeric.js +51 -0
  313. package/output/utils/object.d.ts +26 -0
  314. package/output/utils/object.js +56 -0
  315. package/package.json +213 -57
  316. package/.travis.yml +0 -3
  317. package/Algebra.js +0 -4568
  318. package/BREAKING_CHANGES.md +0 -5
  319. package/CODE_OF_CONDUCT.md +0 -46
  320. package/CONTRIBUTING.md +0 -14
  321. package/Calculus.js +0 -2675
  322. package/Extra.js +0 -622
  323. package/Solve.js +0 -1783
  324. package/all.js +0 -16
  325. package/all.min.js +0 -1
  326. package/gulpfile.js +0 -16
  327. package/index.html +0 -158
  328. package/license.txt +0 -19
  329. package/nerdamer.core.js +0 -12510
  330. package/spec/LaTeX.spec.js +0 -302
  331. package/spec/TeXConvert.spec.js +0 -8
  332. package/spec/algebra.spec.js +0 -287
  333. package/spec/basic_parser.spec.js +0 -134
  334. package/spec/build.spec.js +0 -131
  335. package/spec/calculus.spec.js +0 -183
  336. package/spec/core.spec.js +0 -2970
  337. package/spec/extra.spec.js +0 -54
  338. package/spec/solve.spec.js +0 -126
  339. package/spec/support/jasmine.json +0 -11
  340. package/spec/support/utils.js +0 -42
  341. package/spec/text.spec.js +0 -132
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseConverter = void 0;
4
+ const Expression_1 = require("../classes/expression/Expression");
5
+ const constants_1 = require("../classes/parser/constants");
6
+ const errors_1 = require("../errors");
7
+ const modes = {
8
+ TeX: 'TeX',
9
+ TEXT: 'text',
10
+ };
11
+ /**
12
+ * Shared formatting pipeline for Nerdamer converters.
13
+ *
14
+ * @remarks
15
+ * This is an implementation base class. Public callers should construct `Converter`
16
+ * through `nerdamer.classes.Converter`; subclasses provide the
17
+ * expression-specific formatting hooks used by {@link BaseConverter.convert}.
18
+ *
19
+ * Conversion separates every expression into multiplier, value, and power fragments,
20
+ * each with numerator and denominator slots. Keeping those fragments separate lets the
21
+ * final formatting step place negative powers and rational multipliers into one
22
+ * denominator without algebraically rewriting the caller's symbolic value.
23
+ */
24
+ class BaseConverter {
25
+ static GREEK_LETTERS = [
26
+ 'alpha',
27
+ 'beta',
28
+ 'gamma',
29
+ 'delta',
30
+ 'epsilon',
31
+ 'zeta',
32
+ 'eta',
33
+ 'theta',
34
+ 'iota',
35
+ 'kappa',
36
+ 'lambda',
37
+ 'mu',
38
+ 'nu',
39
+ 'xi',
40
+ 'omnikron',
41
+ 'pi',
42
+ 'rho',
43
+ 'sigma',
44
+ 'tau',
45
+ 'upsilon',
46
+ 'phi',
47
+ 'chi',
48
+ 'psi',
49
+ 'omega',
50
+ 'Gamma',
51
+ 'Delta',
52
+ 'Epsilon',
53
+ 'Theta',
54
+ 'Lambda',
55
+ 'Xi',
56
+ 'Pi',
57
+ 'Sigma',
58
+ 'Phi',
59
+ 'Psi',
60
+ 'Omega',
61
+ ];
62
+ static modes = modes;
63
+ greek = BaseConverter.GREEK_LETTERS;
64
+ modes = [modes.TeX, modes.TEXT];
65
+ mode = this.modes[0];
66
+ static convertNtRoot(input, root) {
67
+ return Expression_1.Expression.toFunction(constants_1.NTHROOT, [BaseConverter.strip(input), root]);
68
+ }
69
+ static convertSQRT(input) {
70
+ return Expression_1.Expression.toFunction(constants_1.SQRT, [BaseConverter.strip(input)]);
71
+ }
72
+ static join(n, d, glue) {
73
+ if (!n && !d) {
74
+ return '';
75
+ }
76
+ if (n && !d) {
77
+ return n;
78
+ }
79
+ if (d && !n) {
80
+ return d;
81
+ }
82
+ return n + glue + d;
83
+ }
84
+ static merge(a, b) {
85
+ return [a[0] + b[0], a[1] + b[1]];
86
+ }
87
+ static strip(input) {
88
+ const arg = new Expression_1.Expression(input);
89
+ delete arg.power;
90
+ delete arg.multiplier;
91
+ return arg;
92
+ }
93
+ cleanup() {
94
+ // Override in subclasses if needed
95
+ }
96
+ convertPower(input, power, options) {
97
+ return power.isOne() || (input.isNUM() && power.isZero())
98
+ ? ''
99
+ : this.convert(power, options);
100
+ }
101
+ finalizePowerAndInput(power, input, _options) {
102
+ return [power, input];
103
+ }
104
+ formatPowerOutput(pArray, requiresBrackets) {
105
+ const retval = ['', ''];
106
+ for (let i = 0; i < pArray.length; i++) {
107
+ const p = pArray[i];
108
+ if (p === '') {
109
+ retval[i] = '';
110
+ continue;
111
+ }
112
+ const formatted = this.mode === BaseConverter.modes.TEXT && requiresBrackets
113
+ ? this.inBrackets(p)
114
+ : this.inBraces(p);
115
+ retval[i] = '^' + formatted;
116
+ }
117
+ return retval;
118
+ }
119
+ formatSubscripts(value) {
120
+ const parts = value.split('_');
121
+ let formatted = '';
122
+ while (parts.length > 1) {
123
+ formatted = '_' + this.inBraces(parts.pop() + formatted);
124
+ }
125
+ return parts[0] + formatted;
126
+ }
127
+ getMultiplicationSymbol() {
128
+ return this.mode === 'TeX' ? ' \\cdot ' : '*';
129
+ }
130
+ inBraces(value) {
131
+ return this.mode === BaseConverter.modes.TEXT ? value : `{${value}}`;
132
+ }
133
+ inBrackets(value, type = 'parens') {
134
+ const bracketTypes = {
135
+ parens: ['(', ')'],
136
+ square: ['[', ']'],
137
+ brace: ['{', '}'],
138
+ abs: ['|', '|'],
139
+ };
140
+ const [L, R] = bracketTypes[type];
141
+ if (this.mode === BaseConverter.modes.TEXT) {
142
+ return `${L}${value}${R}`;
143
+ }
144
+ if (type === 'brace') {
145
+ return `\\left\\{${value}\\right\\}`;
146
+ }
147
+ return `\\left${L}${value}\\right${R}`;
148
+ }
149
+ initInput(input) {
150
+ return input;
151
+ }
152
+ isBracketed(v) {
153
+ return /^\\left\(.+\\right\)$/.test(v);
154
+ }
155
+ requiresMultiplicationSymbol(input) {
156
+ return input.isSum();
157
+ }
158
+ set(m, v, p, input) {
159
+ const mul = this.getMultiplicationSymbol();
160
+ const combinePower = input.isProduct();
161
+ // Format power
162
+ let tp;
163
+ if (p) {
164
+ const power = input.getPower();
165
+ const requiresBrackets = ((power.isSum() || power.isProduct()) && power.isLinear()) ||
166
+ (power.isNUM() && !power.isInteger()) ||
167
+ power.getPower().sign() === -1;
168
+ p = this.formatPowerOutput(p, requiresBrackets);
169
+ }
170
+ if (combinePower) {
171
+ tp = p[0];
172
+ p[0] = '';
173
+ }
174
+ // Merge v and p
175
+ v = BaseConverter.merge(v, p);
176
+ let [mn, md] = m;
177
+ const [vn, vd] = v;
178
+ // Filter out unnecessary ones
179
+ if (vn && Number(mn) === 1) {
180
+ mn = '';
181
+ }
182
+ if (Number(md) === 1) {
183
+ md = '';
184
+ }
185
+ const addMultiplication = this.requiresMultiplicationSymbol(input);
186
+ const alwaysMul = this.mode === BaseConverter.modes.TeX;
187
+ const top = BaseConverter.join(mn, vn, alwaysMul || !this.isBracketed(vn) || addMultiplication ? mul : '');
188
+ let bottom = BaseConverter.join(md, vd, alwaysMul || !this.isBracketed(vd) || addMultiplication ? mul : '');
189
+ if (md && vd && this.mode === BaseConverter.modes.TEXT) {
190
+ bottom = this.inBrackets(bottom);
191
+ }
192
+ if (top && bottom) {
193
+ let frac = this.toFraction(top, bottom);
194
+ if (combinePower && tp) {
195
+ frac = this.inBrackets(frac) + tp;
196
+ }
197
+ return frac;
198
+ }
199
+ return top;
200
+ }
201
+ setMultiplier(m, multiplierArray, _input, options) {
202
+ if (options?.decimal) {
203
+ multiplierArray[0] = m.isInteger() ? String(m.numerator) : m.text(options);
204
+ }
205
+ else {
206
+ multiplierArray[0] = String(m.numerator);
207
+ multiplierArray[1] = String(m.denominator);
208
+ }
209
+ }
210
+ toFraction(n, d) {
211
+ if (this.mode === 'TeX') {
212
+ return ('\\frac' +
213
+ this.inBraces(this.stripOuterBrackets(n)) +
214
+ this.inBraces(this.stripOuterBrackets(d)));
215
+ }
216
+ return `${n}/${d}`;
217
+ }
218
+ value(_input, _isInverted, _isNegative, _options) {
219
+ return ['', ''];
220
+ }
221
+ convertCollection(input, options) {
222
+ const elements = input.elements.map(e => this.convert(e, options));
223
+ const inner = elements.join(this.mode === BaseConverter.modes.TeX ? ', \\, ' : ', ');
224
+ return this.inBrackets(inner);
225
+ }
226
+ convertDictionary(input, options) {
227
+ const pairs = input.entries().map(([key, value]) => {
228
+ const convertedValue = this.convert(value, options);
229
+ if (this.mode === BaseConverter.modes.TeX) {
230
+ return `${key} \\mapsto ${convertedValue}`;
231
+ }
232
+ return `${key} => ${convertedValue}`;
233
+ });
234
+ const inner = pairs.join(this.mode === BaseConverter.modes.TeX ? ', \\, ' : ', ');
235
+ if (this.mode === BaseConverter.modes.TeX) {
236
+ return `\\left\\{${inner}\\right\\}`;
237
+ }
238
+ return `{${inner}}`;
239
+ }
240
+ convertEquation(input, options) {
241
+ return `${this.convert(input.LHS, options)}=${this.convert(input.RHS, options)}`;
242
+ }
243
+ convertExpression(input, options) {
244
+ input = this.initInput(input);
245
+ const pExpr = input.getPower();
246
+ // Complex exponents are not ordered, and signFree() would replace them with their modulus.
247
+ // Preserve them verbatim instead of trying to move them into the denominator.
248
+ const isComplexPower = pExpr.isComplex();
249
+ const power = isComplexPower ? pExpr : pExpr.signFree();
250
+ const isInverted = !isComplexPower && (pExpr.lt(0) || pExpr.sign() === -1);
251
+ const isNegative = input.getMultiplier().isNegative();
252
+ const m = input.getMultiplier().abs();
253
+ const multiplierArray = ['', ''];
254
+ if (!options.ignoreMultiplier) {
255
+ this.setMultiplier(m, multiplierArray, input, options);
256
+ }
257
+ const [finalPower, finalInput] = this.finalizePowerAndInput(power, input, options);
258
+ const valueArray = this.value(finalInput, isInverted, isNegative, options);
259
+ const p = this.convertPower(finalInput, finalPower, options);
260
+ const powerArray = ['', ''];
261
+ powerArray[isInverted ? 1 : 0] = p;
262
+ const result = (isNegative ? '-' : '') + this.set(multiplierArray, valueArray, powerArray, finalInput);
263
+ this.cleanup();
264
+ return result.replace(/\+-/g, '-');
265
+ }
266
+ convertMatrix(input, options) {
267
+ let retval;
268
+ if (this.mode === BaseConverter.modes.TEXT) {
269
+ const rows = input.elements.map(row => {
270
+ return `[${row.map(e => this.convert(e, options)).join(', ')}]`;
271
+ });
272
+ retval = `matrix(${rows.join(', ')})`;
273
+ }
274
+ else {
275
+ const style = options.matrixStyle || '';
276
+ const matrixOptions = { ...options, insideMatrix: true };
277
+ const rows = input.elements.map(row => row.map(e => this.convert(e, matrixOptions)).join(' & '));
278
+ retval = `\\begin{${style}matrix} ${rows.join(' \\\\ ')} \\end{${style}matrix}`;
279
+ }
280
+ return retval;
281
+ }
282
+ convertValuesSet(input, options) {
283
+ const elements = input.elements.map(e => this.convert(e, options));
284
+ const inner = elements.join(this.mode === BaseConverter.modes.TeX ? ', \\, ' : ', ');
285
+ if (this.mode === BaseConverter.modes.TeX) {
286
+ return `\\left\\{${inner}\\right\\}`;
287
+ }
288
+ return `{${inner}}`;
289
+ }
290
+ /**
291
+ * Removes a single outer \left(...\right) wrapper when the contents
292
+ * will already be visually grouped (e.g. inside \frac{}{}).
293
+ */
294
+ stripOuterBrackets(s) {
295
+ const left = '\\left(';
296
+ const right = '\\right)';
297
+ let retval = s;
298
+ if (s.startsWith(left) && s.endsWith(right)) {
299
+ let depth = 0;
300
+ let isOuterWrapper = true;
301
+ for (let i = 0; i < s.length && isOuterWrapper;) {
302
+ if (s.startsWith(left, i)) {
303
+ depth++;
304
+ i += left.length;
305
+ }
306
+ else if (s.startsWith(right, i)) {
307
+ depth--;
308
+ i += right.length;
309
+ if (depth === 0 && i < s.length) {
310
+ isOuterWrapper = false;
311
+ }
312
+ else if (depth < 0) {
313
+ isOuterWrapper = false;
314
+ }
315
+ }
316
+ else {
317
+ i++;
318
+ }
319
+ }
320
+ if (isOuterWrapper && depth === 0) {
321
+ retval = s.slice(left.length, -right.length);
322
+ }
323
+ }
324
+ return retval;
325
+ }
326
+ /**
327
+ * Formats a supported Nerdamer value in the converter's current mode.
328
+ *
329
+ * @remarks
330
+ * String input is parsed before formatting, so current parser settings, constants,
331
+ * and known values apply. Numbers are converted with JavaScript's string conversion.
332
+ * Expressions, equations, collections, vectors, matrices, solution sets, value sets,
333
+ * and dictionaries use their structured representations rather than being reparsed
334
+ * from display text.
335
+ * Reading an expression can initialize its lazily stored multiplier or power fields,
336
+ * but conversion does not change the expression's mathematical value.
337
+ *
338
+ * `convertRoots` defaults to `true`, rendering reciprocal integer powers as roots
339
+ * where the active mode supports that form. `decimal` requests decimal rational
340
+ * multipliers, `precision` is forwarded to rational formatting, `matrixStyle`
341
+ * selects the TeX matrix environment prefix, and `ignoreMultiplier` omits an
342
+ * expression's top-level multiplier. `insideMatrix` is used while formatting matrix
343
+ * elements and is normally managed by the converter itself.
344
+ *
345
+ * @param input - The parser entity, expression string, or number to format.
346
+ * @param options - Formatting options for this conversion and recursive child conversions.
347
+ * @returns The formatted text or TeX string for `input`.
348
+ * @throws Error When `input` is not one of the supported parser entity types.
349
+ */
350
+ convert(input, options) {
351
+ options = { convertRoots: true, ...options };
352
+ if (typeof input === 'number') {
353
+ return String(input);
354
+ }
355
+ if (typeof input === 'string' || Expression_1.Expression.isExpression(input)) {
356
+ return this.convertExpression(Expression_1.Expression.create(input), options);
357
+ }
358
+ if (input.dataType === constants_1.COLLECTION) {
359
+ return this.convertCollection(input, options);
360
+ }
361
+ if (input.dataType === constants_1.EQUATION) {
362
+ return this.convertEquation(input, options);
363
+ }
364
+ if (input.dataType === constants_1.VECTOR) {
365
+ const vector = input;
366
+ const separator = options.insideMatrix
367
+ ? ' & '
368
+ : this.mode === BaseConverter.modes.TeX
369
+ ? ', \\, '
370
+ : ', ';
371
+ const inner = vector.arrayMap(e => this.convert(e, options)).join(separator);
372
+ return options.insideMatrix ? inner : this.inBrackets(inner, 'square');
373
+ }
374
+ if (input.dataType === constants_1.MATRIX) {
375
+ return this.convertMatrix(input, options);
376
+ }
377
+ if (input.dataType === constants_1.SOLUTIONS_SET) {
378
+ return this.convertValuesSet(input, options);
379
+ }
380
+ if (input.dataType === constants_1.SET) {
381
+ return this.convertValuesSet(input, options);
382
+ }
383
+ if (input.dataType === constants_1.DICTIONARY) {
384
+ return this.convertDictionary(input, options);
385
+ }
386
+ throw new Error((0, errors_1.message)('unsupportedType', { type: constants_1.dataTypes[input.dataType] || typeof input }));
387
+ }
388
+ /**
389
+ * Selects the output syntax used by subsequent conversions.
390
+ *
391
+ * @remarks
392
+ * The mode is mutable converter state. Supported values are `"TeX"` and `"text"`;
393
+ * changing the mode does not alter parser settings or previously returned strings.
394
+ *
395
+ * @param mode - The output mode to activate.
396
+ * @throws Error When `mode` is not `"TeX"` or `"text"`.
397
+ */
398
+ setMode(mode) {
399
+ if (!this.modes.includes(mode)) {
400
+ throw new Error((0, errors_1.message)('unrecognizedMode', { mode }));
401
+ }
402
+ this.mode = mode;
403
+ }
404
+ }
405
+ exports.BaseConverter = BaseConverter;
@@ -0,0 +1,111 @@
1
+ import { Expression } from '../classes/expression/Expression';
2
+ import { BaseConverter } from './BaseConverter';
3
+ import type { OptionsObject } from '../classes/parser/types';
4
+ import type { FracArray } from '../classes/parser/types';
5
+ import type { ParserEntity } from '../types';
6
+ /**
7
+ * Formats Nerdamer values as TeX or normalized text and imports supported TeX input.
8
+ *
9
+ * @remarks
10
+ * A converter retains its output mode between calls. The default mode is `"TeX"`;
11
+ * construct a separate `"text"` converter when both representations are needed.
12
+ * Formatting a string parses it with the process-wide parser, so registered functions,
13
+ * constants, settings, and known values can affect the result.
14
+ *
15
+ * {@link Converter.fromTeX} recognizes the TeX forms emitted by this converter and a
16
+ * practical subset of common mathematical notation. It is not a general TeX parser:
17
+ * unsupported macros, ambiguous implicit notation, or nesting outside the recognized
18
+ * forms can produce parser errors or a different symbolic interpretation.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import nerdamer from 'nerdamer';
23
+ *
24
+ * const text = new nerdamer.classes.Converter('text');
25
+ * const tex = new nerdamer.classes.Converter();
26
+ *
27
+ * text.convert('x^2 + 2*x + 1'); // "1+2*x+x^2"
28
+ * tex.convert('sqrt(x)'); // "\\sqrt{x}"
29
+ * ```
30
+ */
31
+ export declare class Converter extends BaseConverter {
32
+ private static readonly TEX_FUNCTION_MAP;
33
+ /**
34
+ * Reverse map for fromTeX: maps TeX command names back to internal function names.
35
+ */
36
+ private static readonly TEX_REVERSE_MAP;
37
+ /**
38
+ * Creates a converter with persistent output mode.
39
+ *
40
+ * @param mode - `"TeX"` (the default) or `"text"`.
41
+ */
42
+ constructor(mode?: 'TeX' | 'text');
43
+ private static clearOnes;
44
+ private static wrapRoot;
45
+ protected finalizePowerAndInput(power: Expression, input: Expression, options?: OptionsObject): [Expression, Expression];
46
+ protected functionString(input: Expression, options?: OptionsObject): string;
47
+ protected value(input: Expression, isInverted: boolean, isNegative: boolean, options?: OptionsObject): FracArray;
48
+ private convertSourceRPN;
49
+ private formatFactorial;
50
+ private formatSumOrProduct;
51
+ private formatTeXFunction;
52
+ private formatVariable;
53
+ private getFunctionName;
54
+ private handleExp;
55
+ private handleProduct;
56
+ private handleSum;
57
+ /** Parses a top-level TeX matrix environment into a scalar-valued Matrix. */
58
+ private parseTeXMatrix;
59
+ private parseTeXSetOrDictionary;
60
+ private parseTeXVector;
61
+ /**
62
+ * Rewrites the supported TeX subset into parser syntax in an ordered pass.
63
+ *
64
+ * Structure-dependent forms such as transforms, derivatives, integrals, limits, and
65
+ * indexed sums must be recognized before generic braces and commands are removed.
66
+ * This is a compatibility preprocessor rather than a TeX grammar, so each rewrite is
67
+ * limited to the forms that can be mapped unambiguously to parser calls.
68
+ */
69
+ private preprocessTeXClean;
70
+ /**
71
+ * Rewrites one TeX command whose argument is carried in balanced braces.
72
+ *
73
+ * The converter emits some commands around expressions that can themselves contain
74
+ * nested TeX groups. A flat regular expression cannot safely recover those arguments,
75
+ * so this keeps the brace matching local to the TeX conversion pipeline.
76
+ */
77
+ private replaceBracedTeXCommand;
78
+ private splitTeXTopLevel;
79
+ /**
80
+ * Formats supported values while retaining ordinary Converter semantics by default.
81
+ * Source preservation is an internal compatibility option used by convertToLaTeX.
82
+ */
83
+ convert(input: ParserEntity | string | number, options?: OptionsObject): string;
84
+ /**
85
+ * Parses a supported TeX subset into a Nerdamer parser entity.
86
+ *
87
+ * @remarks
88
+ * Set notation is recognized before ordinary expression preprocessing and produces a
89
+ * value set or dictionary when appropriate. Other input is rewritten to Nerdamer
90
+ * parser syntax, tokenized in pure mode, and evaluated through the process-wide parser.
91
+ * Consequently, parser settings or registered functions can affect the result.
92
+ *
93
+ * The importer supports the converter's common function forms, roots, arbitrary-base
94
+ * logarithms, transforms, derivatives, integrals, limits, sums, products, floor and
95
+ * ceiling notation, equations, vectors, matrices, finite sets, and dictionaries. It does
96
+ * not promise round-tripping arbitrary third-party TeX.
97
+ *
98
+ * @param input - TeX text in the supported conversion subset.
99
+ * @returns The parser entity represented by the supported TeX input.
100
+ * @throws Error When preprocessing leaves syntax that the parser cannot interpret.
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * import nerdamer from 'nerdamer';
105
+ *
106
+ * const converter = new nerdamer.classes.Converter();
107
+ * nerdamer.pretty(converter.fromTeX('\\log_{2}{256}'), 'text'); // "8"
108
+ * ```
109
+ */
110
+ fromTeX(input: string): ParserEntity;
111
+ }