"use strict"; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.clearDocument = exports.saveDocument = exports.makeBsprAttributes = exports.removeProperty = exports.getProperty = exports.setProperty = exports.balanceRules = void 0; var NodeUtil_js_1 = __importDefault(require("../NodeUtil.js")); var ParseUtil_js_1 = __importDefault(require("../ParseUtil.js")); var doc = null; var item = null; var getBBox = function (node) { item.root = node; var width = doc.outputJax.getBBox(item, doc).w; return width; }; var getRule = function (node) { var i = 0; while (node && !NodeUtil_js_1.default.isType(node, 'mtable')) { if (NodeUtil_js_1.default.isType(node, 'text')) { return null; } if (NodeUtil_js_1.default.isType(node, 'mrow')) { node = node.childNodes[0]; i = 0; continue; } node = node.parent.childNodes[i]; i++; } return node; }; var getPremises = function (rule, direction) { return rule.childNodes[direction === 'up' ? 1 : 0].childNodes[0]. childNodes[0].childNodes[0].childNodes[0]; }; var getPremise = function (premises, n) { return premises.childNodes[n].childNodes[0].childNodes[0]; }; var firstPremise = function (premises) { return getPremise(premises, 0); }; var lastPremise = function (premises) { return getPremise(premises, premises.childNodes.length - 1); }; var getConclusion = function (rule, direction) { return rule.childNodes[direction === 'up' ? 0 : 1].childNodes[0].childNodes[0].childNodes[0]; }; var getColumn = function (inf) { while (inf && !NodeUtil_js_1.default.isType(inf, 'mtd')) { inf = inf.parent; } return inf; }; var nextSibling = function (inf) { return inf.parent.childNodes[inf.parent.childNodes.indexOf(inf) + 1]; }; var previousSibling = function (inf) { return inf.parent.childNodes[inf.parent.childNodes.indexOf(inf) - 1]; }; var getParentInf = function (inf) { while (inf && (0, exports.getProperty)(inf, 'inference') == null) { inf = inf.parent; } return inf; }; var getSpaces = function (inf, rule, right) { if (right === void 0) { right = false; } var result = 0; if (inf === rule) { return result; } if (inf !== rule.parent) { var children_1 = inf.childNodes; var index_1 = right ? children_1.length - 1 : 0; if (NodeUtil_js_1.default.isType(children_1[index_1], 'mspace')) { result += getBBox(children_1[index_1]); } inf = rule.parent; } if (inf === rule) { return result; } var children = inf.childNodes; var index = right ? children.length - 1 : 0; if (children[index] !== rule) { result += getBBox(children[index]); } return result; }; var adjustValue = function (inf, right) { if (right === void 0) { right = false; } var rule = getRule(inf); var conc = getConclusion(rule, (0, exports.getProperty)(rule, 'inferenceRule')); var w = getSpaces(inf, rule, right); var x = getBBox(rule); var y = getBBox(conc); return w + ((x - y) / 2); }; var addSpace = function (config, inf, space, right) { if (right === void 0) { right = false; } if ((0, exports.getProperty)(inf, 'inferenceRule') || (0, exports.getProperty)(inf, 'labelledRule')) { var mrow = config.nodeFactory.create('node', 'mrow'); inf.parent.replaceChild(mrow, inf); mrow.setChildren([inf]); moveProperties(inf, mrow); inf = mrow; } var index = right ? inf.childNodes.length - 1 : 0; var mspace = inf.childNodes[index]; if (NodeUtil_js_1.default.isType(mspace, 'mspace')) { NodeUtil_js_1.default.setAttribute(mspace, 'width', ParseUtil_js_1.default.Em(ParseUtil_js_1.default.dimen2em(NodeUtil_js_1.default.getAttribute(mspace, 'width')) + space)); return; } mspace = config.nodeFactory.create('node', 'mspace', [], { width: ParseUtil_js_1.default.Em(space) }); if (right) { inf.appendChild(mspace); return; } mspace.parent = inf; inf.childNodes.unshift(mspace); }; var moveProperties = function (src, dest) { var props = ['inference', 'proof', 'maxAdjust', 'labelledRule']; props.forEach(function (x) { var value = (0, exports.getProperty)(src, x); if (value != null) { (0, exports.setProperty)(dest, x, value); (0, exports.removeProperty)(src, x); } }); }; var adjustSequents = function (config) { var sequents = config.nodeLists['sequent']; if (!sequents) { return; } for (var i = sequents.length - 1, seq = void 0; seq = sequents[i]; i--) { if ((0, exports.getProperty)(seq, 'sequentProcessed')) { (0, exports.removeProperty)(seq, 'sequentProcessed'); continue; } var collect = []; var inf = getParentInf(seq); if ((0, exports.getProperty)(inf, 'inference') !== 1) { continue; } collect.push(seq); while ((0, exports.getProperty)(inf, 'inference') === 1) { inf = getRule(inf); var premise = firstPremise(getPremises(inf, (0, exports.getProperty)(inf, 'inferenceRule'))); var sequent = ((0, exports.getProperty)(premise, 'inferenceRule')) ? getConclusion(premise, (0, exports.getProperty)(premise, 'inferenceRule')) : premise; if ((0, exports.getProperty)(sequent, 'sequent')) { seq = sequent.childNodes[0]; collect.push(seq); (0, exports.setProperty)(seq, 'sequentProcessed', true); } inf = premise; } adjustSequentPairwise(config, collect); } }; var addSequentSpace = function (config, sequent, position, direction, width) { var mspace = config.nodeFactory.create('node', 'mspace', [], { width: ParseUtil_js_1.default.Em(width) }); if (direction === 'left') { var row = sequent.childNodes[position].childNodes[0]; mspace.parent = row; row.childNodes.unshift(mspace); } else { sequent.childNodes[position].appendChild(mspace); } (0, exports.setProperty)(sequent.parent, 'sequentAdjust_' + direction, width); }; var adjustSequentPairwise = function (config, sequents) { var top = sequents.pop(); while (sequents.length) { var bottom = sequents.pop(); var _a = __read(compareSequents(top, bottom), 2), left = _a[0], right = _a[1]; if ((0, exports.getProperty)(top.parent, 'axiom')) { addSequentSpace(config, left < 0 ? top : bottom, 0, 'left', Math.abs(left)); addSequentSpace(config, right < 0 ? top : bottom, 2, 'right', Math.abs(right)); } top = bottom; } }; var compareSequents = function (top, bottom) { var tr = getBBox(top.childNodes[2]); var br = getBBox(bottom.childNodes[2]); var tl = getBBox(top.childNodes[0]); var bl = getBBox(bottom.childNodes[0]); var dl = tl - bl; var dr = tr - br; return [dl, dr]; }; var balanceRules = function (arg) { var e_1, _a; item = new arg.document.options.MathItem('', null, arg.math.display); var config = arg.data; adjustSequents(config); var inferences = config.nodeLists['inference'] || []; try { for (var inferences_1 = __values(inferences), inferences_1_1 = inferences_1.next(); !inferences_1_1.done; inferences_1_1 = inferences_1.next()) { var inf = inferences_1_1.value; var isProof = (0, exports.getProperty)(inf, 'proof'); var rule = getRule(inf); var premises = getPremises(rule, (0, exports.getProperty)(rule, 'inferenceRule')); var premiseF = firstPremise(premises); if ((0, exports.getProperty)(premiseF, 'inference')) { var adjust_1 = adjustValue(premiseF); if (adjust_1) { addSpace(config, premiseF, -adjust_1); var w_1 = getSpaces(inf, rule, false); addSpace(config, inf, adjust_1 - w_1); } } var premiseL = lastPremise(premises); if ((0, exports.getProperty)(premiseL, 'inference') == null) { continue; } var adjust = adjustValue(premiseL, true); addSpace(config, premiseL, -adjust, true); var w = getSpaces(inf, rule, true); var maxAdjust = (0, exports.getProperty)(inf, 'maxAdjust'); if (maxAdjust != null) { adjust = Math.max(adjust, maxAdjust); } var column = void 0; if (isProof || !(column = getColumn(inf))) { addSpace(config, (0, exports.getProperty)(inf, 'proof') ? inf : inf.parent, adjust - w, true); continue; } var sibling = nextSibling(column); if (sibling) { var pos = config.nodeFactory.create('node', 'mspace', [], { width: adjust - w + 'em' }); sibling.appendChild(pos); inf.removeProperty('maxAdjust'); continue; } var parentRule = getParentInf(column); if (!parentRule) { continue; } adjust = (0, exports.getProperty)(parentRule, 'maxAdjust') ? Math.max((0, exports.getProperty)(parentRule, 'maxAdjust'), adjust) : adjust; (0, exports.setProperty)(parentRule, 'maxAdjust', adjust); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (inferences_1_1 && !inferences_1_1.done && (_a = inferences_1.return)) _a.call(inferences_1); } finally { if (e_1) throw e_1.error; } } }; exports.balanceRules = balanceRules; var property_prefix = 'bspr_'; var blacklistedProperties = (_a = {}, _a[property_prefix + 'maxAdjust'] = true, _a); var setProperty = function (node, property, value) { NodeUtil_js_1.default.setProperty(node, property_prefix + property, value); }; exports.setProperty = setProperty; var getProperty = function (node, property) { return NodeUtil_js_1.default.getProperty(node, property_prefix + property); }; exports.getProperty = getProperty; var removeProperty = function (node, property) { node.removeProperty(property_prefix + property); }; exports.removeProperty = removeProperty; var makeBsprAttributes = function (arg) { arg.data.root.walkTree(function (mml, _data) { var attr = []; mml.getPropertyNames().forEach(function (x) { if (!blacklistedProperties[x] && x.match(RegExp('^' + property_prefix))) { attr.push(x + ':' + mml.getProperty(x)); } }); if (attr.length) { NodeUtil_js_1.default.setAttribute(mml, 'semantics', attr.join(';')); } }); }; exports.makeBsprAttributes = makeBsprAttributes; var saveDocument = function (arg) { doc = arg.document; if (!('getBBox' in doc.outputJax)) { throw Error('The bussproofs extension requires an output jax with a getBBox() method'); } }; exports.saveDocument = saveDocument; var clearDocument = function (_arg) { doc = null; }; exports.clearDocument = clearDocument; //# sourceMappingURL=BussproofsUtil.js.map