class Dispatch(Atom): def __init__(self, rulelist, evaluation): self.src = Expression(SymbolList, *rulelist) self.rules = [ Rule(rule._leaves[0], rule._leaves[1]) for rule in rulelist ] self._leaves = None self._head = Symbol("Dispatch") def get_sort_key(self): return self.src.get_sort_key() def get_atom_name(self): return "System`Dispatch" def __repr__(self): return "dispatch" def atom_to_boxes(self, f, evaluation): leaves = self.src.format(evaluation, f.get_name()) return Expression( "RowBox", Expression(SymbolList, String("Dispatch"), String("["), leaves, String("]")), )
def apply_makeboxes(self, x, x0, data, nmin, nmax, den, form, evaluation): """MakeBoxes[SeriesData[x_, x0_, data_List, nmin_Integer, nmax_Integer, den_Integer], form_Symbol]""" form = form.get_name() if x0.is_zero: variable = x else: variable = Expression( SymbolPlus, x, Expression(SymbolTimes, IntegerMinusOne, x0) ) den = den.get_int_value() nmin = nmin.get_int_value() nmax = nmax.get_int_value() + 1 if den != 1: powers = [Rational(i, den) for i in range(nmin, nmax)] powers = powers + [Rational(nmax, den)] else: powers = [Integer(i) for i in range(nmin, nmax)] powers = powers + [Integer(nmax)] expansion = [] for i, leaf in enumerate(data.leaves): if leaf.is_numeric() and leaf.is_zero: continue if powers[i].is_zero: expansion.append(leaf) continue if powers[i] == Integer1: if leaf == Integer1: term = variable else: term = Expression(SymbolTimes, leaf, variable) else: if leaf == Integer1: term = Expression(SymbolPower, variable, powers[i]) else: term = Expression( SymbolTimes, leaf, Expression(SymbolPower, variable, powers[i]) ) expansion.append(term) expansion = expansion + [ Expression(SymbolPower, Expression("O", variable), powers[-1]) ] # expansion = [ex.format(form) for ex in expansion] expansion = Expression(SymbolPlus, *expansion) return expansion.format(evaluation, form)
def format_output(obj, expr, format=None): """ Handle unformatted output using the *specific* capabilities of mathics-django. evaluation.py format_output() from which this was derived is similar but it can't make use of a front-ends specific capabilities. """ def eval_boxes(result, fn, obj, **options): try: boxes = fn(evaluation=obj, **options) # print("XXX\n", boxes) except BoxError: boxes = None if not hasattr(obj, "seen_box_error"): obj.seen_box_error = True obj.message("General", "notboxes", Expression("FullForm", result).evaluate(obj)) return boxes if format is None: format = obj.format if isinstance(format, dict): return dict((k, obj.format_output(expr, f)) for k, f in format.items()) # For some expressions, we want formatting to be different. # In particular for FullForm output, we dont' want MathML, we want # plain-ol' text so we can cut and paste that. expr_type = expr.get_head_name() if expr_type in ("System`MathMLForm", "System`TeXForm"): # For these forms, we strip off the outer "Form" part format = FORM_TO_FORMAT[expr_type] leaves = expr.get_leaves() if len(leaves) == 1: expr = leaves[0] if expr_type in ("System`FullForm", "System`OutputForm"): result = Expression("StandardForm", expr).format(obj, expr_type) return str(result) elif expr_type == "System`Graphics": result = Expression("StandardForm", expr).format(obj, "System`MathMLForm") # This part was derived from and the same as evaluation.py format_output. use_quotes = get_settings_value(obj.definitions, "Settings`$QuotedStrings") if format == "text": result = expr.format(obj, "System`OutputForm") result = eval_boxes(result, result.boxes_to_text, obj) if use_quotes: result = '"' + result + '"' return result elif format == "xml": result = Expression("StandardForm", expr).format(obj, "System`MathMLForm") elif format == "tex": result = Expression("StandardForm", expr).format(obj, "System`TeXForm") elif format == "unformatted": # This part is custom to mathics-django: if str(expr) == "-Graph-" and hasattr(expr, "G"): return format_graph(expr.G) head = str(expr.get_head()) if head == "System`CompiledFunction": result = expr.format(obj, "System`OutputForm") elif head == "System`String": result = expr.format(obj, "System`InputForm") result = result.boxes_to_text(result) if not use_quotes: # Substring without the quotes result = result[1:-1] return result elif head == "System`Graphics3D": form_expr = Expression("StandardForm", expr) result = form_expr.format(obj, "System`StandardForm") return eval_boxes(result, result.boxes_to_js, obj) elif head == "System`Graphics": form_expr = Expression("StandardForm", expr) result = form_expr.format(obj, "System`StandardForm") return eval_boxes(result, result.boxes_to_svg, obj) else: result = Expression("StandardForm", expr).format(obj, "System`MathMLForm") else: raise ValueError if result is None: return f"Error in evaluating {expr}" return eval_boxes(result, result.boxes_to_text, obj)