import re

class Symb():
    def __init__(self, symb):
        if '^' in symb:
            self.sup = symb[symb.index('^'):symb.index('^') + 2]
            symb = symb[:symb.index('^')]
        else:
            self.sup = ''

        if '_' in symb:
            self.sub = symb[symb.index('_'):symb.index('_') + 2]
            symb = symb[:symb.index('_')]
        else:
            self.sub = ''

        if '{' in symb and '}' in symb:
            self.pre = symb[:symb.index('{') + 1]
            symb = symb[symb.index('{')+1:symb.index('}')]
        else:
            self.pre = ''

        if '\\' in symb:
            self.greek = True
            self.symb = symb[1:]
        else:
            self.greek = False
            self.symb = symb

    def __lt__(self, other):
        if other.greek and not self.greek:
            return True
        elif self.greek and not other.greek:
            return False
        else:
            return self.symb.lower() < other.symb.lower()

    def __str__(self):
        symbstr = self.pre
        if self.greek:
            symbstr +='\\'+self.symb
        else:
            symbstr += self.symb
        if self.pre:
            symbstr += '}'

        return symbstr + self.sub + self.sup

class Line():
    def __init__(self, line):
        line = line.strip('\symbline')
        self.items = line.split('}{')
        self.items[2] = self.items[2].strip('}')

        self.symb = Symb(self.items[0][1:])
        self.text = self.items[1]
        self.unit = self.items[2].strip('}\n')

    def __lt__(self, other):
        if self.symb < other.symb:
            return True
        else:
            return False

    def __str__(self):

        return '\symbline{' + str(self.symb) + '}{' + self.text + '}{' + self.unit + '}\n'

def sort_symbols(filename, to_file):
    with open(filename) as file:
        lines = [Line(line) for line in file.readlines()]

    lines.sort()

    with open(to_file, 'w') as file:
        for line in lines:
            file.write(str(line))

sort_symbols('symbols.txt', 'sorted_symbols.txt')
