BaseMethods.js 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. "use strict";
  2. var __assign = (this && this.__assign) || function () {
  3. __assign = Object.assign || function(t) {
  4. for (var s, i = 1, n = arguments.length; i < n; i++) {
  5. s = arguments[i];
  6. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  7. t[p] = s[p];
  8. }
  9. return t;
  10. };
  11. return __assign.apply(this, arguments);
  12. };
  13. var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
  14. if (k2 === undefined) k2 = k;
  15. var desc = Object.getOwnPropertyDescriptor(m, k);
  16. if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
  17. desc = { enumerable: true, get: function() { return m[k]; } };
  18. }
  19. Object.defineProperty(o, k2, desc);
  20. }) : (function(o, m, k, k2) {
  21. if (k2 === undefined) k2 = k;
  22. o[k2] = m[k];
  23. }));
  24. var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
  25. Object.defineProperty(o, "default", { enumerable: true, value: v });
  26. }) : function(o, v) {
  27. o["default"] = v;
  28. });
  29. var __importStar = (this && this.__importStar) || function (mod) {
  30. if (mod && mod.__esModule) return mod;
  31. var result = {};
  32. if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
  33. __setModuleDefault(result, mod);
  34. return result;
  35. };
  36. var __read = (this && this.__read) || function (o, n) {
  37. var m = typeof Symbol === "function" && o[Symbol.iterator];
  38. if (!m) return o;
  39. var i = m.call(o), r, ar = [], e;
  40. try {
  41. while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  42. }
  43. catch (error) { e = { error: error }; }
  44. finally {
  45. try {
  46. if (r && !r.done && (m = i["return"])) m.call(i);
  47. }
  48. finally { if (e) throw e.error; }
  49. }
  50. return ar;
  51. };
  52. var __importDefault = (this && this.__importDefault) || function (mod) {
  53. return (mod && mod.__esModule) ? mod : { "default": mod };
  54. };
  55. Object.defineProperty(exports, "__esModule", { value: true });
  56. var sitem = __importStar(require("./BaseItems.js"));
  57. var NodeUtil_js_1 = __importDefault(require("../NodeUtil.js"));
  58. var TexError_js_1 = __importDefault(require("../TexError.js"));
  59. var TexParser_js_1 = __importDefault(require("../TexParser.js"));
  60. var TexConstants_js_1 = require("../TexConstants.js");
  61. var ParseUtil_js_1 = __importDefault(require("../ParseUtil.js"));
  62. var MmlNode_js_1 = require("../../../core/MmlTree/MmlNode.js");
  63. var Tags_js_1 = require("../Tags.js");
  64. var lengths_js_1 = require("../../../util/lengths.js");
  65. var Entities_js_1 = require("../../../util/Entities.js");
  66. var Options_js_1 = require("../../../util/Options.js");
  67. var BaseMethods = {};
  68. var P_HEIGHT = 1.2 / .85;
  69. var MmlTokenAllow = {
  70. fontfamily: 1, fontsize: 1, fontweight: 1, fontstyle: 1,
  71. color: 1, background: 1,
  72. id: 1, 'class': 1, href: 1, style: 1
  73. };
  74. BaseMethods.Open = function (parser, _c) {
  75. parser.Push(parser.itemFactory.create('open'));
  76. };
  77. BaseMethods.Close = function (parser, _c) {
  78. parser.Push(parser.itemFactory.create('close'));
  79. };
  80. BaseMethods.Tilde = function (parser, _c) {
  81. parser.Push(parser.create('token', 'mtext', {}, Entities_js_1.entities.nbsp));
  82. };
  83. BaseMethods.Space = function (_parser, _c) { };
  84. BaseMethods.Superscript = function (parser, _c) {
  85. var _a;
  86. if (parser.GetNext().match(/\d/)) {
  87. parser.string = parser.string.substr(0, parser.i + 1) +
  88. ' ' + parser.string.substr(parser.i + 1);
  89. }
  90. var primes;
  91. var base;
  92. var top = parser.stack.Top();
  93. if (top.isKind('prime')) {
  94. _a = __read(top.Peek(2), 2), base = _a[0], primes = _a[1];
  95. parser.stack.Pop();
  96. }
  97. else {
  98. base = parser.stack.Prev();
  99. if (!base) {
  100. base = parser.create('token', 'mi', {}, '');
  101. }
  102. }
  103. var movesupsub = NodeUtil_js_1.default.getProperty(base, 'movesupsub');
  104. var position = NodeUtil_js_1.default.isType(base, 'msubsup') ? base.sup :
  105. base.over;
  106. if ((NodeUtil_js_1.default.isType(base, 'msubsup') && !NodeUtil_js_1.default.isType(base, 'msup') &&
  107. NodeUtil_js_1.default.getChildAt(base, base.sup)) ||
  108. (NodeUtil_js_1.default.isType(base, 'munderover') && !NodeUtil_js_1.default.isType(base, 'mover') &&
  109. NodeUtil_js_1.default.getChildAt(base, base.over) &&
  110. !NodeUtil_js_1.default.getProperty(base, 'subsupOK'))) {
  111. throw new TexError_js_1.default('DoubleExponent', 'Double exponent: use braces to clarify');
  112. }
  113. if (!NodeUtil_js_1.default.isType(base, 'msubsup') || NodeUtil_js_1.default.isType(base, 'msup')) {
  114. if (movesupsub) {
  115. if (!NodeUtil_js_1.default.isType(base, 'munderover') || NodeUtil_js_1.default.isType(base, 'mover') ||
  116. NodeUtil_js_1.default.getChildAt(base, base.over)) {
  117. base = parser.create('node', 'munderover', [base], { movesupsub: true });
  118. }
  119. position = base.over;
  120. }
  121. else {
  122. base = parser.create('node', 'msubsup', [base]);
  123. position = base.sup;
  124. }
  125. }
  126. parser.Push(parser.itemFactory.create('subsup', base).setProperties({
  127. position: position, primes: primes, movesupsub: movesupsub
  128. }));
  129. };
  130. BaseMethods.Subscript = function (parser, _c) {
  131. var _a;
  132. if (parser.GetNext().match(/\d/)) {
  133. parser.string =
  134. parser.string.substr(0, parser.i + 1) + ' ' +
  135. parser.string.substr(parser.i + 1);
  136. }
  137. var primes, base;
  138. var top = parser.stack.Top();
  139. if (top.isKind('prime')) {
  140. _a = __read(top.Peek(2), 2), base = _a[0], primes = _a[1];
  141. parser.stack.Pop();
  142. }
  143. else {
  144. base = parser.stack.Prev();
  145. if (!base) {
  146. base = parser.create('token', 'mi', {}, '');
  147. }
  148. }
  149. var movesupsub = NodeUtil_js_1.default.getProperty(base, 'movesupsub');
  150. var position = NodeUtil_js_1.default.isType(base, 'msubsup') ?
  151. base.sub : base.under;
  152. if ((NodeUtil_js_1.default.isType(base, 'msubsup') && !NodeUtil_js_1.default.isType(base, 'msup') &&
  153. NodeUtil_js_1.default.getChildAt(base, base.sub)) ||
  154. (NodeUtil_js_1.default.isType(base, 'munderover') && !NodeUtil_js_1.default.isType(base, 'mover') &&
  155. NodeUtil_js_1.default.getChildAt(base, base.under) &&
  156. !NodeUtil_js_1.default.getProperty(base, 'subsupOK'))) {
  157. throw new TexError_js_1.default('DoubleSubscripts', 'Double subscripts: use braces to clarify');
  158. }
  159. if (!NodeUtil_js_1.default.isType(base, 'msubsup') || NodeUtil_js_1.default.isType(base, 'msup')) {
  160. if (movesupsub) {
  161. if (!NodeUtil_js_1.default.isType(base, 'munderover') || NodeUtil_js_1.default.isType(base, 'mover') ||
  162. NodeUtil_js_1.default.getChildAt(base, base.under)) {
  163. base = parser.create('node', 'munderover', [base], { movesupsub: true });
  164. }
  165. position = base.under;
  166. }
  167. else {
  168. base = parser.create('node', 'msubsup', [base]);
  169. position = base.sub;
  170. }
  171. }
  172. parser.Push(parser.itemFactory.create('subsup', base).setProperties({
  173. position: position, primes: primes, movesupsub: movesupsub
  174. }));
  175. };
  176. BaseMethods.Prime = function (parser, c) {
  177. var base = parser.stack.Prev();
  178. if (!base) {
  179. base = parser.create('node', 'mi');
  180. }
  181. if (NodeUtil_js_1.default.isType(base, 'msubsup') && !NodeUtil_js_1.default.isType(base, 'msup') &&
  182. NodeUtil_js_1.default.getChildAt(base, base.sup)) {
  183. throw new TexError_js_1.default('DoubleExponentPrime', 'Prime causes double exponent: use braces to clarify');
  184. }
  185. var sup = '';
  186. parser.i--;
  187. do {
  188. sup += Entities_js_1.entities.prime;
  189. parser.i++, c = parser.GetNext();
  190. } while (c === '\'' || c === Entities_js_1.entities.rsquo);
  191. sup = ['', '\u2032', '\u2033', '\u2034', '\u2057'][sup.length] || sup;
  192. var node = parser.create('token', 'mo', { variantForm: true }, sup);
  193. parser.Push(parser.itemFactory.create('prime', base, node));
  194. };
  195. BaseMethods.Comment = function (parser, _c) {
  196. while (parser.i < parser.string.length && parser.string.charAt(parser.i) !== '\n') {
  197. parser.i++;
  198. }
  199. };
  200. BaseMethods.Hash = function (_parser, _c) {
  201. throw new TexError_js_1.default('CantUseHash1', 'You can\'t use \'macro parameter character #\' in math mode');
  202. };
  203. BaseMethods.MathFont = function (parser, name, variant) {
  204. var text = parser.GetArgument(name);
  205. var mml = new TexParser_js_1.default(text, __assign(__assign({}, parser.stack.env), { font: variant, multiLetterIdentifiers: /^[a-zA-Z]+/, noAutoOP: true }), parser.configuration).mml();
  206. parser.Push(parser.create('node', 'TeXAtom', [mml]));
  207. };
  208. BaseMethods.SetFont = function (parser, _name, font) {
  209. parser.stack.env['font'] = font;
  210. };
  211. BaseMethods.SetStyle = function (parser, _name, texStyle, style, level) {
  212. parser.stack.env['style'] = texStyle;
  213. parser.stack.env['level'] = level;
  214. parser.Push(parser.itemFactory.create('style').setProperty('styles', { displaystyle: style, scriptlevel: level }));
  215. };
  216. BaseMethods.SetSize = function (parser, _name, size) {
  217. parser.stack.env['size'] = size;
  218. parser.Push(parser.itemFactory.create('style').setProperty('styles', { mathsize: (0, lengths_js_1.em)(size) }));
  219. };
  220. BaseMethods.Spacer = function (parser, _name, space) {
  221. var node = parser.create('node', 'mspace', [], { width: (0, lengths_js_1.em)(space) });
  222. var style = parser.create('node', 'mstyle', [node], { scriptlevel: 0 });
  223. parser.Push(style);
  224. };
  225. BaseMethods.LeftRight = function (parser, name) {
  226. var first = name.substr(1);
  227. parser.Push(parser.itemFactory.create(first, parser.GetDelimiter(name), parser.stack.env.color));
  228. };
  229. BaseMethods.NamedFn = function (parser, name, id) {
  230. if (!id) {
  231. id = name.substr(1);
  232. }
  233. var mml = parser.create('token', 'mi', { texClass: MmlNode_js_1.TEXCLASS.OP }, id);
  234. parser.Push(parser.itemFactory.create('fn', mml));
  235. };
  236. BaseMethods.NamedOp = function (parser, name, id) {
  237. if (!id) {
  238. id = name.substr(1);
  239. }
  240. id = id.replace(/&thinsp;/, '\u2006');
  241. var mml = parser.create('token', 'mo', {
  242. movablelimits: true,
  243. movesupsub: true,
  244. form: TexConstants_js_1.TexConstant.Form.PREFIX,
  245. texClass: MmlNode_js_1.TEXCLASS.OP
  246. }, id);
  247. parser.Push(mml);
  248. };
  249. BaseMethods.Limits = function (parser, _name, limits) {
  250. var op = parser.stack.Prev(true);
  251. if (!op || (NodeUtil_js_1.default.getTexClass(NodeUtil_js_1.default.getCoreMO(op)) !== MmlNode_js_1.TEXCLASS.OP &&
  252. NodeUtil_js_1.default.getProperty(op, 'movesupsub') == null)) {
  253. throw new TexError_js_1.default('MisplacedLimits', '%1 is allowed only on operators', parser.currentCS);
  254. }
  255. var top = parser.stack.Top();
  256. var node;
  257. if (NodeUtil_js_1.default.isType(op, 'munderover') && !limits) {
  258. node = parser.create('node', 'msubsup');
  259. NodeUtil_js_1.default.copyChildren(op, node);
  260. op = top.Last = node;
  261. }
  262. else if (NodeUtil_js_1.default.isType(op, 'msubsup') && limits) {
  263. node = parser.create('node', 'munderover');
  264. NodeUtil_js_1.default.copyChildren(op, node);
  265. op = top.Last = node;
  266. }
  267. NodeUtil_js_1.default.setProperty(op, 'movesupsub', limits ? true : false);
  268. NodeUtil_js_1.default.setProperties(NodeUtil_js_1.default.getCoreMO(op), { 'movablelimits': false });
  269. if (NodeUtil_js_1.default.getAttribute(op, 'movablelimits') ||
  270. NodeUtil_js_1.default.getProperty(op, 'movablelimits')) {
  271. NodeUtil_js_1.default.setProperties(op, { 'movablelimits': false });
  272. }
  273. };
  274. BaseMethods.Over = function (parser, name, open, close) {
  275. var mml = parser.itemFactory.create('over').setProperty('name', parser.currentCS);
  276. if (open || close) {
  277. mml.setProperty('open', open);
  278. mml.setProperty('close', close);
  279. }
  280. else if (name.match(/withdelims$/)) {
  281. mml.setProperty('open', parser.GetDelimiter(name));
  282. mml.setProperty('close', parser.GetDelimiter(name));
  283. }
  284. if (name.match(/^\\above/)) {
  285. mml.setProperty('thickness', parser.GetDimen(name));
  286. }
  287. else if (name.match(/^\\atop/) || open || close) {
  288. mml.setProperty('thickness', 0);
  289. }
  290. parser.Push(mml);
  291. };
  292. BaseMethods.Frac = function (parser, name) {
  293. var num = parser.ParseArg(name);
  294. var den = parser.ParseArg(name);
  295. var node = parser.create('node', 'mfrac', [num, den]);
  296. parser.Push(node);
  297. };
  298. BaseMethods.Sqrt = function (parser, name) {
  299. var n = parser.GetBrackets(name);
  300. var arg = parser.GetArgument(name);
  301. if (arg === '\\frac') {
  302. arg += '{' + parser.GetArgument(arg) + '}{' + parser.GetArgument(arg) + '}';
  303. }
  304. var mml = new TexParser_js_1.default(arg, parser.stack.env, parser.configuration).mml();
  305. if (!n) {
  306. mml = parser.create('node', 'msqrt', [mml]);
  307. }
  308. else {
  309. mml = parser.create('node', 'mroot', [mml, parseRoot(parser, n)]);
  310. }
  311. parser.Push(mml);
  312. };
  313. function parseRoot(parser, n) {
  314. var env = parser.stack.env;
  315. var inRoot = env['inRoot'];
  316. env['inRoot'] = true;
  317. var newParser = new TexParser_js_1.default(n, env, parser.configuration);
  318. var node = newParser.mml();
  319. var global = newParser.stack.global;
  320. if (global['leftRoot'] || global['upRoot']) {
  321. var def = {};
  322. if (global['leftRoot']) {
  323. def['width'] = global['leftRoot'];
  324. }
  325. if (global['upRoot']) {
  326. def['voffset'] = global['upRoot'];
  327. def['height'] = global['upRoot'];
  328. }
  329. node = parser.create('node', 'mpadded', [node], def);
  330. }
  331. env['inRoot'] = inRoot;
  332. return node;
  333. }
  334. BaseMethods.Root = function (parser, name) {
  335. var n = parser.GetUpTo(name, '\\of');
  336. var arg = parser.ParseArg(name);
  337. var node = parser.create('node', 'mroot', [arg, parseRoot(parser, n)]);
  338. parser.Push(node);
  339. };
  340. BaseMethods.MoveRoot = function (parser, name, id) {
  341. if (!parser.stack.env['inRoot']) {
  342. throw new TexError_js_1.default('MisplacedMoveRoot', '%1 can appear only within a root', parser.currentCS);
  343. }
  344. if (parser.stack.global[id]) {
  345. throw new TexError_js_1.default('MultipleMoveRoot', 'Multiple use of %1', parser.currentCS);
  346. }
  347. var n = parser.GetArgument(name);
  348. if (!n.match(/-?[0-9]+/)) {
  349. throw new TexError_js_1.default('IntegerArg', 'The argument to %1 must be an integer', parser.currentCS);
  350. }
  351. n = (parseInt(n, 10) / 15) + 'em';
  352. if (n.substr(0, 1) !== '-') {
  353. n = '+' + n;
  354. }
  355. parser.stack.global[id] = n;
  356. };
  357. BaseMethods.Accent = function (parser, name, accent, stretchy) {
  358. var c = parser.ParseArg(name);
  359. var def = __assign(__assign({}, ParseUtil_js_1.default.getFontDef(parser)), { accent: true, mathaccent: true });
  360. var entity = NodeUtil_js_1.default.createEntity(accent);
  361. var moNode = parser.create('token', 'mo', def, entity);
  362. var mml = moNode;
  363. NodeUtil_js_1.default.setAttribute(mml, 'stretchy', stretchy ? true : false);
  364. var mo = (NodeUtil_js_1.default.isEmbellished(c) ? NodeUtil_js_1.default.getCoreMO(c) : c);
  365. if (NodeUtil_js_1.default.isType(mo, 'mo') || NodeUtil_js_1.default.getProperty(mo, 'movablelimits')) {
  366. NodeUtil_js_1.default.setProperties(mo, { 'movablelimits': false });
  367. }
  368. var muoNode = parser.create('node', 'munderover');
  369. NodeUtil_js_1.default.setChild(muoNode, 0, c);
  370. NodeUtil_js_1.default.setChild(muoNode, 1, null);
  371. NodeUtil_js_1.default.setChild(muoNode, 2, mml);
  372. var texAtom = parser.create('node', 'TeXAtom', [muoNode]);
  373. parser.Push(texAtom);
  374. };
  375. BaseMethods.UnderOver = function (parser, name, c, stack) {
  376. var entity = NodeUtil_js_1.default.createEntity(c);
  377. var mo = parser.create('token', 'mo', { stretchy: true, accent: true }, entity);
  378. var pos = (name.charAt(1) === 'o' ? 'over' : 'under');
  379. var base = parser.ParseArg(name);
  380. parser.Push(ParseUtil_js_1.default.underOver(parser, base, mo, pos, stack));
  381. };
  382. BaseMethods.Overset = function (parser, name) {
  383. var top = parser.ParseArg(name);
  384. var base = parser.ParseArg(name);
  385. ParseUtil_js_1.default.checkMovableLimits(base);
  386. if (top.isKind('mo')) {
  387. NodeUtil_js_1.default.setAttribute(top, 'accent', false);
  388. }
  389. var node = parser.create('node', 'mover', [base, top]);
  390. parser.Push(node);
  391. };
  392. BaseMethods.Underset = function (parser, name) {
  393. var bot = parser.ParseArg(name);
  394. var base = parser.ParseArg(name);
  395. ParseUtil_js_1.default.checkMovableLimits(base);
  396. if (bot.isKind('mo')) {
  397. NodeUtil_js_1.default.setAttribute(bot, 'accent', false);
  398. }
  399. var node = parser.create('node', 'munder', [base, bot], { accentunder: false });
  400. parser.Push(node);
  401. };
  402. BaseMethods.Overunderset = function (parser, name) {
  403. var top = parser.ParseArg(name);
  404. var bot = parser.ParseArg(name);
  405. var base = parser.ParseArg(name);
  406. ParseUtil_js_1.default.checkMovableLimits(base);
  407. if (top.isKind('mo')) {
  408. NodeUtil_js_1.default.setAttribute(top, 'accent', false);
  409. }
  410. if (bot.isKind('mo')) {
  411. NodeUtil_js_1.default.setAttribute(bot, 'accent', false);
  412. }
  413. var node = parser.create('node', 'munderover', [base, bot, top], { accent: false, accentunder: false });
  414. parser.Push(node);
  415. };
  416. BaseMethods.TeXAtom = function (parser, name, mclass) {
  417. var def = { texClass: mclass };
  418. var mml;
  419. var node;
  420. var parsed;
  421. if (mclass === MmlNode_js_1.TEXCLASS.OP) {
  422. def['movesupsub'] = def['movablelimits'] = true;
  423. var arg = parser.GetArgument(name);
  424. var match = arg.match(/^\s*\\rm\s+([a-zA-Z0-9 ]+)$/);
  425. if (match) {
  426. def['mathvariant'] = TexConstants_js_1.TexConstant.Variant.NORMAL;
  427. node = parser.create('token', 'mi', def, match[1]);
  428. }
  429. else {
  430. parsed = new TexParser_js_1.default(arg, parser.stack.env, parser.configuration).mml();
  431. node = parser.create('node', 'TeXAtom', [parsed], def);
  432. }
  433. mml = parser.itemFactory.create('fn', node);
  434. }
  435. else {
  436. parsed = parser.ParseArg(name);
  437. mml = parser.create('node', 'TeXAtom', [parsed], def);
  438. }
  439. parser.Push(mml);
  440. };
  441. BaseMethods.MmlToken = function (parser, name) {
  442. var kind = parser.GetArgument(name);
  443. var attr = parser.GetBrackets(name, '').replace(/^\s+/, '');
  444. var text = parser.GetArgument(name);
  445. var def = {};
  446. var keep = [];
  447. var node;
  448. try {
  449. node = parser.create('node', kind);
  450. }
  451. catch (e) {
  452. node = null;
  453. }
  454. if (!node || !node.isToken) {
  455. throw new TexError_js_1.default('NotMathMLToken', '%1 is not a token element', kind);
  456. }
  457. while (attr !== '') {
  458. var match = attr.match(/^([a-z]+)\s*=\s*('[^']*'|"[^"]*"|[^ ,]*)\s*,?\s*/i);
  459. if (!match) {
  460. throw new TexError_js_1.default('InvalidMathMLAttr', 'Invalid MathML attribute: %1', attr);
  461. }
  462. if (!node.attributes.hasDefault(match[1]) && !MmlTokenAllow[match[1]]) {
  463. throw new TexError_js_1.default('UnknownAttrForElement', '%1 is not a recognized attribute for %2', match[1], kind);
  464. }
  465. var value = ParseUtil_js_1.default.MmlFilterAttribute(parser, match[1], match[2].replace(/^(['"])(.*)\1$/, '$2'));
  466. if (value) {
  467. if (value.toLowerCase() === 'true') {
  468. value = true;
  469. }
  470. else if (value.toLowerCase() === 'false') {
  471. value = false;
  472. }
  473. def[match[1]] = value;
  474. keep.push(match[1]);
  475. }
  476. attr = attr.substr(match[0].length);
  477. }
  478. if (keep.length) {
  479. def['mjx-keep-attrs'] = keep.join(' ');
  480. }
  481. var textNode = parser.create('text', text);
  482. node.appendChild(textNode);
  483. NodeUtil_js_1.default.setProperties(node, def);
  484. parser.Push(node);
  485. };
  486. BaseMethods.Strut = function (parser, _name) {
  487. var row = parser.create('node', 'mrow');
  488. var padded = parser.create('node', 'mpadded', [row], { height: '8.6pt', depth: '3pt', width: 0 });
  489. parser.Push(padded);
  490. };
  491. BaseMethods.Phantom = function (parser, name, v, h) {
  492. var box = parser.create('node', 'mphantom', [parser.ParseArg(name)]);
  493. if (v || h) {
  494. box = parser.create('node', 'mpadded', [box]);
  495. if (h) {
  496. NodeUtil_js_1.default.setAttribute(box, 'height', 0);
  497. NodeUtil_js_1.default.setAttribute(box, 'depth', 0);
  498. }
  499. if (v) {
  500. NodeUtil_js_1.default.setAttribute(box, 'width', 0);
  501. }
  502. }
  503. var atom = parser.create('node', 'TeXAtom', [box]);
  504. parser.Push(atom);
  505. };
  506. BaseMethods.Smash = function (parser, name) {
  507. var bt = ParseUtil_js_1.default.trimSpaces(parser.GetBrackets(name, ''));
  508. var smash = parser.create('node', 'mpadded', [parser.ParseArg(name)]);
  509. switch (bt) {
  510. case 'b':
  511. NodeUtil_js_1.default.setAttribute(smash, 'depth', 0);
  512. break;
  513. case 't':
  514. NodeUtil_js_1.default.setAttribute(smash, 'height', 0);
  515. break;
  516. default:
  517. NodeUtil_js_1.default.setAttribute(smash, 'height', 0);
  518. NodeUtil_js_1.default.setAttribute(smash, 'depth', 0);
  519. }
  520. var atom = parser.create('node', 'TeXAtom', [smash]);
  521. parser.Push(atom);
  522. };
  523. BaseMethods.Lap = function (parser, name) {
  524. var mml = parser.create('node', 'mpadded', [parser.ParseArg(name)], { width: 0 });
  525. if (name === '\\llap') {
  526. NodeUtil_js_1.default.setAttribute(mml, 'lspace', '-1width');
  527. }
  528. var atom = parser.create('node', 'TeXAtom', [mml]);
  529. parser.Push(atom);
  530. };
  531. BaseMethods.RaiseLower = function (parser, name) {
  532. var h = parser.GetDimen(name);
  533. var item = parser.itemFactory.create('position').setProperties({ name: parser.currentCS, move: 'vertical' });
  534. if (h.charAt(0) === '-') {
  535. h = h.slice(1);
  536. name = name.substr(1) === 'raise' ? '\\lower' : '\\raise';
  537. }
  538. if (name === '\\lower') {
  539. item.setProperty('dh', '-' + h);
  540. item.setProperty('dd', '+' + h);
  541. }
  542. else {
  543. item.setProperty('dh', '+' + h);
  544. item.setProperty('dd', '-' + h);
  545. }
  546. parser.Push(item);
  547. };
  548. BaseMethods.MoveLeftRight = function (parser, name) {
  549. var h = parser.GetDimen(name);
  550. var nh = (h.charAt(0) === '-' ? h.slice(1) : '-' + h);
  551. if (name === '\\moveleft') {
  552. var tmp = h;
  553. h = nh;
  554. nh = tmp;
  555. }
  556. parser.Push(parser.itemFactory.create('position').setProperties({
  557. name: parser.currentCS, move: 'horizontal',
  558. left: parser.create('node', 'mspace', [], { width: h }),
  559. right: parser.create('node', 'mspace', [], { width: nh })
  560. }));
  561. };
  562. BaseMethods.Hskip = function (parser, name) {
  563. var node = parser.create('node', 'mspace', [], { width: parser.GetDimen(name) });
  564. parser.Push(node);
  565. };
  566. BaseMethods.Nonscript = function (parser, _name) {
  567. parser.Push(parser.itemFactory.create('nonscript'));
  568. };
  569. BaseMethods.Rule = function (parser, name, style) {
  570. var w = parser.GetDimen(name), h = parser.GetDimen(name), d = parser.GetDimen(name);
  571. var def = { width: w, height: h, depth: d };
  572. if (style !== 'blank') {
  573. def['mathbackground'] = (parser.stack.env['color'] || 'black');
  574. }
  575. var node = parser.create('node', 'mspace', [], def);
  576. parser.Push(node);
  577. };
  578. BaseMethods.rule = function (parser, name) {
  579. var v = parser.GetBrackets(name), w = parser.GetDimen(name), h = parser.GetDimen(name);
  580. var mml = parser.create('node', 'mspace', [], {
  581. width: w, height: h,
  582. mathbackground: (parser.stack.env['color'] || 'black')
  583. });
  584. if (v) {
  585. mml = parser.create('node', 'mpadded', [mml], { voffset: v });
  586. if (v.match(/^\-/)) {
  587. NodeUtil_js_1.default.setAttribute(mml, 'height', v);
  588. NodeUtil_js_1.default.setAttribute(mml, 'depth', '+' + v.substr(1));
  589. }
  590. else {
  591. NodeUtil_js_1.default.setAttribute(mml, 'height', '+' + v);
  592. }
  593. }
  594. parser.Push(mml);
  595. };
  596. BaseMethods.MakeBig = function (parser, name, mclass, size) {
  597. size *= P_HEIGHT;
  598. var sizeStr = String(size).replace(/(\.\d\d\d).+/, '$1') + 'em';
  599. var delim = parser.GetDelimiter(name, true);
  600. var mo = parser.create('token', 'mo', {
  601. minsize: sizeStr, maxsize: sizeStr,
  602. fence: true, stretchy: true, symmetric: true
  603. }, delim);
  604. var node = parser.create('node', 'TeXAtom', [mo], { texClass: mclass });
  605. parser.Push(node);
  606. };
  607. BaseMethods.BuildRel = function (parser, name) {
  608. var top = parser.ParseUpTo(name, '\\over');
  609. var bot = parser.ParseArg(name);
  610. var node = parser.create('node', 'munderover');
  611. NodeUtil_js_1.default.setChild(node, 0, bot);
  612. NodeUtil_js_1.default.setChild(node, 1, null);
  613. NodeUtil_js_1.default.setChild(node, 2, top);
  614. var atom = parser.create('node', 'TeXAtom', [node], { texClass: MmlNode_js_1.TEXCLASS.REL });
  615. parser.Push(atom);
  616. };
  617. BaseMethods.HBox = function (parser, name, style, font) {
  618. parser.PushAll(ParseUtil_js_1.default.internalMath(parser, parser.GetArgument(name), style, font));
  619. };
  620. BaseMethods.FBox = function (parser, name) {
  621. var internal = ParseUtil_js_1.default.internalMath(parser, parser.GetArgument(name));
  622. var node = parser.create('node', 'menclose', internal, { notation: 'box' });
  623. parser.Push(node);
  624. };
  625. BaseMethods.FrameBox = function (parser, name) {
  626. var width = parser.GetBrackets(name);
  627. var pos = parser.GetBrackets(name) || 'c';
  628. var mml = ParseUtil_js_1.default.internalMath(parser, parser.GetArgument(name));
  629. if (width) {
  630. mml = [parser.create('node', 'mpadded', mml, {
  631. width: width,
  632. 'data-align': (0, Options_js_1.lookup)(pos, { l: 'left', r: 'right' }, 'center')
  633. })];
  634. }
  635. var node = parser.create('node', 'TeXAtom', [parser.create('node', 'menclose', mml, { notation: 'box' })], { texClass: MmlNode_js_1.TEXCLASS.ORD });
  636. parser.Push(node);
  637. };
  638. BaseMethods.Not = function (parser, _name) {
  639. parser.Push(parser.itemFactory.create('not'));
  640. };
  641. BaseMethods.Dots = function (parser, _name) {
  642. var ldotsEntity = NodeUtil_js_1.default.createEntity('2026');
  643. var cdotsEntity = NodeUtil_js_1.default.createEntity('22EF');
  644. var ldots = parser.create('token', 'mo', { stretchy: false }, ldotsEntity);
  645. var cdots = parser.create('token', 'mo', { stretchy: false }, cdotsEntity);
  646. parser.Push(parser.itemFactory.create('dots').setProperties({
  647. ldots: ldots,
  648. cdots: cdots
  649. }));
  650. };
  651. BaseMethods.Matrix = function (parser, _name, open, close, align, spacing, vspacing, style, cases, numbered) {
  652. var c = parser.GetNext();
  653. if (c === '') {
  654. throw new TexError_js_1.default('MissingArgFor', 'Missing argument for %1', parser.currentCS);
  655. }
  656. if (c === '{') {
  657. parser.i++;
  658. }
  659. else {
  660. parser.string = c + '}' + parser.string.slice(parser.i + 1);
  661. parser.i = 0;
  662. }
  663. var array = parser.itemFactory.create('array').setProperty('requireClose', true);
  664. array.arraydef = {
  665. rowspacing: (vspacing || '4pt'),
  666. columnspacing: (spacing || '1em')
  667. };
  668. if (cases) {
  669. array.setProperty('isCases', true);
  670. }
  671. if (numbered) {
  672. array.setProperty('isNumbered', true);
  673. array.arraydef.side = numbered;
  674. }
  675. if (open || close) {
  676. array.setProperty('open', open);
  677. array.setProperty('close', close);
  678. }
  679. if (style === 'D') {
  680. array.arraydef.displaystyle = true;
  681. }
  682. if (align != null) {
  683. array.arraydef.columnalign = align;
  684. }
  685. parser.Push(array);
  686. };
  687. BaseMethods.Entry = function (parser, name) {
  688. parser.Push(parser.itemFactory.create('cell').setProperties({ isEntry: true, name: name }));
  689. var top = parser.stack.Top();
  690. var env = top.getProperty('casesEnv');
  691. var cases = top.getProperty('isCases');
  692. if (!cases && !env)
  693. return;
  694. var str = parser.string;
  695. var braces = 0, close = -1, i = parser.i, m = str.length;
  696. var end = (env ? new RegExp("^\\\\end\\s*\\{".concat(env.replace(/\*/, '\\*'), "\\}")) : null);
  697. while (i < m) {
  698. var c = str.charAt(i);
  699. if (c === '{') {
  700. braces++;
  701. i++;
  702. }
  703. else if (c === '}') {
  704. if (braces === 0) {
  705. m = 0;
  706. }
  707. else {
  708. braces--;
  709. if (braces === 0 && close < 0) {
  710. close = i - parser.i;
  711. }
  712. i++;
  713. }
  714. }
  715. else if (c === '&' && braces === 0) {
  716. throw new TexError_js_1.default('ExtraAlignTab', 'Extra alignment tab in \\cases text');
  717. }
  718. else if (c === '\\') {
  719. var rest = str.substr(i);
  720. if (rest.match(/^((\\cr)[^a-zA-Z]|\\\\)/) || (end && rest.match(end))) {
  721. m = 0;
  722. }
  723. else {
  724. i += 2;
  725. }
  726. }
  727. else {
  728. i++;
  729. }
  730. }
  731. var text = str.substr(parser.i, i - parser.i);
  732. if (!text.match(/^\s*\\text[^a-zA-Z]/) || close !== text.replace(/\s+$/, '').length - 1) {
  733. var internal = ParseUtil_js_1.default.internalMath(parser, ParseUtil_js_1.default.trimSpaces(text), 0);
  734. parser.PushAll(internal);
  735. parser.i = i;
  736. }
  737. };
  738. BaseMethods.Cr = function (parser, name) {
  739. parser.Push(parser.itemFactory.create('cell').setProperties({ isCR: true, name: name }));
  740. };
  741. BaseMethods.CrLaTeX = function (parser, name, nobrackets) {
  742. if (nobrackets === void 0) { nobrackets = false; }
  743. var n;
  744. if (!nobrackets) {
  745. if (parser.string.charAt(parser.i) === '*') {
  746. parser.i++;
  747. }
  748. if (parser.string.charAt(parser.i) === '[') {
  749. var dim = parser.GetBrackets(name, '');
  750. var _a = __read(ParseUtil_js_1.default.matchDimen(dim), 2), value = _a[0], unit = _a[1];
  751. if (dim && !value) {
  752. throw new TexError_js_1.default('BracketMustBeDimension', 'Bracket argument to %1 must be a dimension', parser.currentCS);
  753. }
  754. n = value + unit;
  755. }
  756. }
  757. parser.Push(parser.itemFactory.create('cell').setProperties({ isCR: true, name: name, linebreak: true }));
  758. var top = parser.stack.Top();
  759. var node;
  760. if (top instanceof sitem.ArrayItem) {
  761. if (n) {
  762. top.addRowSpacing(n);
  763. }
  764. }
  765. else {
  766. if (n) {
  767. node = parser.create('node', 'mspace', [], { depth: n });
  768. parser.Push(node);
  769. }
  770. node = parser.create('node', 'mspace', [], { linebreak: TexConstants_js_1.TexConstant.LineBreak.NEWLINE });
  771. parser.Push(node);
  772. }
  773. };
  774. BaseMethods.HLine = function (parser, _name, style) {
  775. if (style == null) {
  776. style = 'solid';
  777. }
  778. var top = parser.stack.Top();
  779. if (!(top instanceof sitem.ArrayItem) || top.Size()) {
  780. throw new TexError_js_1.default('Misplaced', 'Misplaced %1', parser.currentCS);
  781. }
  782. if (!top.table.length) {
  783. top.frame.push('top');
  784. }
  785. else {
  786. var lines = (top.arraydef['rowlines'] ? top.arraydef['rowlines'].split(/ /) : []);
  787. while (lines.length < top.table.length) {
  788. lines.push('none');
  789. }
  790. lines[top.table.length - 1] = style;
  791. top.arraydef['rowlines'] = lines.join(' ');
  792. }
  793. };
  794. BaseMethods.HFill = function (parser, _name) {
  795. var top = parser.stack.Top();
  796. if (top instanceof sitem.ArrayItem) {
  797. top.hfill.push(top.Size());
  798. }
  799. else {
  800. throw new TexError_js_1.default('UnsupportedHFill', 'Unsupported use of %1', parser.currentCS);
  801. }
  802. };
  803. BaseMethods.BeginEnd = function (parser, name) {
  804. var env = parser.GetArgument(name);
  805. if (env.match(/\\/i)) {
  806. throw new TexError_js_1.default('InvalidEnv', 'Invalid environment name \'%1\'', env);
  807. }
  808. var macro = parser.configuration.handlers.get('environment').lookup(env);
  809. if (macro && name === '\\end') {
  810. if (!macro.args[0]) {
  811. var mml = parser.itemFactory.create('end').setProperty('name', env);
  812. parser.Push(mml);
  813. return;
  814. }
  815. parser.stack.env['closing'] = env;
  816. }
  817. ParseUtil_js_1.default.checkMaxMacros(parser, false);
  818. parser.parse('environment', [parser, env]);
  819. };
  820. BaseMethods.Array = function (parser, begin, open, close, align, spacing, vspacing, style, raggedHeight) {
  821. if (!align) {
  822. align = parser.GetArgument('\\begin{' + begin.getName() + '}');
  823. }
  824. var lines = ('c' + align).replace(/[^clr|:]/g, '').replace(/[^|:]([|:])+/g, '$1');
  825. align = align.replace(/[^clr]/g, '').split('').join(' ');
  826. align = align.replace(/l/g, 'left').replace(/r/g, 'right').replace(/c/g, 'center');
  827. var array = parser.itemFactory.create('array');
  828. array.arraydef = {
  829. columnalign: align,
  830. columnspacing: (spacing || '1em'),
  831. rowspacing: (vspacing || '4pt')
  832. };
  833. if (lines.match(/[|:]/)) {
  834. if (lines.charAt(0).match(/[|:]/)) {
  835. array.frame.push('left');
  836. array.dashed = lines.charAt(0) === ':';
  837. }
  838. if (lines.charAt(lines.length - 1).match(/[|:]/)) {
  839. array.frame.push('right');
  840. }
  841. lines = lines.substr(1, lines.length - 2);
  842. array.arraydef.columnlines =
  843. lines.split('').join(' ').replace(/[^|: ]/g, 'none').replace(/\|/g, 'solid').replace(/:/g, 'dashed');
  844. }
  845. if (open) {
  846. array.setProperty('open', parser.convertDelimiter(open));
  847. }
  848. if (close) {
  849. array.setProperty('close', parser.convertDelimiter(close));
  850. }
  851. if ((style || '').charAt(1) === '\'') {
  852. array.arraydef['data-cramped'] = true;
  853. style = style.charAt(0);
  854. }
  855. if (style === 'D') {
  856. array.arraydef['displaystyle'] = true;
  857. }
  858. else if (style) {
  859. array.arraydef['displaystyle'] = false;
  860. }
  861. if (style === 'S') {
  862. array.arraydef['scriptlevel'] = 1;
  863. }
  864. if (raggedHeight) {
  865. array.arraydef['useHeight'] = false;
  866. }
  867. parser.Push(begin);
  868. return array;
  869. };
  870. BaseMethods.AlignedArray = function (parser, begin) {
  871. var align = parser.GetBrackets('\\begin{' + begin.getName() + '}');
  872. var item = BaseMethods.Array(parser, begin);
  873. return ParseUtil_js_1.default.setArrayAlign(item, align);
  874. };
  875. BaseMethods.Equation = function (parser, begin, numbered) {
  876. parser.Push(begin);
  877. ParseUtil_js_1.default.checkEqnEnv(parser);
  878. return parser.itemFactory.create('equation', numbered).
  879. setProperty('name', begin.getName());
  880. };
  881. BaseMethods.EqnArray = function (parser, begin, numbered, taggable, align, spacing) {
  882. parser.Push(begin);
  883. if (taggable) {
  884. ParseUtil_js_1.default.checkEqnEnv(parser);
  885. }
  886. align = align.replace(/[^clr]/g, '').split('').join(' ');
  887. align = align.replace(/l/g, 'left').replace(/r/g, 'right').replace(/c/g, 'center');
  888. var newItem = parser.itemFactory.create('eqnarray', begin.getName(), numbered, taggable, parser.stack.global);
  889. newItem.arraydef = {
  890. displaystyle: true,
  891. columnalign: align,
  892. columnspacing: (spacing || '1em'),
  893. rowspacing: '3pt',
  894. side: parser.options['tagSide'],
  895. minlabelspacing: parser.options['tagIndent']
  896. };
  897. return newItem;
  898. };
  899. BaseMethods.HandleNoTag = function (parser, _name) {
  900. parser.tags.notag();
  901. };
  902. BaseMethods.HandleLabel = function (parser, name) {
  903. var label = parser.GetArgument(name);
  904. if (label === '') {
  905. return;
  906. }
  907. if (!parser.tags.refUpdate) {
  908. if (parser.tags.label) {
  909. throw new TexError_js_1.default('MultipleCommand', 'Multiple %1', parser.currentCS);
  910. }
  911. parser.tags.label = label;
  912. if ((parser.tags.allLabels[label] || parser.tags.labels[label]) && !parser.options['ignoreDuplicateLabels']) {
  913. throw new TexError_js_1.default('MultipleLabel', 'Label \'%1\' multiply defined', label);
  914. }
  915. parser.tags.labels[label] = new Tags_js_1.Label();
  916. }
  917. };
  918. BaseMethods.HandleRef = function (parser, name, eqref) {
  919. var label = parser.GetArgument(name);
  920. var ref = parser.tags.allLabels[label] || parser.tags.labels[label];
  921. if (!ref) {
  922. if (!parser.tags.refUpdate) {
  923. parser.tags.redo = true;
  924. }
  925. ref = new Tags_js_1.Label();
  926. }
  927. var tag = ref.tag;
  928. if (eqref) {
  929. tag = parser.tags.formatTag(tag);
  930. }
  931. var node = parser.create('node', 'mrow', ParseUtil_js_1.default.internalMath(parser, tag), {
  932. href: parser.tags.formatUrl(ref.id, parser.options.baseURL), 'class': 'MathJax_ref'
  933. });
  934. parser.Push(node);
  935. };
  936. BaseMethods.Macro = function (parser, name, macro, argcount, def) {
  937. if (argcount) {
  938. var args = [];
  939. if (def != null) {
  940. var optional = parser.GetBrackets(name);
  941. args.push(optional == null ? def : optional);
  942. }
  943. for (var i = args.length; i < argcount; i++) {
  944. args.push(parser.GetArgument(name));
  945. }
  946. macro = ParseUtil_js_1.default.substituteArgs(parser, args, macro);
  947. }
  948. parser.string = ParseUtil_js_1.default.addArgs(parser, macro, parser.string.slice(parser.i));
  949. parser.i = 0;
  950. ParseUtil_js_1.default.checkMaxMacros(parser);
  951. };
  952. BaseMethods.MathChoice = function (parser, name) {
  953. var D = parser.ParseArg(name);
  954. var T = parser.ParseArg(name);
  955. var S = parser.ParseArg(name);
  956. var SS = parser.ParseArg(name);
  957. parser.Push(parser.create('node', 'MathChoice', [D, T, S, SS]));
  958. };
  959. exports.default = BaseMethods;
  960. //# sourceMappingURL=BaseMethods.js.map