passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,789 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Base Class for Character-Based Art
|
|
4
|
+
|
|
5
|
+
This is the common base class for
|
|
6
|
+
:class:`sage.typeset.ascii_art.AsciiArt` and
|
|
7
|
+
:class:`sage.typeset.unicode_art.UnicodeArt`. They implement simple
|
|
8
|
+
graphics by placing characters on a rectangular grid, in other words,
|
|
9
|
+
using monospace fonts. The difference is that one is restricted to
|
|
10
|
+
7-bit ascii, the other uses all unicode code points.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# ******************************************************************************
|
|
14
|
+
# Copyright (C) 2013 Jean-Baptiste Priez <jbp@kerios.fr>,
|
|
15
|
+
#
|
|
16
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
17
|
+
#
|
|
18
|
+
# This code is distributed in the hope that it will be useful,
|
|
19
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21
|
+
# General Public License for more details.
|
|
22
|
+
#
|
|
23
|
+
# The full text of the GPL is available at:
|
|
24
|
+
#
|
|
25
|
+
# https://www.gnu.org/licenses/
|
|
26
|
+
# ******************************************************************************
|
|
27
|
+
import sys
|
|
28
|
+
from sage.structure.sage_object import SageObject
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
################################################################################
|
|
32
|
+
# Global variable use to compute the maximal length allows for ascii art
|
|
33
|
+
# object.
|
|
34
|
+
MAX_WIDTH = None
|
|
35
|
+
################################################################################
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class CharacterArt(SageObject):
|
|
39
|
+
|
|
40
|
+
def __init__(self, lines=[], breakpoints=[], baseline=None):
|
|
41
|
+
r"""
|
|
42
|
+
Abstract base class for character art.
|
|
43
|
+
|
|
44
|
+
INPUT:
|
|
45
|
+
|
|
46
|
+
- ``lines`` -- the list of lines of the representation of the
|
|
47
|
+
character art object
|
|
48
|
+
|
|
49
|
+
- ``breakpoints`` -- the list of points where the representation can be
|
|
50
|
+
split
|
|
51
|
+
|
|
52
|
+
- ``baseline`` -- the reference line (from the bottom)
|
|
53
|
+
|
|
54
|
+
Instead of just integers, ``breakpoints`` may also contain tuples
|
|
55
|
+
consisting of an offset and the breakpoints of a nested substring at
|
|
56
|
+
that offset. This is used to prioritize the breakpoints, as line breaks
|
|
57
|
+
inside the substring will be avoided if possible.
|
|
58
|
+
|
|
59
|
+
EXAMPLES::
|
|
60
|
+
|
|
61
|
+
sage: i = var('i') # needs sage.symbolic
|
|
62
|
+
sage: ascii_art(sum(pi^i/factorial(i)*x^i, i, 0, oo)) # needs sage.symbolic
|
|
63
|
+
pi*x
|
|
64
|
+
e
|
|
65
|
+
|
|
66
|
+
TESTS::
|
|
67
|
+
|
|
68
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
69
|
+
sage: aao = AsciiArt()
|
|
70
|
+
sage: aao
|
|
71
|
+
<BLANKLINE>
|
|
72
|
+
sage: aa = AsciiArt([" * ", " * * ", "*****"]); aa
|
|
73
|
+
*
|
|
74
|
+
* *
|
|
75
|
+
*****
|
|
76
|
+
|
|
77
|
+
If there are nested breakpoints, line breaks are avoided inside the
|
|
78
|
+
nested elements (:issue:`29204`)::
|
|
79
|
+
|
|
80
|
+
sage: s = ascii_art([[1..5], [1..17], [1..25]])
|
|
81
|
+
sage: s._breakpoints
|
|
82
|
+
[(2, [4, 7, 10, 13]), 20, (21, [4, 7,..., 56]), 83, (84, [4, 7,..., 88])]
|
|
83
|
+
sage: str(s)
|
|
84
|
+
'[ [ 1, 2, 3, 4, 5 ],\n\n
|
|
85
|
+
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ],\n\n
|
|
86
|
+
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,\n\n
|
|
87
|
+
22, 23, 24, 25 ] ]'
|
|
88
|
+
"""
|
|
89
|
+
self._matrix = lines
|
|
90
|
+
self._breakpoints = breakpoints
|
|
91
|
+
self._baseline = baseline if baseline is not None else 0
|
|
92
|
+
|
|
93
|
+
self._h = len(lines)
|
|
94
|
+
self._l = 0 if not lines else max([len(line) for line in lines])
|
|
95
|
+
|
|
96
|
+
@classmethod
|
|
97
|
+
def empty(cls):
|
|
98
|
+
"""
|
|
99
|
+
Return the empty character art object.
|
|
100
|
+
|
|
101
|
+
EXAMPLES::
|
|
102
|
+
|
|
103
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
104
|
+
sage: AsciiArt.empty()
|
|
105
|
+
"""
|
|
106
|
+
empty_string = cls._string_type()
|
|
107
|
+
return cls([empty_string])
|
|
108
|
+
|
|
109
|
+
def __getitem__(self, key):
|
|
110
|
+
r"""
|
|
111
|
+
Return the line `key` of the ASCII art object.
|
|
112
|
+
|
|
113
|
+
TESTS::
|
|
114
|
+
|
|
115
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
116
|
+
sage: p5 = AsciiArt([" * ", " * * ", "*****"])
|
|
117
|
+
sage: p5[1]
|
|
118
|
+
' * * '
|
|
119
|
+
"""
|
|
120
|
+
return self._matrix[key]
|
|
121
|
+
|
|
122
|
+
def __iter__(self):
|
|
123
|
+
r"""
|
|
124
|
+
Iterator on all lines of the ASCII art object.
|
|
125
|
+
|
|
126
|
+
TESTS::
|
|
127
|
+
|
|
128
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
129
|
+
sage: p5 = AsciiArt([" * ", " * * ", "*****"])
|
|
130
|
+
sage: for line in p5:
|
|
131
|
+
....: print(line)
|
|
132
|
+
*
|
|
133
|
+
* *
|
|
134
|
+
*****
|
|
135
|
+
"""
|
|
136
|
+
yield from self._matrix
|
|
137
|
+
|
|
138
|
+
def _repr_(self):
|
|
139
|
+
r"""
|
|
140
|
+
TESTS::
|
|
141
|
+
|
|
142
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
143
|
+
sage: p5 = AsciiArt([" * ", " * * ", "*****"])
|
|
144
|
+
sage: repr(p5)
|
|
145
|
+
' * \n * * \n*****'
|
|
146
|
+
"""
|
|
147
|
+
# Compute the max length of a draw
|
|
148
|
+
global MAX_WIDTH
|
|
149
|
+
if MAX_WIDTH is not None:
|
|
150
|
+
hsize = MAX_WIDTH
|
|
151
|
+
else:
|
|
152
|
+
hsize = self._terminal_width()
|
|
153
|
+
# if the draw is larger than the max length, try to split it
|
|
154
|
+
if hsize <= self._l and self._breakpoints:
|
|
155
|
+
return self._split_repr_(hsize)
|
|
156
|
+
return '\n'.join(self._matrix)
|
|
157
|
+
|
|
158
|
+
def __format__(self, fmt):
|
|
159
|
+
r"""
|
|
160
|
+
Format ``self``.
|
|
161
|
+
|
|
162
|
+
EXAMPLES::
|
|
163
|
+
|
|
164
|
+
sage: M = matrix([[1,2],[3,4]]) # needs sage.modules
|
|
165
|
+
sage: format(ascii_art(M)) # needs sage.modules
|
|
166
|
+
'[1 2]\n[3 4]'
|
|
167
|
+
sage: format(unicode_art(M)) # needs sage.modules
|
|
168
|
+
'\u239b1 2\u239e\n\u239d3 4\u23a0'
|
|
169
|
+
"""
|
|
170
|
+
return format(self._string_type(self), fmt)
|
|
171
|
+
|
|
172
|
+
def get_baseline(self):
|
|
173
|
+
r"""
|
|
174
|
+
Return the line where the baseline is, for example::
|
|
175
|
+
|
|
176
|
+
5 4
|
|
177
|
+
14*x + 5*x
|
|
178
|
+
|
|
179
|
+
the baseline has at line `0` and ::
|
|
180
|
+
|
|
181
|
+
{ o }
|
|
182
|
+
{ \ : 4 }
|
|
183
|
+
{ o }
|
|
184
|
+
|
|
185
|
+
has at line `1`.
|
|
186
|
+
|
|
187
|
+
TESTS::
|
|
188
|
+
|
|
189
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
190
|
+
sage: aa = AsciiArt([" * ", " * * ", " * * ", "*******"], baseline=1);aa
|
|
191
|
+
*
|
|
192
|
+
* *
|
|
193
|
+
* *
|
|
194
|
+
*******
|
|
195
|
+
sage: aa.get_baseline()
|
|
196
|
+
1
|
|
197
|
+
sage: b = AsciiArt(["<-"])
|
|
198
|
+
sage: aa+b
|
|
199
|
+
*
|
|
200
|
+
* *
|
|
201
|
+
* * <-
|
|
202
|
+
*******
|
|
203
|
+
"""
|
|
204
|
+
return self._baseline
|
|
205
|
+
|
|
206
|
+
def get_breakpoints(self):
|
|
207
|
+
r"""
|
|
208
|
+
Return an iterator of breakpoints where the object can be split.
|
|
209
|
+
|
|
210
|
+
This method is deprecated, as its output is an implementation detail.
|
|
211
|
+
The mere breakpoints of a character art element do not reflect the best
|
|
212
|
+
way to split it if nested structures are involved. For details, see
|
|
213
|
+
:issue:`29204`.
|
|
214
|
+
|
|
215
|
+
For example the expression::
|
|
216
|
+
|
|
217
|
+
5 4
|
|
218
|
+
14x + 5x
|
|
219
|
+
|
|
220
|
+
can be split on position 4 (on the ``+``).
|
|
221
|
+
|
|
222
|
+
EXAMPLES::
|
|
223
|
+
|
|
224
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
225
|
+
sage: p3 = AsciiArt([" * ", "***"])
|
|
226
|
+
sage: p5 = AsciiArt([" * ", " * * ", "*****"])
|
|
227
|
+
sage: aa = ascii_art([p3, p5])
|
|
228
|
+
sage: aa.get_breakpoints()
|
|
229
|
+
doctest:...: DeprecationWarning: get_breakpoints() is deprecated
|
|
230
|
+
See https://github.com/sagemath/sage/issues/29204 for details.
|
|
231
|
+
[6]
|
|
232
|
+
"""
|
|
233
|
+
from sage.misc.superseded import deprecation
|
|
234
|
+
deprecation(29204, "get_breakpoints() is deprecated")
|
|
235
|
+
return self._breakpoints
|
|
236
|
+
|
|
237
|
+
def _isatty(self):
|
|
238
|
+
"""
|
|
239
|
+
Test whether ``stdout`` is a TTY.
|
|
240
|
+
|
|
241
|
+
If this test succeeds, you can assume that ``stdout`` is directly
|
|
242
|
+
connected to a terminal. Otherwise you should treat ``stdout`` as
|
|
243
|
+
being redirected to a file.
|
|
244
|
+
|
|
245
|
+
OUTPUT: boolean
|
|
246
|
+
|
|
247
|
+
EXAMPLES::
|
|
248
|
+
|
|
249
|
+
sage: from sage.typeset.ascii_art import empty_ascii_art
|
|
250
|
+
sage: empty_ascii_art._isatty()
|
|
251
|
+
False
|
|
252
|
+
"""
|
|
253
|
+
from sage.doctest import DOCTEST_MODE
|
|
254
|
+
if DOCTEST_MODE:
|
|
255
|
+
return False
|
|
256
|
+
try:
|
|
257
|
+
return sys.stdout.isatty()
|
|
258
|
+
except Exception:
|
|
259
|
+
# for fake ttys that might lead to an error
|
|
260
|
+
return False
|
|
261
|
+
|
|
262
|
+
def _terminal_width(self):
|
|
263
|
+
"""
|
|
264
|
+
Compute the width size of the terminal.
|
|
265
|
+
|
|
266
|
+
EXAMPLES::
|
|
267
|
+
|
|
268
|
+
sage: from sage.typeset.ascii_art import empty_ascii_art
|
|
269
|
+
sage: empty_ascii_art._terminal_width()
|
|
270
|
+
80
|
|
271
|
+
"""
|
|
272
|
+
if not self._isatty():
|
|
273
|
+
return 80
|
|
274
|
+
import fcntl
|
|
275
|
+
import termios
|
|
276
|
+
import struct
|
|
277
|
+
rc = fcntl.ioctl(0, termios.TIOCGWINSZ,
|
|
278
|
+
struct.pack('HHHH', sys.stdout.fileno(), 0, 0, 0))
|
|
279
|
+
h, w, hp, wp = struct.unpack('HHHH', rc)
|
|
280
|
+
return w
|
|
281
|
+
|
|
282
|
+
def _splitting_points(self, size, offset=0):
|
|
283
|
+
"""
|
|
284
|
+
Iterate over the breakpoints at which the representation can be split
|
|
285
|
+
to obtain chunks of length at most ``size``.
|
|
286
|
+
|
|
287
|
+
The final element returned will be the length of this object.
|
|
288
|
+
|
|
289
|
+
INPUT:
|
|
290
|
+
|
|
291
|
+
- ``size`` -- the maximum width of each chunk
|
|
292
|
+
|
|
293
|
+
- ``offset`` -- (default: ``0``) the first chunk has width at most
|
|
294
|
+
``size - offset``
|
|
295
|
+
|
|
296
|
+
TESTS::
|
|
297
|
+
|
|
298
|
+
sage: list(ascii_art(*(['a'] * 90))._splitting_points(20, offset=5))
|
|
299
|
+
[15, 35, 55, 75, 90]
|
|
300
|
+
"""
|
|
301
|
+
# We implement a custom iterator instead of repeatedly using
|
|
302
|
+
# itertools.chain to prepend elements in order to avoid quadratic time
|
|
303
|
+
# complexity
|
|
304
|
+
class PrependIterator:
|
|
305
|
+
"""
|
|
306
|
+
Iterator with support for prepending of elements.
|
|
307
|
+
"""
|
|
308
|
+
def __init__(self, stack):
|
|
309
|
+
self._stack = [iter(elems) for elems in stack]
|
|
310
|
+
|
|
311
|
+
def prepend(self, elems):
|
|
312
|
+
self._stack.append(iter(elems))
|
|
313
|
+
|
|
314
|
+
def __iter__(self):
|
|
315
|
+
return self
|
|
316
|
+
|
|
317
|
+
def __next__(self):
|
|
318
|
+
while self._stack:
|
|
319
|
+
try:
|
|
320
|
+
return next(self._stack[-1])
|
|
321
|
+
except StopIteration:
|
|
322
|
+
self._stack.pop()
|
|
323
|
+
raise StopIteration
|
|
324
|
+
|
|
325
|
+
idx = -offset
|
|
326
|
+
breakpoints = PrependIterator([[self._l], self._breakpoints])
|
|
327
|
+
bp = None
|
|
328
|
+
for bp_next in breakpoints:
|
|
329
|
+
if not isinstance(bp_next, tuple):
|
|
330
|
+
if bp_next - idx > size and bp is not None:
|
|
331
|
+
yield bp
|
|
332
|
+
idx = bp
|
|
333
|
+
bp = bp_next
|
|
334
|
+
else:
|
|
335
|
+
sub_offset, sub_breakpoints = bp_next
|
|
336
|
+
try:
|
|
337
|
+
bp_next = next(breakpoints)
|
|
338
|
+
except StopIteration:
|
|
339
|
+
bp_next = None
|
|
340
|
+
if bp_next is None or isinstance(bp_next, tuple):
|
|
341
|
+
raise ValueError("nested structure must be followed by a "
|
|
342
|
+
"regular breakpoint")
|
|
343
|
+
if bp_next - idx > size:
|
|
344
|
+
# substructure is too wide for the current line, so force a
|
|
345
|
+
# line break
|
|
346
|
+
if bp is not None:
|
|
347
|
+
yield bp
|
|
348
|
+
idx = bp
|
|
349
|
+
breakpoints.prepend([bp_next])
|
|
350
|
+
breakpoints.prepend(_shifted_breakpoints(sub_breakpoints,
|
|
351
|
+
sub_offset))
|
|
352
|
+
# at this point, we do not know the next breakpoint yet,
|
|
353
|
+
# but have already yielded bp, so discard it
|
|
354
|
+
bp = None
|
|
355
|
+
else:
|
|
356
|
+
bp = bp_next
|
|
357
|
+
if bp is not None:
|
|
358
|
+
yield bp
|
|
359
|
+
|
|
360
|
+
def _split_repr_(self, size):
|
|
361
|
+
r"""
|
|
362
|
+
Split the representation into chunks of length at most ``size``.
|
|
363
|
+
|
|
364
|
+
TESTS::
|
|
365
|
+
|
|
366
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
367
|
+
sage: p3 = AsciiArt([" * ", "***"])
|
|
368
|
+
sage: p5 = AsciiArt([" * ", " * * ", "*****"])
|
|
369
|
+
sage: aa = ascii_art([p3, p5])
|
|
370
|
+
sage: print(aa._split_repr_(10))
|
|
371
|
+
[
|
|
372
|
+
[ *
|
|
373
|
+
[ ***,
|
|
374
|
+
<BLANKLINE>
|
|
375
|
+
* ]
|
|
376
|
+
* * ]
|
|
377
|
+
***** ]
|
|
378
|
+
|
|
379
|
+
::
|
|
380
|
+
|
|
381
|
+
sage: ascii_art(['a' * k for k in (1..10)])._split_repr_(20)
|
|
382
|
+
'[ a, aa, aaa, aaaa,\n\n aaaaa, aaaaaa,\n\n aaaaaaa, aaaaaaaa,\n\n aaaaaaaaa,\n\n aaaaaaaaaa ]'
|
|
383
|
+
|
|
384
|
+
Check that wrapping happens exactly at the given size (:issue:`28527`)::
|
|
385
|
+
|
|
386
|
+
sage: len(ascii_art(*(['']*90), sep=',')._split_repr_(80).split('\n')[0])
|
|
387
|
+
80
|
|
388
|
+
"""
|
|
389
|
+
idx = 0
|
|
390
|
+
parts = []
|
|
391
|
+
for bp in self._splitting_points(size):
|
|
392
|
+
if bp - idx > size:
|
|
393
|
+
import warnings
|
|
394
|
+
warnings.warn("the console size is smaller than the pretty "
|
|
395
|
+
"representation of the object")
|
|
396
|
+
# Note that this is faster than calling self.split() repeatedly
|
|
397
|
+
parts.append('\n'.join(line[idx:bp] for line in self))
|
|
398
|
+
idx = bp
|
|
399
|
+
return '\n\n'.join(parts)
|
|
400
|
+
|
|
401
|
+
def split(self, pos):
|
|
402
|
+
r"""
|
|
403
|
+
Split the representation at the position ``pos``.
|
|
404
|
+
|
|
405
|
+
EXAMPLES::
|
|
406
|
+
|
|
407
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
408
|
+
sage: p3 = AsciiArt([" * ", "***"])
|
|
409
|
+
sage: p5 = AsciiArt([" * ", " * * ", "*****"])
|
|
410
|
+
sage: aa = ascii_art([p3, p5])
|
|
411
|
+
sage: a,b= aa.split(6)
|
|
412
|
+
sage: a
|
|
413
|
+
[
|
|
414
|
+
[ *
|
|
415
|
+
[ ***,
|
|
416
|
+
sage: b
|
|
417
|
+
* ]
|
|
418
|
+
* * ]
|
|
419
|
+
***** ]
|
|
420
|
+
"""
|
|
421
|
+
left = []
|
|
422
|
+
right = []
|
|
423
|
+
for line in self:
|
|
424
|
+
left.append(line[:pos])
|
|
425
|
+
right.append(line[pos:])
|
|
426
|
+
l_bp = []
|
|
427
|
+
r_bp = []
|
|
428
|
+
for bp in self._breakpoints:
|
|
429
|
+
if bp < pos:
|
|
430
|
+
l_bp.append(bp)
|
|
431
|
+
elif bp > pos:
|
|
432
|
+
r_bp.append(bp - pos)
|
|
433
|
+
return self.__class__(left, l_bp), self.__class__(right, r_bp)
|
|
434
|
+
|
|
435
|
+
@staticmethod
|
|
436
|
+
def _compute_new_baseline(obj1, obj2):
|
|
437
|
+
r"""
|
|
438
|
+
TESTS::
|
|
439
|
+
|
|
440
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
441
|
+
sage: l5 = AsciiArt(lines = ['|' for _ in range(5)], baseline = 2); l5
|
|
442
|
+
|
|
|
443
|
+
|
|
|
444
|
+
|
|
|
445
|
+
|
|
|
446
|
+
|
|
|
447
|
+
sage: l3 = AsciiArt(lines = ['|' for _ in range(3)], baseline = 1); l3
|
|
448
|
+
|
|
|
449
|
+
|
|
|
450
|
+
|
|
|
451
|
+
sage: AsciiArt._compute_new_baseline(l5, l3)
|
|
452
|
+
2
|
|
453
|
+
sage: l5 + l3
|
|
454
|
+
|
|
|
455
|
+
||
|
|
456
|
+
||
|
|
457
|
+
||
|
|
458
|
+
|
|
|
459
|
+
sage: l5._baseline = 0
|
|
460
|
+
sage: AsciiArt._compute_new_baseline(l5, l3)
|
|
461
|
+
1
|
|
462
|
+
sage: l5 + l3
|
|
463
|
+
|
|
|
464
|
+
|
|
|
465
|
+
|
|
|
466
|
+
||
|
|
467
|
+
||
|
|
468
|
+
|
|
|
469
|
+
sage: l5._baseline = 4
|
|
470
|
+
sage: AsciiArt._compute_new_baseline(l5, l3)
|
|
471
|
+
4
|
|
472
|
+
sage: l5 + l3
|
|
473
|
+
|
|
|
474
|
+
||
|
|
475
|
+
||
|
|
476
|
+
|
|
|
477
|
+
|
|
|
478
|
+
|
|
|
479
|
+
sage: l3._baseline = 0
|
|
480
|
+
sage: AsciiArt._compute_new_baseline(l3, l5)
|
|
481
|
+
4
|
|
482
|
+
sage: l3 + l5
|
|
483
|
+
|
|
|
484
|
+
|
|
|
485
|
+
||
|
|
486
|
+
|
|
|
487
|
+
|
|
|
488
|
+
|
|
|
489
|
+
|
|
|
490
|
+
"""
|
|
491
|
+
return max(obj1.get_baseline(), obj2.get_baseline())
|
|
492
|
+
|
|
493
|
+
@staticmethod
|
|
494
|
+
def _compute_new_h(obj1, obj2):
|
|
495
|
+
r"""
|
|
496
|
+
TESTS::
|
|
497
|
+
|
|
498
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
499
|
+
sage: l5 = AsciiArt(lines=['|' for _ in range(5)], baseline=2); l5
|
|
500
|
+
|
|
|
501
|
+
|
|
|
502
|
+
|
|
|
503
|
+
|
|
|
504
|
+
|
|
|
505
|
+
sage: l3 = AsciiArt(lines=['|' for _ in range(3)], baseline=1); l3
|
|
506
|
+
|
|
|
507
|
+
|
|
|
508
|
+
|
|
|
509
|
+
sage: AsciiArt._compute_new_h(l5, l3)
|
|
510
|
+
5
|
|
511
|
+
sage: l5 + l3
|
|
512
|
+
|
|
|
513
|
+
||
|
|
514
|
+
||
|
|
515
|
+
||
|
|
516
|
+
|
|
|
517
|
+
sage: l5._baseline = 0
|
|
518
|
+
sage: AsciiArt._compute_new_h(l5, l3)
|
|
519
|
+
6
|
|
520
|
+
sage: l5 + l3
|
|
521
|
+
|
|
|
522
|
+
|
|
|
523
|
+
|
|
|
524
|
+
||
|
|
525
|
+
||
|
|
526
|
+
|
|
|
527
|
+
sage: l5._baseline = 4
|
|
528
|
+
sage: AsciiArt._compute_new_h(l5, l3)
|
|
529
|
+
6
|
|
530
|
+
sage: l5 + l3
|
|
531
|
+
|
|
|
532
|
+
||
|
|
533
|
+
||
|
|
534
|
+
|
|
|
535
|
+
|
|
|
536
|
+
|
|
|
537
|
+
sage: l3._baseline = 0
|
|
538
|
+
sage: AsciiArt._compute_new_h(l3, l5)
|
|
539
|
+
7
|
|
540
|
+
sage: l3 + l5
|
|
541
|
+
|
|
|
542
|
+
|
|
|
543
|
+
||
|
|
544
|
+
|
|
|
545
|
+
|
|
|
546
|
+
|
|
|
547
|
+
|
|
|
548
|
+
"""
|
|
549
|
+
return max(
|
|
550
|
+
obj1.get_baseline(),
|
|
551
|
+
obj2.get_baseline()
|
|
552
|
+
) + max(
|
|
553
|
+
obj1._h - obj1.get_baseline(),
|
|
554
|
+
obj2._h - obj2.get_baseline()
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
def width(self):
|
|
558
|
+
r"""
|
|
559
|
+
Return the length (width) of the ASCII art object.
|
|
560
|
+
|
|
561
|
+
OUTPUT: integer; the number of characters in each line
|
|
562
|
+
|
|
563
|
+
TESTS::
|
|
564
|
+
|
|
565
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
566
|
+
sage: p3 = AsciiArt([" * ", "***"])
|
|
567
|
+
sage: len(p3), p3.width(), p3.height()
|
|
568
|
+
(3, 3, 2)
|
|
569
|
+
sage: p5 = AsciiArt([" * ", " * * ", "*****"])
|
|
570
|
+
sage: len(p5), p5.width(), p5.height()
|
|
571
|
+
(5, 5, 3)
|
|
572
|
+
"""
|
|
573
|
+
return self._l
|
|
574
|
+
|
|
575
|
+
__len__ = width
|
|
576
|
+
|
|
577
|
+
def height(self):
|
|
578
|
+
r"""
|
|
579
|
+
Return the height of the ASCII art object.
|
|
580
|
+
|
|
581
|
+
OUTPUT: integer; the number of lines
|
|
582
|
+
|
|
583
|
+
TESTS::
|
|
584
|
+
|
|
585
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
586
|
+
sage: p3 = AsciiArt([" * ", "***"])
|
|
587
|
+
sage: p3.height()
|
|
588
|
+
2
|
|
589
|
+
sage: p5 = AsciiArt([" * ", " * * ", "*****"])
|
|
590
|
+
sage: p5.height()
|
|
591
|
+
3
|
|
592
|
+
"""
|
|
593
|
+
return self._h
|
|
594
|
+
|
|
595
|
+
def __add__(self, Nelt):
|
|
596
|
+
r"""
|
|
597
|
+
Concatenate two character art objects.
|
|
598
|
+
|
|
599
|
+
By default, when two objects are concatenated, the new one will be
|
|
600
|
+
splittable between both.
|
|
601
|
+
|
|
602
|
+
If the baseline is defined, the concatenation is computed such that the
|
|
603
|
+
new baseline coincides with the olders.
|
|
604
|
+
|
|
605
|
+
For example, let `T` be a tree with its baseline ascii art
|
|
606
|
+
representation in the middle::
|
|
607
|
+
|
|
608
|
+
o
|
|
609
|
+
\
|
|
610
|
+
o
|
|
611
|
+
/ \
|
|
612
|
+
o o
|
|
613
|
+
|
|
614
|
+
and let `M` be a matrix with its baseline ascii art representation at
|
|
615
|
+
the middle two::
|
|
616
|
+
|
|
617
|
+
[1 2 3]
|
|
618
|
+
[4 5 6]
|
|
619
|
+
[7 8 9]
|
|
620
|
+
|
|
621
|
+
then the concatenation of both will give::
|
|
622
|
+
|
|
623
|
+
o
|
|
624
|
+
\ [1 2 3]
|
|
625
|
+
o [4 5 6]
|
|
626
|
+
/ \ [7 8 9]
|
|
627
|
+
o o
|
|
628
|
+
|
|
629
|
+
Since :issue:`28527`, the baseline must always be a number.
|
|
630
|
+
|
|
631
|
+
TESTS::
|
|
632
|
+
|
|
633
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
634
|
+
sage: l5 = AsciiArt(lines=['|' for _ in range(5)], baseline=2); l5
|
|
635
|
+
|
|
|
636
|
+
|
|
|
637
|
+
|
|
|
638
|
+
|
|
|
639
|
+
|
|
|
640
|
+
sage: l3 = AsciiArt(lines=['|' for _ in range(3)], baseline=1); l3
|
|
641
|
+
|
|
|
642
|
+
|
|
|
643
|
+
|
|
|
644
|
+
sage: l3 + l5
|
|
645
|
+
|
|
|
646
|
+
||
|
|
647
|
+
||
|
|
648
|
+
||
|
|
649
|
+
|
|
|
650
|
+
sage: l5 + l3
|
|
651
|
+
|
|
|
652
|
+
||
|
|
653
|
+
||
|
|
654
|
+
||
|
|
655
|
+
|
|
|
656
|
+
sage: l5._baseline = 0
|
|
657
|
+
sage: l5 + l3
|
|
658
|
+
|
|
|
659
|
+
|
|
|
660
|
+
|
|
|
661
|
+
||
|
|
662
|
+
||
|
|
663
|
+
|
|
|
664
|
+
sage: l5._baseline = 4
|
|
665
|
+
sage: l5 + l3
|
|
666
|
+
|
|
|
667
|
+
||
|
|
668
|
+
||
|
|
669
|
+
|
|
|
670
|
+
|
|
|
671
|
+
|
|
|
672
|
+
sage: l3._baseline = 0
|
|
673
|
+
sage: l3 + l5
|
|
674
|
+
|
|
|
675
|
+
|
|
|
676
|
+
||
|
|
677
|
+
|
|
|
678
|
+
|
|
|
679
|
+
|
|
|
680
|
+
|
|
|
681
|
+
"""
|
|
682
|
+
new_matrix = []
|
|
683
|
+
new_h = self.__class__._compute_new_h(self, Nelt)
|
|
684
|
+
new_baseline = self.__class__._compute_new_baseline(self, Nelt)
|
|
685
|
+
|
|
686
|
+
if self._baseline is not None and Nelt._baseline is not None:
|
|
687
|
+
# left treatment
|
|
688
|
+
new_matrix.extend(line + " " * (self._l - len(line))
|
|
689
|
+
for line in self._matrix)
|
|
690
|
+
|
|
691
|
+
if new_h > self._h:
|
|
692
|
+
# | new_h > self._h
|
|
693
|
+
# | new_baseline > self._baseline
|
|
694
|
+
# ||<-- baseline number of white lines at the bottom
|
|
695
|
+
# | } :: Nelt._baseline - self._baseline
|
|
696
|
+
# | }
|
|
697
|
+
if new_baseline > self._baseline:
|
|
698
|
+
l_space = " " * self._l
|
|
699
|
+
new_matrix.extend(l_space
|
|
700
|
+
for k in range(new_baseline - self._baseline))
|
|
701
|
+
# | } new_h > self._h
|
|
702
|
+
# | } new_h - new_baseline > self._h - self._baseline
|
|
703
|
+
# ||<-- baseline number of white lines at the top
|
|
704
|
+
# || :: new_h - new_baseline - self._h + self._baseline
|
|
705
|
+
# ||
|
|
706
|
+
# |
|
|
707
|
+
# |
|
|
708
|
+
if new_h - new_baseline > self._h - self._baseline:
|
|
709
|
+
for _ in range((new_h - new_baseline) - (self._h - self._baseline)):
|
|
710
|
+
new_matrix.insert(0, " " * self._l)
|
|
711
|
+
|
|
712
|
+
# right treatment
|
|
713
|
+
i = 0
|
|
714
|
+
if new_h > Nelt._h:
|
|
715
|
+
# | } new_h > Nelt._h
|
|
716
|
+
# | } new_h - new_baseline > Nelt._h - self._baseline
|
|
717
|
+
# ||<-- baseline number of white lines at the top
|
|
718
|
+
# || :: new_h - new_baseline - Nelt._h + Nelt._baseline
|
|
719
|
+
# ||
|
|
720
|
+
# ||
|
|
721
|
+
# |
|
|
722
|
+
i = max(new_h - new_baseline - Nelt._h + Nelt._baseline, 0)
|
|
723
|
+
for j in range(Nelt._h):
|
|
724
|
+
new_matrix[i + j] += Nelt._matrix[j]
|
|
725
|
+
else:
|
|
726
|
+
new_matrix.extend(line + " " * (self._l - len(line))
|
|
727
|
+
for line in self._matrix)
|
|
728
|
+
for i, line_i in enumerate(Nelt._matrix):
|
|
729
|
+
if i == len(new_matrix):
|
|
730
|
+
new_matrix.append(" " * self._l + line_i)
|
|
731
|
+
else:
|
|
732
|
+
new_matrix[i] += line_i
|
|
733
|
+
|
|
734
|
+
# breakpoint
|
|
735
|
+
new_breakpoints = list(self._breakpoints)
|
|
736
|
+
if self._l and Nelt._l:
|
|
737
|
+
new_breakpoints.append(self._l)
|
|
738
|
+
new_breakpoints.extend(_shifted_breakpoints(Nelt._breakpoints,
|
|
739
|
+
self._l))
|
|
740
|
+
return self.__class__(
|
|
741
|
+
lines=new_matrix,
|
|
742
|
+
breakpoints=new_breakpoints,
|
|
743
|
+
baseline=new_baseline,
|
|
744
|
+
)
|
|
745
|
+
|
|
746
|
+
def __mul__(self, Nelt):
|
|
747
|
+
r"""
|
|
748
|
+
Stack two character art objects vertically.
|
|
749
|
+
|
|
750
|
+
TESTS::
|
|
751
|
+
|
|
752
|
+
sage: from sage.typeset.ascii_art import AsciiArt
|
|
753
|
+
sage: cub = AsciiArt(lines=['***' for _ in range(3)]); cub
|
|
754
|
+
***
|
|
755
|
+
***
|
|
756
|
+
***
|
|
757
|
+
sage: pyr = AsciiArt(lines=[' ^ ', '/ \\', '---']); pyr
|
|
758
|
+
^
|
|
759
|
+
/ \
|
|
760
|
+
---
|
|
761
|
+
sage: cub * pyr
|
|
762
|
+
***
|
|
763
|
+
***
|
|
764
|
+
***
|
|
765
|
+
^
|
|
766
|
+
/ \
|
|
767
|
+
---
|
|
768
|
+
"""
|
|
769
|
+
new_repr = self.__class__(self._matrix + Nelt._matrix)
|
|
770
|
+
return new_repr
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
def _shifted_breakpoints(breakpoints, offset):
|
|
774
|
+
"""
|
|
775
|
+
Return an iterator that shifts all breakpoints by an offset.
|
|
776
|
+
|
|
777
|
+
TESTS::
|
|
778
|
+
|
|
779
|
+
sage: b = ascii_art([[1, 2, 3], [4, 5, 6]])._breakpoints; b
|
|
780
|
+
[(2, [4, 7]), 14, (15, [4, 7])]
|
|
781
|
+
sage: from sage.typeset.character_art import _shifted_breakpoints
|
|
782
|
+
sage: list(_shifted_breakpoints(b, 10))
|
|
783
|
+
[(12, [4, 7]), 24, (25, [4, 7])]
|
|
784
|
+
"""
|
|
785
|
+
for bp in breakpoints:
|
|
786
|
+
if isinstance(bp, tuple):
|
|
787
|
+
yield bp[0] + offset, bp[1]
|
|
788
|
+
else:
|
|
789
|
+
yield bp + offset
|