#!/usr/bin/env python
# encoding: utf-8

from .render import Render
from .fraction import Fraction
from .generic import first_elem, last_elem

__all__ = ['post2in_fix', 'tex_render', 'txt_render']

# ------------------------
# A infix to postfix list convertor

p2i_infix = {"+": "+", "-": "-", "*": "*", "/" : "/", ":": ":", "^":"^"}
p2i_postfix = {}
p2i_other = {"(": "(", ")": ")"}

post2in_fix = Render(p2i_infix, p2i_postfix, p2i_other, join = False)

# ------------------------
# A console render

def txtMult(op1,op2):
    """ Tex render for *
    Cases where \\times won't be displayed
        * nbr  letter 
        * nbr  (
        * )(
    """
    first_nbr = type(op1) in [int, Fraction]
    seg_letter = type(op2) == str and op2.isalpha()
    first_par = (first_elem(op2) == "(")
    seg_par = (last_elem(op1) == ")")

    if (first_nbr and (seg_letter or seg_par)) \
            or (first_par and seg_par):
        return [op1, op2]
    else:
        return [op1, "*", op2]

txt_infix = {"+": "+", "-": "-", "*": txtMult, "/" : "/", ":":":", "^":"^"}
txt_postfix = {}
txt_other = {"(": "(", ")": ")"}

txt_render = Render(txt_infix, txt_postfix, txt_other)

# ------------------------
# A latex render

def texSlash(op1, op2):
    """ Tex render for / """
    if not Render.isNumerande(op1) and op1[0] == "(" and op1[-1] == ")":
        op1 = op1[1:-1]
    if not Render.isNumerande(op2) and op2[0] == "(" and op2[-1] == ")":
        op2 = op2[1:-1]
    return ["\\frac{" , op1 , "}{" , op2 , "}"]

def texFrac(frac):
    """ Tex render for Fractions"""
    return ["\\frac{" , str(frac._num) , "}{" , str(frac._denom) , "}"]

def texMult(op1,op2):
    """ Tex render for *
    Cases where \\times won't be displayed
        * nbr  letter 
        * nbr  (
        * )(
    """
    first_nbr = type(op1) in [int, Fraction]
    seg_letter = type(op2) == str and op2.isalpha()
    first_par = (first_elem(op2) == "(")
    seg_par = (last_elem(op1) == ")")

    if (first_nbr and (seg_letter or seg_par)) \
            or (first_par and seg_par):
        return [op1, op2]
    else:
        return [op1, "\\times", op2]

tex_infix = {"+": " + ", "-": " - ", "*": texMult , ":": ":", "^":"^"}
tex_postfix = {"/": texSlash}
tex_other = {"(": "(", ")": ")"}
tex_type_render = {str:str, int: str, Fraction: texFrac}

tex_render = Render(tex_infix, tex_postfix, tex_other, type_render = tex_type_render)



if __name__ == '__main__':
    #exp = [2, 5, '^', 1, '-', 3, 4, '*', ':']
    #print(txt_render(exp))
    #exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, 5, '/', ':']
    exp = [2, -3, "*"]
    print(tex_render(exp))
    #exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, '+']
    #print(post2in_fix(exp))




# -----------------------------
# Reglages pour 'vim'
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
# cursor: 16 del 

#!/usr/bin/env python
# encoding: utf-8

from .render import Render
from .fraction import Fraction
from .generic import first_elem, last_elem

__all__ = ['post2in_fix', 'tex_render', 'txt_render']

# ------------------------
# A infix to postfix list convertor

p2i_infix = {"+": "+", "-": "-", "*": "*", "/" : "/", ":": ":", "^":"^"}
p2i_postfix = {}
p2i_other = {"(": "(", ")": ")"}

post2in_fix = Render(p2i_infix, p2i_postfix, p2i_other, join = False)

# ------------------------
# A console render

def txtMult(op1,op2):
    """ Tex render for *
    Cases where \\times won't be displayed
        * nbr  letter 
        * nbr  (
        * )(
    """
    first_nbr = type(op1) in [int, Fraction]
    seg_letter = type(op2) == str and op2.isalpha()
    first_par = (first_elem(op2) == "(")
    seg_par = (last_elem(op1) == ")")

    if (first_nbr and (seg_letter or seg_par)) \
            or (first_par and seg_par):
        return [op1, op2]
    else:
        return [op1, "*", op2]

txt_infix = {"+": "+", "-": "-", "*": txtMult, "/" : "/", ":":":", "^":"^"}
txt_postfix = {}
txt_other = {"(": "(", ")": ")"}

txt_render = Render(txt_infix, txt_postfix, txt_other)

# ------------------------
# A latex render

def texSlash(op1, op2):
    """ Tex render for / """
    if not Render.isNumerande(op1) and op1[0] == "(" and op1[-1] == ")":
        op1 = op1[1:-1]
    if not Render.isNumerande(op2) and op2[0] == "(" and op2[-1] == ")":
        op2 = op2[1:-1]
    return ["\\frac{" , op1 , "}{" , op2 , "}"]

def texFrac(frac):
    """ Tex render for Fractions"""
    return ["\\frac{" , str(frac._num) , "}{" , str(frac._denom) , "}"]

def texMult(op1,op2):
    """ Tex render for *
    Cases where \\times won't be displayed
        * nbr  letter 
        * nbr  (
        * )(
    """
    first_nbr = type(op1) in [int, Fraction]
    seg_letter = type(op2) == str and op2.isalpha()
    first_par = (first_elem(op2) == "(")
    seg_par = (last_elem(op1) == ")")

    if (first_nbr and (seg_letter or seg_par)) \
            or (first_par and seg_par):
        return [op1, op2]
    else:
        return [op1, "\\times", op2]

tex_infix = {"+": " + ", "-": " - ", "*": texMult , ":": ":", "^":"^"}
tex_postfix = {"/": texSlash}
tex_other = {"(": "(", ")": ")"}
tex_type_render = {str:str, int: str, Fraction: texFrac}

tex_render = Render(tex_infix, tex_postfix, tex_other, type_render = tex_type_render)



if __name__ == '__main__':
    #exp = [2, 5, '^', 1, '-', 3, 4, '*', ':']
    #print(txt_render(exp))
    #exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, 5, '/', ':']
    exp = [2, -3, "*"]
    print(tex_render(exp))
    #exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, '+']
    #print(post2in_fix(exp))




# -----------------------------
# Reglages pour 'vim'
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
# cursor: 16 del 

#!/usr/bin/env python # encoding: utf-8 # ------------------------ # A infix to postfix list convertor # ------------------------ # A console render Tex render for *     Cases where \\times won't be displayed         * nbr  letter          * nbr  (         * )( # ------------------------ # A latex render Tex render for / Tex render for Fractions Tex render for *     Cases where \\times won't be displayed         * nbr  letter          * nbr  (         * )( #exp = [2, 5, '^', 1, '-', 3, 4, '*', ':'] #print(txt_render(exp)) #exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, 5, '/', ':'] #exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, '+'] #print(post2in_fix(exp)) # ----------------------------- # Reglages pour 'vim' # vim:set autoindent expandtab tabstop=4 shiftwidth=4: # cursor: 16 del