22This module builts the 2D string associated to the OutputForm
33"""
44
5+ from typing import Any , Callable , Dict , List , Optional , Union
6+
57from mathics .core .atoms import (
68 Integer ,
79 Integer1 ,
4951#### Functions that convert Expressions in TextBlock
5052
5153
52- expr_to_2d_text_map = {}
54+ expr_to_2d_text_map : Dict [ str , Callable ] = {}
5355
5456
5557# This Exception if the expression should
@@ -67,16 +69,16 @@ class IsNot2DArray(Exception):
6769
6870
6971def expression_to_2d_text (
70- expr , evaluation : Evaluation , form = SymbolStandardForm , ** kwargs
72+ expr : BaseElement , evaluation : Evaluation , form = SymbolStandardForm , ** kwargs
7173):
7274 """
7375 Build a 2d text from an `Expression`
7476 """
7577 ## TODO: format the expression
76- format_expr = do_format (expr , evaluation , SymbolOutputForm )
78+ format_expr : Expression = do_format (expr , evaluation , SymbolOutputForm ) # type: ignore
7779
7880 # Strip HoldForm
79- while format_expr .has_form ("HoldForm" , 1 ):
81+ while format_expr .has_form ("HoldForm" , 1 ): # type: ignore
8082 format_expr = format_expr .elements [0 ]
8183
8284 lookup_name = format_expr .get_head ().get_lookup_name ()
@@ -92,12 +94,13 @@ def expression_to_2d_text(
9294
9395
9496def _default_expression_to_2d_text (
95- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
97+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
9698) -> TextBlock :
9799 """
98100 Default representation of a function
99101 """
100- head = expression_to_2d_text (expr .head , evaluation , form , ** kwargs )
102+ expr_head = expr .head
103+ head = expression_to_2d_text (expr_head , evaluation , form , ** kwargs )
101104 comma = TextBlock (", " )
102105 elements = [expression_to_2d_text (elem , evaluation ) for elem in expr .elements ]
103106 result = elements .pop (0 ) if elements else TextBlock (" " )
@@ -122,7 +125,7 @@ def _divide(num, den, evaluation, form, **kwargs):
122125
123126
124127def _strip_1_parm_expression_to_2d_text (
125- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
128+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
126129) -> TextBlock :
127130 if len (expr .elements ) != 1 :
128131 raise _WrongFormattedExpression
@@ -134,7 +137,7 @@ def _strip_1_parm_expression_to_2d_text(
134137
135138
136139def derivative_expression_to_2d_text (
137- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
140+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
138141) -> TextBlock :
139142 """Derivative operator"""
140143 head = expr .get_head ()
@@ -175,7 +178,7 @@ def derivative_expression_to_2d_text(
175178
176179
177180def divide_expression_to_2d_text (
178- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
181+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
179182) -> TextBlock :
180183 if len (expr .elements ) != 2 :
181184 raise _WrongFormattedExpression
@@ -187,7 +190,7 @@ def divide_expression_to_2d_text(
187190
188191
189192def graphics (
190- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
193+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
191194) -> TextBlock :
192195 return TextBlock ("-Graphics-" )
193196
@@ -196,7 +199,7 @@ def graphics(
196199
197200
198201def graphics3d (
199- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
202+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
200203) -> TextBlock :
201204 return TextBlock ("-Graphics3D-" )
202205
@@ -205,7 +208,7 @@ def graphics3d(
205208
206209
207210def grid_expression_to_2d_text (
208- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
211+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
209212) -> TextBlock :
210213 if len (expr .elements ) == 0 :
211214 raise IsNotGrid
@@ -235,15 +238,17 @@ def grid_expression_to_2d_text(
235238expr_to_2d_text_map ["System`Grid" ] = grid_expression_to_2d_text
236239
237240
238- def integer_expression_to_2d_text (n , evaluation , form , ** kwargs ):
241+ def integer_expression_to_2d_text (
242+ n : Integer , evaluation : Evaluation , form : Symbol , ** kwargs
243+ ):
239244 return TextBlock (str (n .value ))
240245
241246
242247expr_to_2d_text_map ["System`Integer" ] = integer_expression_to_2d_text
243248
244249
245250def integrate_expression_to_2d_text (
246- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
251+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
247252) -> TextBlock :
248253 elems = list (expr .elements )
249254 if len (elems ) > 2 or not kwargs .get ("2d" , False ):
@@ -271,7 +276,7 @@ def integrate_expression_to_2d_text(
271276
272277
273278def list_expression_to_2d_text (
274- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
279+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
275280) -> TextBlock :
276281 return (
277282 TextBlock ("{" )
@@ -288,18 +293,22 @@ def list_expression_to_2d_text(
288293expr_to_2d_text_map ["System`List" ] = list_expression_to_2d_text
289294
290295
291- def mathmlform_expression_to_2d_text (expr , evaluation , form , ** kwargs ) -> TextBlock :
296+ def mathmlform_expression_to_2d_text (
297+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
298+ ) -> TextBlock :
292299 # boxes = format_element(expr.elements[0], evaluation, form)
293300 boxes = Expression (
294301 Symbol ("System`MakeBoxes" ), expr .elements [0 ], SymbolStandardForm
295302 ).evaluate (evaluation )
296- return TextBlock (boxes .boxes_to_mathml ())
303+ return TextBlock (boxes .boxes_to_mathml ()) # type: ignore[union-attr]
297304
298305
299306expr_to_2d_text_map ["System`MathMLForm" ] = mathmlform_expression_to_2d_text
300307
301308
302- def matrixform_expression_to_2d_text (expr , evaluation , form , ** kwargs ) -> TextBlock :
309+ def matrixform_expression_to_2d_text (
310+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
311+ ) -> TextBlock :
303312 # return parenthesize(tableform_expression_to_2d_text(expr, evaluation, form, **kwargs))
304313 return tableform_expression_to_2d_text (expr , evaluation , form , ** kwargs )
305314
@@ -308,7 +317,7 @@ def matrixform_expression_to_2d_text(expr, evaluation, form, **kwargs) -> TextBl
308317
309318
310319def plus_expression_to_2d_text (
311- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
320+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
312321) -> TextBlock :
313322 elements = expr .elements
314323 result = TextBlock ("" )
@@ -351,7 +360,7 @@ def plus_expression_to_2d_text(
351360 ## TODO: handle complex numbers?
352361 else :
353362 elem_txt = expression_to_2d_text (elem , evaluation , form , ** kwargs )
354- if compare_precedence (elem , 310 ) < 0 :
363+ if ( compare_precedence (elem , 310 ) or - 1 ) < 0 :
355364 elem_txt = parenthesize (elem_txt )
356365 result = result + " + " + elem_txt
357366 elif i == 0 or (
@@ -372,7 +381,7 @@ def plus_expression_to_2d_text(
372381
373382
374383def power_expression_to_2d_text (
375- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
384+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
376385):
377386 if len (expr .elements ) != 2 :
378387 raise _WrongFormattedExpression
@@ -399,7 +408,7 @@ def power_expression_to_2d_text(
399408
400409
401410def pre_pos_infix_expression_to_2d_text (
402- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
411+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
403412) -> TextBlock :
404413 elements = expr .elements
405414 if not (0 <= len (elements ) <= 4 ):
@@ -520,7 +529,7 @@ def pre_pos_infix_expression_to_2d_text(
520529
521530
522531def precedenceform_expression_to_2d_text (
523- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
532+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
524533) -> TextBlock :
525534 if len (expr .elements ) == 2 :
526535 return expression_to_2d_text (expr .elements [0 ], evaluation , form , ** kwargs )
@@ -530,27 +539,29 @@ def precedenceform_expression_to_2d_text(
530539expr_to_2d_text_map ["System`PrecedenceForm" ] = precedenceform_expression_to_2d_text
531540
532541
533- def rational_expression_to_2d_text (n , evaluation , form , ** kwargs ):
542+ def rational_expression_to_2d_text (
543+ n : Union [Rational , Expression ], evaluation : Evaluation , form : Symbol , ** kwargs
544+ ):
534545 if n .has_form ("Rational" , 2 ):
535- num , den = n .elements
546+ num , den = n .elements # type: ignore[union-attr]
536547 else :
537- num , den = n .numerator (), n .denominator ()
548+ num , den = n .numerator (), n .denominator () # type: ignore[union-attr]
538549 return _divide (num , den , evaluation , form , ** kwargs )
539550
540551
541552expr_to_2d_text_map ["System`Rational" ] = rational_expression_to_2d_text
542553
543554
544- def real_expression_to_2d_text (n , evaluation , form , ** kwargs ):
545- str_n = n .make_boxes ("System`OutputForm" ).boxes_to_text ()
555+ def real_expression_to_2d_text (n : Real , evaluation : Evaluation , form : Symbol , ** kwargs ):
556+ str_n = n .make_boxes ("System`OutputForm" ).boxes_to_text () # type: ignore[attr-defined]
546557 return TextBlock (str (str_n ))
547558
548559
549560expr_to_2d_text_map ["System`Real" ] = real_expression_to_2d_text
550561
551562
552563def sqrt_expression_to_2d_text (
553- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
564+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
554565) -> TextBlock :
555566 if not 1 <= len (expr .elements ) <= 2 :
556567 raise _WrongFormattedExpression
@@ -568,7 +579,7 @@ def sqrt_expression_to_2d_text(
568579
569580
570581def subscript_expression_to_2d_text (
571- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
582+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
572583) -> TextBlock :
573584 if len (expr .elements ) != 2 :
574585 raise _WrongFormattedExpression
@@ -586,7 +597,7 @@ def subscript_expression_to_2d_text(
586597
587598
588599def subsuperscript_expression_to_2d_text (
589- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
600+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
590601) -> TextBlock :
591602 if len (expr .elements ) != 3 :
592603 raise _WrongFormattedExpression
@@ -604,7 +615,7 @@ def subsuperscript_expression_to_2d_text(
604615
605616
606617def string_expression_to_2d_text (
607- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
618+ expr : String , evaluation : Evaluation , form : Symbol , ** kwargs
608619) -> TextBlock :
609620 return TextBlock (expr .value )
610621
@@ -613,7 +624,7 @@ def string_expression_to_2d_text(
613624
614625
615626def stringform_expression_to_2d_text (
616- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
627+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
617628) -> TextBlock :
618629 strform = expr .elements [0 ]
619630 if not isinstance (strform , String ):
@@ -667,7 +678,7 @@ def stringform_expression_to_2d_text(
667678
668679
669680def superscript_expression_to_2d_text (
670- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
681+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
671682) -> TextBlock :
672683 elements = expr .elements
673684 if len (elements ) != 2 :
@@ -694,15 +705,17 @@ def superscript_expression_to_2d_text(
694705expr_to_2d_text_map ["System`Superscript" ] = superscript_expression_to_2d_text
695706
696707
697- def symbol_expression_to_2d_text (symb , evaluation , form , ** kwargs ):
708+ def symbol_expression_to_2d_text (
709+ symb : Symbol , evaluation : Evaluation , form : Symbol , ** kwargs
710+ ):
698711 return TextBlock (evaluation .definitions .shorten_name (symb .name ))
699712
700713
701714expr_to_2d_text_map ["System`Symbol" ] = symbol_expression_to_2d_text
702715
703716
704717def tableform_expression_to_2d_text (
705- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
718+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
706719) -> TextBlock :
707720 return grid_expression_to_2d_text (expr , evaluation , form )
708721
@@ -711,24 +724,24 @@ def tableform_expression_to_2d_text(
711724
712725
713726def texform_expression_to_2d_text (
714- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
727+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
715728) -> TextBlock :
716729 # boxes = format_element(expr.elements[0], evaluation, form)
717730 boxes = Expression (
718731 Symbol ("System`MakeBoxes" ), expr .elements [0 ], SymbolStandardForm
719732 ).evaluate (evaluation )
720- return TextBlock (boxes .boxes_to_tex ())
733+ return TextBlock (boxes .boxes_to_tex ()) # type: ignore
721734
722735
723736expr_to_2d_text_map ["System`TeXForm" ] = texform_expression_to_2d_text
724737
725738
726739def times_expression_to_2d_text (
727- expr : BaseElement , evaluation : Evaluation , form : Symbol , ** kwargs
740+ expr : Expression , evaluation : Evaluation , form : Symbol , ** kwargs
728741) -> TextBlock :
729742 elements = expr .elements
730- num = []
731- den = []
743+ num : List [ BaseElement ] = []
744+ den : List [ BaseElement ] = []
732745 # First, split factors with integer, negative powers:
733746 for elem in elements :
734747 if elem .has_form ("Power" , 2 ):
@@ -745,8 +758,9 @@ def times_expression_to_2d_text(
745758 den .append (elem .denominator ())
746759 continue
747760 elif elem .has_form ("Rational" , 2 ):
748- num .append (elem .elements [0 ])
749- den .append (elem .elements [1 ])
761+ elem_elements = elem .elements
762+ num .append (elem_elements [0 ])
763+ den .append (elem_elements [1 ])
750764 continue
751765
752766 num .append (elem )
@@ -768,7 +782,7 @@ def times_expression_to_2d_text(
768782 return expression_to_2d_text (num [0 ], evaluation , form , ** kwargs )
769783
770784 prefactor = 1
771- result = TextBlock ("" )
785+ result : TextBlock = TextBlock ("" )
772786 for i , elem in enumerate (num ):
773787 if elem is IntegerM1 :
774788 prefactor *= - 1
@@ -779,7 +793,7 @@ def times_expression_to_2d_text(
779793
780794 elem_txt = expression_to_2d_text (elem , evaluation , form , ** kwargs )
781795 if compare_precedence (elem , 400 ):
782- elem = parenthesize (elem_txt )
796+ elem_txt = parenthesize (elem_txt )
783797 if i == 0 :
784798 result = elem_txt
785799 else :
0 commit comments