Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions mathics/builtin/box/layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,13 @@ class RowBox(BoxExpression):

summary_text = "horizontal arrange of boxes"

def __init__(self, *args, **kwargs):
super().__init__(args, kwargs)

# TODO Describe why inside row and inside list are needed.
self.inside_row = False
self.inside_list = False

def __repr__(self):
return f"RowBox[{self.elements[0].__repr__()}]"

Expand Down
95 changes: 47 additions & 48 deletions mathics/format/render/mathml.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
"""
Mathics3 Graphics3D box rendering to MathML strings.
Mathics3 Box rendering to MathML strings.

MathML formatting is usually initiated in Mathics via MathMLForm[].
MathML rendering is usually initiated via MathMLForm[].
"""

import base64
Expand Down Expand Up @@ -169,12 +169,11 @@ def pane_box(box: PaneBox, **options):


def fractionbox(box: FractionBox, **options) -> str:
_options = box.box_options.copy()
_options.update(options)
options = _options
# Note: values set in `options` take precedence over `box_options`
child_options = {**options, **box.box_options}
return "<mfrac>%s %s</mfrac>" % (
lookup_conversion_method(box.num, "mathml")(box.num, **options),
lookup_conversion_method(box.den, "mathml")(box.den, **options),
lookup_conversion_method(box.num, "mathml")(box.num, **child_options),
lookup_conversion_method(box.den, "mathml")(box.den, **child_options),
)


Expand Down Expand Up @@ -204,15 +203,17 @@ def boxes_to_mathml(box, **options):
raise BoxConstructError
joined_attrs = " ".join(f'{name}="{value}"' for name, value in attrs.items())
result = f"<mtable {joined_attrs}>\n"
new_box_options = box_options.copy()
new_box_options["inside_list"] = True
for row in items:
result += "<mtr>"
if isinstance(row, tuple):
for item in row:
result += f"<mtd {joined_attrs}>{boxes_to_mathml(item, **new_box_options)}</mtd>"
item.inside_list = True
result += (
f"<mtd {joined_attrs}>{boxes_to_mathml(item, **options)}</mtd>"
)
else:
result += f"<mtd {joined_attrs} columnspan={num_fields}>{boxes_to_mathml(row, **new_box_options)}</mtd>"
row.inside_list = True
result += f"<mtd {joined_attrs} columnspan={num_fields}>{boxes_to_mathml(row, **options)}</mtd>"
result += "</mtr>\n"
result += "</mtable>"
# print(f"gridbox: {result}")
Expand All @@ -223,13 +224,14 @@ def boxes_to_mathml(box, **options):


def sqrtbox(box: SqrtBox, **options):
_options = box.box_options.copy()
_options.update(options)
options = _options
# Note: values set in `options` take precedence over `box_options`
child_options = {**options, **box.box_options}
if box.index:
return "<mroot> %s %s </mroot>" % (
lookup_conversion_method(box.radicand, "mathml")(box.radicand, **options),
lookup_conversion_method(box.index, "mathml")(box.index, **options),
lookup_conversion_method(box.radicand, "mathml")(
box.radicand, **child_options
),
lookup_conversion_method(box.index, "mathml")(box.index, **child_options),
)

return "<msqrt> %s </msqrt>" % lookup_conversion_method(box.radicand, "mathml")(
Expand All @@ -241,54 +243,52 @@ def sqrtbox(box: SqrtBox, **options):


def subscriptbox(box: SubscriptBox, **options):
_options = box.box_options.copy()
_options.update(options)
options = _options
# Note: values set in `options` take precedence over `box_options`
child_options = {**options, **box.box_options}
return "<msub>%s %s</msub>" % (
lookup_conversion_method(box.base, "mathml")(box.base, **options),
lookup_conversion_method(box.subindex, "mathml")(box.subindex, **options),
lookup_conversion_method(box.base, "mathml")(box.base, **child_options),
lookup_conversion_method(box.subindex, "mathml")(box.subindex, **child_options),
)


add_conversion_fn(SubscriptBox, subscriptbox)


def superscriptbox(box: SuperscriptBox, **options):
_options = box.box_options.copy()
_options.update(options)
options = _options
# Note: values set in `options` take precedence over `box_options`
child_options = {**options, **box.box_options}
return "<msup>%s %s</msup>" % (
lookup_conversion_method(box.base, "mathml")(box.base, **options),
lookup_conversion_method(box.superindex, "mathml")(box.superindex, **options),
lookup_conversion_method(box.base, "mathml")(box.base, **child_options),
lookup_conversion_method(box.superindex, "mathml")(
box.superindex, **child_options
),
)


add_conversion_fn(SuperscriptBox, superscriptbox)


def subsuperscriptbox(box: SubsuperscriptBox, **options):
_options = box.box_options.copy()
_options.update(options)
options = _options
options["inside_row"] = True
# Note: values set in `options` take precedence over `box_options`
child_options = {**box.box_options, **options}
box.base.inside_row = box.subindex.inside_row = box.superindex.inside_row = True
return "<msubsup>%s %s %s</msubsup>" % (
lookup_conversion_method(box.base, "mathml")(box.base, **options),
lookup_conversion_method(box.subindex, "mathml")(box.subindex, **options),
lookup_conversion_method(box.superindex, "mathml")(box.superindex, **options),
lookup_conversion_method(box.base, "mathml")(box.base, **child_options),
lookup_conversion_method(box.subindex, "mathml")(box.subindex, **child_options),
lookup_conversion_method(box.superindex, "mathml")(
box.superindex, **child_options
),
)


add_conversion_fn(SubsuperscriptBox, subsuperscriptbox)


def rowbox(box: RowBox, **options) -> str:
_options = box.box_options.copy()
_options.update(options)
options = _options
# Note: values set in `options` take precedence over `box_options`
child_options = {**box.box_options, **options}
result = []
inside_row = options.get("inside_row")
# inside_list = options.get('inside_list')
options = options.copy()
inside_row = box.inside_row

def is_list_interior(content):
if all(element.get_string_value() == "," for element in content[1::2]):
Expand All @@ -309,13 +309,14 @@ def is_list_interior(content):
if not inside_row and is_list_interior(box.items):
is_list_row = True

if is_list_row:
options["inside_list"] = True
else:
options["inside_row"] = True
nest_field = "inside_list" if is_list_row else "inside_row"

for element in box.items:
result.append(lookup_conversion_method(element, "mathml")(element, **options))
if hasattr(element, nest_field):
setattr(element, nest_field, True)
result.append(
lookup_conversion_method(element, "mathml")(element, **child_options)
)

# print(f"mrow: {result}")

Expand All @@ -326,10 +327,8 @@ def is_list_interior(content):


def stylebox(box: StyleBox, **options) -> str:
_options = box.box_options.copy()
_options.update(options)
options = _options
return lookup_conversion_method(box.boxes, "mathml")(box.boxes, **options)
child_options = {**options, **box.box_options}
return lookup_conversion_method(box.boxes, "mathml")(box.boxes, **child_options)


add_conversion_fn(StyleBox, stylebox)
Expand Down
Loading